Equals方法False对于相同的对象

时间:2017-06-11 17:47:41

标签: java

import java.io.*;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Dog dog1 = new Dog();
        Dog dog2 = new Dog();

        System.out.println(dog2.equals(dog1));

    }

    public static class Dog{

    }
}

对象是相同的,但equals方法表示它是假的。为什么?这不是真的吗?班级是空的。提前致谢

5 个答案:

答案 0 :(得分:2)

我建议您查看文档:{​​{3}}

  

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

因为您没有重写.equals(Object)方法并提供了更宽松的等价测试,所以调用了.equals(...)的超类(即Object类)版本。因为dog1dog2指的是占用不同内存空间的不同对象,所以默认情况下它们不等同。你必须提供自己的等效测试来克服这一点。

答案 1 :(得分:1)

如果您没有覆盖equals类的Dog方法,则它会返回Object类的方法,该方法会比较对象的地址。您有两个Dog个实例,因此有两个不同的地址,因此它们不相等。

答案 2 :(得分:0)

您应该阅读Object equals方法的javadoc。默认情况下,这些对象的方法不一样;你需要覆盖它才能让它返回true。

答案 3 :(得分:0)

类Dog不会覆盖默认的equals方法,因此默认值将适用(基本上是==),因为dog1和dog2是Dog的两个独立实例,这将是假的。

如果您希望能够以不同的方式区分,则应覆盖equals方法并将比较逻辑放入其中。

答案 4 :(得分:0)

每次在初始化时使用 new 关键字,都意味着新实例。两个不同的对象实例可以相同或不同,具体取决于您的类的相同定义。默认的等于方法定义会比较内存地址,在这种情况下会有所不同。