学习多态和等于类

时间:2013-09-06 23:22:44

标签: java

我正在阅读有关多态性的内容,并且对内容感到困惑。我书中关于动态绑定的一点对我来说也很混乱,但是我不确定要给出什么样的例子,或许可以给出一个简单的例子来描述动态绑定是如何工作的?我所知道的是,当在某种类型上调用方法(?)时,它将调用该实例所绑定的最具体的方法。

另外,当使用equals方法时,为什么用这样的方法覆盖java的equals方法是不好的做法:

public boolean equals(Circle circle){
return this.radius == circle.radius;
}

而不是

 public boolean equals(Object circle){
return this.radius == ((Circle)circle).radius;
}

对不起,如果这有点混乱,我很难理解这些我认为至关重要的概念。提前谢谢。

3 个答案:

答案 0 :(得分:2)

equals类上的Object方法将Object作为参数。所以这个方法

public boolean equals(Circle circle){

具有不同的签名,因此重载 equals方法;它不会覆盖它。多态的主要观点是你可以有一个超类的对象引用(比如说,Object)引用一个子类的实际对象(这里是Circle),你可以调用一个方法超类引用,不关心实际的类是什么,并且调用实际实例的类的方法。

您可以使用这样的重载方法,但如果您有Object引用,则不会调用它,即使传入的参数实际上是Circle

答案 1 :(得分:2)

这似乎很好地回答了你的问题:

http://www.artima.com/lejava/articles/equality.html

答案 2 :(得分:1)

这是不好的做法,因为重载(与覆盖相比)等于可能会导致意外行为。假设你的Circle类有这个基类:

class Shape {
  @Overrides
  public void equals(Object other) {
  }

  public void equals(Shape other) {
  }
}

让我们进一步假设有一个类Triangle,它也扩展了Shape。现在,当你这样称时会发生什么:

circle.equals(triangle);
将调用

Shape.equals(Shape),而不是Circle.equals(Object),因为它是三角类型最接近的匹配。这太令人惊讶了! ;)

我曾写过一篇关于多态性和equals()的博文:Java polymorphism and equals()