我对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。
有人可以解释这种行为吗?
答案 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)
p1
和p2
是两个不同的引用,这就是原因。除非您拥有自己的false
方法,否则它将返回equals
。如果你有实例变量也没关系。