簡體   English   中英

學習多態和平等課程

[英]Learning polymorphism and the equals class

我目前正在閱讀多態性,並對內容感到困惑。 我的書中關於動態綁定的一點也讓我感到困惑,但是我不確定要給出什么示例,也許有些可以給出一個簡單的示例來描述動態綁定的工作原理? 我所知道的是,當在某種類型上調用method(?)時,它將調用實例所綁定的最特定的方法。

另外,當使用equals方法時,為什么用這樣的方法覆蓋Java的equals方法是一種不好的做法:

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

相對於

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

抱歉,這很混亂,我很難理解我認為至關重要的這些概念。 提前致謝。

Object類上的equals方法將一個Object作為參數。 所以這個方法

public boolean equals(Circle circle){

具有不同的簽名,因此重載equals方法; 它不會覆蓋它。 多態性的主要點是,您可以讓超類的對象引用(例如Object )引用子類的實際對象(此處為Circle ),並且可以在超類引用上調用方法,而不必關心實際類是,並調用實際實例的類的方法。

您可以有一個這樣的重載方法,但是即使您傳入的參數實際上是Circle ,但是如果您有Object引用也不會調用它。

這似乎很好地回答了您的問題:

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

這是一種不好的做法,因為重載(與覆蓋相比)可能會導致意外的行為。 假設您的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) ,因為它是Triangle類型最接近的匹配項。 真令人驚訝! ;)

我曾經寫過一篇關於多態和equals()的博客文章: Java多態和equals()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM