2

我目前正在阅读多态性,并且对内容感到有些困惑。我书中关于动态绑定的部分也让我很困惑,但我不确定该举什么例子,也许可以举一个简单的例子来描述动态绑定的工作原理?我所知道的是,当调用某种类型的方法(?)时,它会调用实例所绑定的最具体的方法。

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

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

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

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

4

3 回答 3

2

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

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

于 2013-09-06T23:36:52.893 回答
2

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

public boolean equals(Circle circle){

具有不同的签名,因此重载equals方法;它不会覆盖它。多态性的要点是,您可以让超类的对象引用(例如,Object)引用子类的实际对象(此处,Circle),并且您可以在超类引用上调用方法,而不关心实际类是什么是,调用实际实例的类的方法。

你可以有这样一个重载的方法,但是如果你有一个引用它就不会被调用Object,即使传入的参数确实是一个Circle.

于 2013-09-06T23:26:57.683 回答
1

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

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

  public void equals(Shape other) {
  }
}

让我们进一步假设有一个类Triangle也 extends Shape。现在,当您调用它时会发生什么:

circle.equals(triangle);

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

我曾经写过一篇关于多态的博客文章equals()Java polymorphism and equals()

于 2014-01-21T21:05:01.607 回答