[英]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
引用也不會調用它。
這似乎很好地回答了您的問題:
這是一種不好的做法,因為重載(與覆蓋相比)可能會導致意外的行為。 假設您的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.