2017-06-11 28 views
-1
import java.io.*; 
import java.util.Scanner; 

public class Main { 

    public static void main(String[] args) { 

     Dog dog1 = new Dog(); 
     Dog dog2 = new Dog(); 

     System.out.println(dog2.equals(dog1)); 

    } 

    public static class Dog{ 

    } 
} 

對象相同,但equals方法表示其爲false。爲什麼?這是不是真的?類是空的。提前致謝等於方法False對於同一個對象

+0

也許你應該閱讀equals方法的Javadoc。 – Eran

+0

他們不是同一個對象。 –

回答

2

我勸你看到的文檔:https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

的等於Object類的方法實現對象上差別可能性最大的相等關係;也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象(x == y的值爲true)時,此方法返回true。

因爲還沒有重寫的.equals(Object)方法和提供較寬鬆的等價測試,超類(即,對象類)的.equals(...)版本被調用。由於dog1dog2涉及佔用不同內存空間的不同對象,因此默認情況下它們不相同。您必須提供自己的等效性測試來克服這一點。

+0

但爲什麼它會返回true? public static void main(String [] args)// init(); // System.out.println(Staticvar.count); //狗狗=新狗(); // System.out.println();狗狗1 =新狗(「1」); 狗dog2 =新狗(「1」); System.out。的println(dog1.name.equals(dog2.name)); } public static class Dog { private String name; public狗(String name){ this.name = name; } } } –

+0

@ArtemZaichikov,我會冒險猜測,因爲您在這種情況下提供的是對象數據,您的編譯器或IDE會自動生成一個'.equals(...)'方法依賴於String類的'.equals(...)'方法。我可能會誤解,但在我看來,這似乎是唯一合理的解釋。 – SpencerD

0

您應該閱讀Object equals方法的javadoc。這些對象與方法的默認行爲不一樣;您需要重寫它才能使其返回true。

1

如果您不覆蓋Dog類的equals方法,它將回退類比Object類的方法,該類比較對象的地址。你有兩個實例Dog,所以有兩個不同的地址,所以它們不相等。

+0

但「==」表示地址,等於表示對象的數據。我無法理解 –

+0

@ArtemZaichikov,默認情況下,因爲超類「對象」不知道你的對象數據,它執行最具歧視性的測試;即它回落到基本進行'=='比較。諸如Strings和其他內置類的東西可以將對象數據與'.equals(...)'進行比較的唯一原因是它們提供了覆蓋方法,在該方法中,該對象類型的自定義代碼對對象數據執行等效性測試。 – SpencerD

+0

@ArtemZaichikov正如SpencerD所說,「equals」的默認配置與'=='相同。你應該看看'equals'的實現。 – Nathan

0

Dog類不會覆蓋默認的equals方法,所以默認會應用(基本上==),而dog1和dog2是Dog的兩個單獨實例,這將是錯誤的。

如果您希望能夠以不同的方式進行區分,您應該重寫equals方法並將其中的比較邏輯放在其中。

0

每次在初始化時使用新的關鍵字時,它表示新實例。根據您的類的相同定義,兩個不同的對象實例可以相等或不相等。默認的等於方法定義比較存儲器地址,在這種情況下這將是不同的。