2010-10-16 38 views
3

我想寫的equals方法的對象比較他們的田地,如果相等,則真正的方法:的Equals的對象

public boolean equals(Ghost other){ 
     if (this.x == other.x && this.y == other.y && this.direction==other.direction && this.color==other.color) 
        return true; 
        else 
        return false; 
} 

會是什麼問題呢?

+1

@fprime:你只需要一個return語句,而不需要'if'。 ;-) – 2010-10-16 19:33:29

+1

打印出個人的結果,如果短語(例如'this.x == other。在if語句之前。看哪一個失敗。 – 2010-10-16 19:34:58

+0

被比較的任何變量對象類型,而不是原始類型? – 2010-10-16 19:35:03

回答

7

我看着one of your previous questions,它似乎color字段是Color。我會假設你沒有改變那個領域的類型。

這是一個類,因此是一個引用類型,這意味着您需要使用equals()或類似的方法來比較顏色(我之前沒有使用過這個類,所以我不能準確地告訴你哪種方法使用)。

if (/* ... && */ this.color.equals(other.color)) { 

正如評論,使用==比較引用類型確實比較Java中的內存地址。如果它們都指向內存中的同一對象,它將僅返回true


編輯:akf points out,你需要使用基Object類的參數,否則你不重寫Object.equals(),但實際上超載,即提供調用同名方法的不同方式。如果偶然碰巧傳遞了完全不同類的對象,可能會發生意外的行爲(不過,如果它們屬於不同的類,它將會正確返回false)。

@Override 
public boolean equals(Object obj) { 
    if (!(obj instanceof Ghost)) 
     return false; 

    // Cast Object to Ghost so the comparison below will work 
    Ghost other = (Ghost) obj; 

    return this.x == other.x 
     && this.y == other.y 
     && this.direction == other.direction 
     && this.color.equals(other.color); 
} 
+0

啊,沒問題。我已經創建了一個equals方法,所以我只是用它在顏色領域,現在它的工作:)謝謝 – Snowman 2010-10-16 19:38:50

4

原則上,這看起來很好。

但請注意,您正在使用==進行比較。對於基元來說,這不成問題,但對於對象來說,它將檢查相同的實例,而不是相同的值。這可能是也可能不是你想要的。如果您正在比較java.lang.Strings,你想用equals來代替(並檢查null)。

3

如果比較對象變量而不是原始類型,則應該使用this.color.equals(other.color)比較。

就你而言,它也取決於你如何創建Color對象。如果你使用了靜態實例(比如Color.BLUE),那麼實際上,它應該沒有關係。如果您從rgb值創建Color對象,那麼它肯定很重要。無論哪種方式,最好習慣使用.equals()作爲對象變量。

3

需要考慮的一件事是,當您更改參數類型時,您不會覆蓋Object中的equals方法。您可能會發現這種方法不會像您所期望的那樣在所有情況下使用。相反的:

public boolean equals(Ghost other){ 

你應該有:

public boolean equals(Object other){ 

,然後在內部測試other PARAM是否爲instanceofGhost和塑像作爲necessry。

+0

+1尼斯趕上那裏。我是否應該修復我的答案,因爲就其本身而言,我的答案的第二部分是不正確的? – BoltClock 2010-10-16 19:53:01

+0

是的,加一個更完整的答案。 – akf 2010-10-16 19:56:14

相關問題