我已經實現了一個類點,我想看看類的對象是否相等或不使用==運算符。我研究並找到了幾個解決方案,告訴我重寫Object的equals方法。我讀了,但==運營商仍然無法正常工作。如果我使用p1.equals(p2)它雖然工作。誰能告訴我我做錯了什麼?我甚至試圖重寫hashCode方法,即使我不打算在容器中使用Point。==運算符無法與覆蓋等於方法
實施點:
public final class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object other) {
if (!(other instanceof Point)) {
return false;
}
Point that = (Point) other;
return this.x == that.x && this.y == that.y;
}
@Override
public int hashCode() {
return x + y; //just for testing, equal objects should return same hash?
}
@Override
public String toString() {
return "(" + x + "," + y + ")";
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
我的測試類:
public class Test {
public static void main(String[] args) {
Point p1 = new Point(1,2);
Point p2 = new Point(1,2);
if(p1.equals(p2)) {
System.out.println("equal");
} else {
System.out.println("not equal");
}
if(p1 == p2) {
System.out.println("equal");
} else {
System.out.println("not equal");
}
System.out.println(p1);
}
}
輸出爲:
equal
not equal
(1,2)
所以重寫toString方法似乎工作,但是這不會是唯一的事情工作是==運營商本身。我試圖添加一個sout重寫的equals方法,它只會顯示它的消息時,我直接執行等於方法由p2.equals(p2)...
這是因爲'equals'和'=='測試了不同的東西。 'equals'測試相等性(可以用每個類的自定義方式定義),'=='測試標識(不能)。 –
事實上 - 你不能在Java中重載運算符。 –
在這個論壇上有很多關於如何重寫equals方法的問題,以便使用==運算符爲您自己的自定義類定義相等的方法,然後不會比較地址,而是使用重寫的equals方法的實現。 – Maxincredible52