添加成员/设置者时,默认“等于”的行为会发生变化吗?

时间:2011-05-01 05:10:14

标签: java equals

我对Java“equals”方法有疑问。

我创建了一个名为Person的类:

public class Person {

}

我正在比较两个对人的引用。

Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1.equals(p2));     //returns false

如果我添加任何实例变量和setter方法来设置实例变量,那么“equals”方法将返回true。

有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:14)

如果不覆盖Object.equals(Object),则默认实现使用对象标识进行比较。 (即如果对象与内存中的对象相同,则equals仅返回true。)

相关JavaDoc:Object.equals

摘录:

  

类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。

Object a = new Object();
Object b = new Object();
System.out.println(a.equals(b)); // Prints 'false'
b = a;
System.out.println(a.equals(b)); // Prints 'true'

正如我在其中一篇评论中所提到的,方法或字段的添加不应影响equals方法的默认实现,还必须进行其他操作。

答案 1 :(得分:-2)

p1p2是两个不同的引用,这就是原因。除非您拥有自己的false方法,否则它将返回equals。如果你有实例变量也没关系。