Java 添加成员/设置程序时,默认“equals”的行为会发生变化吗?

Java 添加成员/设置程序时,默认“equals”的行为会发生变化吗?,java,equals,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 有人能解释这种行为吗?如果

我有一个关于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


有人能解释这种行为吗?

如果不重写Object.equals(Object),则默认实现使用对象标识进行比较。(即,仅当对象是内存中的同一对象时,equals才返回true)

相关JavaDoc:

摘录:

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


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

p1
p2
是两个不同的引用,这就是为什么。除非您有自己的
equals
方法,否则它将返回
false
。不管您是否有实例变量。

您可以发布代码吗?添加方法或字段不应影响equals方法,必须进行其他操作。添加setter方法和实例变量不会使对象相等。你一定也在做其他的改变。将你的SSCCE()发布到海报上,说明这种行为。(参见Dev的答案和我的评论。)+1到海报:这个答案是正确的。除非覆盖
等于
,否则所观察到的行为将不会偏离这一点。也许在“奇数情况”中还有其他错误,例如
p2=p1;p1.equals(p2)
,对于非null的
p1
(它不会错误地覆盖
equals
)。这是真的,但它不能完全回答OP的问题。为什么仅仅添加一个字段和一个setter会改变equals()的行为?@Lawrence我添加了一条注释,要求提供一个代码示例,因为“仅仅添加一个字段和一个setter”不会改变equals的行为。还有别的事情发生了。@pst@Dev我就是这么想的;整件事看起来很可疑。我想我没有正确阅读@pst的评论您可能需要详细说明这个答案。目前,尚不清楚它与原始问题的关系。
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'