2016-04-10 44 views
-3

我已經實現了一個類點,我想看看類的對象是否相等或不使用==運算符。我研究並找到了幾個解決方案,告訴我重寫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)...

+2

這是因爲'equals'和'=='測試了不同的東西。 'equals'測試相等性(可以用每個類的自定義方式定義),'=='測試標識(不能)。 –

+2

事實上 - 你不能在Java中重載運算符。 –

+0

在這個論壇上有很多關於如何重寫equals方法的問題,以便使用==運算符爲您自己的自定義類定義相等的方法,然後不會比較地址,而是使用重寫的equals方法的實現。 – Maxincredible52

回答

0

運營商==equals方法不以任何方式相互連接。您可以(也應該)重寫equals方法來實現邏輯等式的檢查。

==運營商將始終執行檢查參考相等。這樣你可以檢查兩個對象是否不僅僅意味着同一個事物,而是實際上是同一個對象。這是設計。

1

====運算符只是對象的比較引用。你不能重載這個操作符。

你可以閱讀官方java tutorial

+0

如果他們可以閱讀這個答案,你的觀點是什麼?只是標記爲重複。 – Savior

+0

@Pillar,我在回答後添加此鏈接。我將它標記爲重複。 – IntFloat

0

==比較對象的引用。該運算符的完整規範是here