因为 这是 两个 不同的 A 类 的实例对象, A 类 没有覆写 equals 方法,那默认引用的就是 父类 Object 的 equals
可以看一下源码【如下图所示】:
这里是用 == 比较,也就是 比较的对象的地址, 两个不同的实例对象,所在的内存地址肯定是不一样的,所以返回false
需要重写equal方法
借鉴ChatGPT回答:
这是因为在Java中,默认情况下对象的equals()方法是比较对象的引用(内存地址)是否相同。
当我们使用new关键字创建对象时,会在堆内存中开辟一块内存空间,这个空间的地址存放在对应的对象引用(obj1和obj2)中。而obj1和obj2是两个不同的对象,它们的内存地址肯定不同,所以默认的equals()方法返回false。
举个例子:
java
public class A {
public boolean equals(Object obj) {
return this == obj;
}
}
public class Test {
public static void main(String[] args) {
A obj1 = new A();
A obj2 = new A();
System.out.println(obj1.equals(obj2)); // false
}
}
要让他们比较内容而不是引用,需要 override equals()方法,比较对象的属性:
java
public class A {
private String name;
public A(String name) {
this.name = name;
}
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (this.getClass() != obj.getClass()) return false;
A other = (A) obj;
return this.name.equals(other.name);
}
}
public class Test {
public static void main(String[] args) {
A obj1 = new A("John");
A obj2 = new A("John");
System.out.println(obj1.equals(obj2)); // true
}
}
现在obj1.equals(obj2)返回true,因为我们比较了name属性,发现它们相同。