2017-04-21 35 views
-2

我只是想了解等於方法。我推翻在一個自定義的類此方法只是爲了看的行爲,而是得到了內存不足的錯誤,由於無限loop.I知道重寫合同equals方法 1)自反性 2)對稱性 3)傳遞 4)一致 5)對於任何空引用,它必須由於等於方法實現而導致無限循環的OutOfMemoryError

public class Reflexivity 
{ 
    public static void main(String[] args) { 
    Reflexivity reflexivity = new Reflexivity(); 
    Reflexivity reflexivity1 = new Reflexivity(); 
    System.out.println(reflexivity.equals(reflexivity1)); 
    } 
@Override 
public boolean equals(Object obj) { 
    if (obj == this) { 
      return true; 
     } 
    if (!(obj instanceof Reflexivity)) { 
      return false; 
     } 
    // TODO Auto-generated method stub 
    return this.equals(obj); 
} 
} 
+2

你的'this.equals(obj)'導致無限循環 – Oswald

+4

我只想指出你應該得到一個'StackOverflowError'而不是'OutOfMemoryError'。如果創建對象,您將只能獲得OOME。沒有任何東西是由你的「equals」方法創建的。 –

回答

0

您遞歸調用equals方法返回false。在沒有任何終止條件的情況下,它會導致無限循環。

由於第一個和第二個if語句返回false,它最終每次都調用它自己,因此是一個無限循環。

1

你的執行是無稽之談!

如果你有兩個不同的Reflexivity對象,那麼你只會永遠呼叫equals(或者你內存不足等)。

在某些時候你確實需要編寫一些代碼來決定,如果兩個對象相等或不...

+0

...並且鑑於他已經定義了「Reflexivity」沒有狀態,唯一的兩個(理智的)實現是「全部相等」,「所有不同的實例都是不相等的」。 –

+0

@StephenC我認爲它有一些狀態,這裏沒有顯示。如果不是那麼你的權利。 – John3136

0

聲明this.equals(obj)導致無窮遠recursiv循環,一次又一次地呼喚equals()。由於你的班級沒有任何狀態,Object.equals()的行爲正是你所需要的。因此根本不要覆蓋equals()

相關問題