为什么obj1.equals(obj2)是false呀

img


为什么obj1.equals(obj2)是false呀,它们不都是空的吗?

因为 这是 两个 不同的 A 类 的实例对象, A 类 没有覆写 equals 方法,那默认引用的就是 父类 Object 的 equals
可以看一下源码【如下图所示】:
这里是用 == 比较,也就是 比较的对象的地址, 两个不同的实例对象,所在的内存地址肯定是不一样的,所以返回false

img

需要重写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属性,发现它们相同。