我正在阅读有关多态性的内容,并且对内容感到困惑。我书中关于动态绑定的一点对我来说也很混乱,但是我不确定要给出什么样的例子,或许可以给出一个简单的例子来描述动态绑定是如何工作的?我所知道的是,当在某种类型上调用方法(?)时,它将调用该实例所绑定的最具体的方法。
另外,当使用equals方法时,为什么用这样的方法覆盖java的equals方法是不好的做法:
public boolean equals(Circle circle){
return this.radius == circle.radius;
}
而不是
public boolean equals(Object circle){
return this.radius == ((Circle)circle).radius;
}
对不起,如果这有点混乱,我很难理解这些我认为至关重要的概念。提前谢谢。
答案 0 :(得分:2)
equals
类上的Object
方法将Object
作为参数。所以这个方法
public boolean equals(Circle circle){
具有不同的签名,因此重载 equals
方法;它不会覆盖它。多态的主要观点是你可以有一个超类的对象引用(比如说,Object
)引用一个子类的实际对象(这里是Circle
),你可以调用一个方法超类引用,不关心实际的类是什么,并且调用实际实例的类的方法。
您可以使用这样的重载方法,但如果您有Object
引用,则不会调用它,即使传入的参数实际上是Circle
。
答案 1 :(得分:2)
这似乎很好地回答了你的问题:
答案 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()