[Java] 類 Object 的 equals 方法
阿新 • • 發佈:2018-12-10
類Object
是所有Java
類的基類,Object
類含有一個方法equals
,預設實現是:
public boolean equals(Object obj) {
return (this == obj);
}
預設比較兩個引用變數是否指向同一個物件。
使用者自定義類應該重寫這個方法,以比較兩個不同物件的內容是否相同。
很多Java 類都重寫了這個equals
方法,例如java.lang.String
和java.util.Date
,以比較兩個物件是否內容相同。
比較操作符 ==
強於 equals
,因為==
用於比較兩個原始資料型別是否有相同的值,或者兩個變數是否指向相同的物件。而假若equals
equals
就是用於比較兩個物件是否有相同的內容。
下面的例子,如果Circle
為Case 1, 輸出false
,如果為Case 2, 輸出true
, Case 1 中的equals
非重寫,加@Override
會出錯,main
中的equals
呼叫Object
中的equals
,會繞過Case 1中的equals
方法, 只有Case 2 的equals
才是正確的過載。簡而言之,如果重寫equals
方法,equals
的引數型別必須是基類Object
。
public class Test {
public static void main(String[] args) {
Object circle1 = new Circle();
Object circle2 = new Circle();
boolean x = circle1.equals(circle2);
// boolean x = ((Circle)circle1).equals((Circle)circle2); //for Case 1
System.out.println(x);
}
}
// Case 1:
class Circle {
double radius;
//@Override
public boolean equals( Circle circle) {
return this.radius == circle.radius;
}
}
// Case 2:
class Circle {
double radius;
@Override
public boolean equals(Object circle) {
return this.radius == ((Circle)circle).radius;
}
}
Introduction to Java Programming 10.th edition 11.10