2015-10-18 111 views
-2
class A 
{ 
    int a=10,b=10,c=10; 
} 
class Equals 
{ 
    public static void main(String s[]) 
    { 
    A a,b; 
    a=new A(); 
    b=new A(); 
    if(a.equals(b)) 
     { 

     System.out.println("We r same..."); 
     } 
    else 
     { 

      System.out.println("We r not same..."); 

     } 
    } 
} 

爲什麼此代碼不打印輸出爲we r same
我無法理解這個程序背後的邏輯。在java中如何工作?

+2

的【如何equals()方法的工作原理]可能的複製(http://stackoverflow.com/questions/16089282/how-equals-method-works) – ControlAltDel

回答

1

默認情況下,equals方法將返回兩個對象是否實際相同。在你的情況下,他們是不同的,因此輸出。

你可以這樣看待 - 你沒有告訴你對象A的「平等」是什麼。

解決問題的方法是爲您的A類實施equals方法。

0

java中的Equals()比較對象,看看它們是否有相同的對象。你創建的兩個對象有不同的引用,所以equals不會返回true。第一次誤讀這個。

0

equals是從object繼承的方法,您可以根據需要覆蓋它。

class A 
{ 
    public int a=10,b=10,c=10; 
    public boolean equals(Object a){ 
    if(a == null) return false; 
    if(!(s instance A)) return false; 
    A other = (A)a; 
    if(other.a == this.a && other.b = this.b && other.c == other.c) 
     return true; 
    return false; 
    } 
} 

參見Overriding the java equals() method quirk

0

a和b是A類的不同實例。爲什麼你認爲它們應該相等,因爲它們具有相同的類別?

您應該重寫類A中的equals方法來實現您自己的邏輯,以確定類A的兩個實例是否彼此相等。例如:

public boolean equals(Object o) { 
     if (o==null) return false; 
    A o2 = (A) o; 
    return this.a == o2.a && this.b == o2.b && this.c == o2.c; 
} 
1

這是因爲'=='運算符只檢查兩個對象是否引用相同的內存。如果兩者都引用相同的位置,則返回true。

對於前:a=new A(); b=a;

然後,== b返回true,因爲兩者都指向同一個位置。

+0

等於什麼? –

+0

等於也做同樣的事情。但是在String類中它被覆蓋。這就是爲什麼它會檢查String對象的值而不是它們的內存引用。 – Ambika

+0

我剛剛給你一個String類的例子。你可以在你的類中覆蓋equals()。這個函數是由JAVA專門構建的,因爲運算符重載不在JAVA中。 – Ambika

2

這些對象是不一樣的,因爲你檢查引用相等。您必須使用equals()方法。

添加到您的class A

@Override 
    public boolean equals(Object obj) { 
     // TODO Auto-generated method stub 
     A ref = (A)obj; 
     return ref.a == this.a && ref.b == this.b && ref.c == this.c ; 
    } 

,而不是寫a==b檢查和a.equals(b)