2014-11-15 60 views
-1

所以我知道這是廣泛討論和討論的,我只是試圖讓我的平等爲Shapes工作。我創建了一個類Shape,它說明了什麼類型的Shape(即矩形,三角形,圓形),如果它們的形狀相同,我試圖返回true。在Java中爲我的對象實現Equals和hashCode

在主要用於測試...

Rectangle myRect = new Rectangle(3,5); 
Rectangle myRect2 = new Rectangle(3,5); 
    if (myRect==myRect2){    
      System.out.println("Both the objects are equal"); 
     }   
     else { 
      System.out.println("Both the objects are not equal"); 
     } 

,並覆蓋equals和hashCode我的實際形狀類。

abstract class Shape 
{ 
abstract double area(); 

    public Shape getShape(){ 
    return shape; 
    } 

@Override 
    public boolean equals(Object other) { 
    if (other == this) return true; 
    if (other == null) return false; 
    if (getClass() != other.getClass()) return false; 
    Shape shape = (Shape)other; 
    return(other==this); 
    } 

    @Override 
    public int hashCode() { 
     return shape.hashCode(); 
    } 

基本上,我一直得到錯誤作爲我的輸出,任何見解將有幫助,謝謝!

+1

你覺得呢'其他== this'呢? –

+1

你認爲'myRect == myRect2'呢? –

+0

您可能想要結帳http://www.ideyatech.com/2011/04/effective-java-equals-and-hashcode/。 –

回答

2

myRect==myRect2只有當它們是相同的對象時才返回true。你應該使用myRect.equals(myRect2);

1

在Java中,當涉及到對象時,使用==表示檢查對象的地址值。讓我用一個例子來說明這一點:

Rectangle objA = new Rectangle(3,5); 
Rectangle objB = objA; 

這裏objA是在存儲位置一個objB點創建存儲位置一個,或者objA已創建。這意味着兩個存儲位置都是相同的,這意味着objA == objB將返回true。

但在另一種情況:

Rectangle objC = new Rectangle(3,5); 
Rectangle objD = new Rectangle(3,5); 

你可能會說,哦,它們都具有相同的寬度和高度一樣,他們必須是相同的對象。但是看,這並非如此,因爲objC是內存位置ÇobjD是內存位置d創建創建的,因爲他們每個人都配有獨立new(構造函數)調用創建。在這種情況下的內存位置是不同的,這意味着objC == objD將返回false。

內存位置不是這樣命名的,我只是用它來更容易地描述我的例子。


當你想使用.equals法你所想的權利,這就是Java是用來比較兩個對象不僅僅是他們的地址更深。但是在自定義類中,用戶需要定義這種方法的工作方式,當兩個對象相等時,不相等時。

但是您的.equals實現有點故障。

該行檢查對象other是否指向內存位置this

if (other == this) return true; 

但後來,你有這兩條線:

Shape shape = (Shape)other; 
return(other==this); 

你沒有做任何與形狀對象,那爲什麼還要創建它,它只是讓垃圾收集更多的工作。而且return other==this有點多餘,因爲如果前面的行返回true,那麼這裏只有返回false的可能性,所以這個檢查只是更復雜的版本return false


當你使用抽象類,後來被其他派生類擴展,你應該實現在每個這些類的.equals方法。從你的案例中可以看出,你可能想要比較兩個矩形,而不是兩個圓圈,對吧?

而不是使用一個通用的.equals方法,坦率地說,它不比使用==運算符更好,您應該爲每個派生類實現它。

我不知道你Rectangle類究竟什麼樣子,但我會試試看:

public boolean equals(Object other) { 
    if (other == this) return true; 
    if (other == null) return false; 
    if (getClass() != other.getClass()) return false; 
    Rectangle rect = (Rectangle) other; 
    // compare measures of this and other Rectangle 
    return width == rect.width && height == rect.height; 
} 
相關問題