2015-10-18 104 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)