首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

equals方法覆盖超类中的equals,可能不是对称的

equals方法覆盖超类中的equals,可能不是对称的。

在Java中,equals方法是用于比较两个对象是否相等的方法。当我们需要自定义对象的相等性判断时,通常会覆盖equals方法。

然而,当我们覆盖超类中的equals方法时,需要注意到equals方法的对称性。对称性是指如果两个对象A和B相等,那么B和A也应该相等。

然而,如果我们在子类中覆盖了超类中的equals方法,但没有正确处理超类的字段,就可能导致equals方法不是对称的。

例如,考虑以下代码:

代码语言:java
复制
class SuperClass {
    private int id;

    public SuperClass(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        SuperClass other = (SuperClass) obj;
        return id == other.id;
    }
}

class SubClass extends SuperClass {
    private String name;

    public SubClass(int id, String name) {
        super(id);
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        SubClass other = (SubClass) obj;
        return super.equals(obj) && Objects.equals(name, other.name);
    }
}

在上面的代码中,SuperClass是一个超类,SubClass是其子类。SuperClass中的equals方法只比较id字段,而SubClass中的equals方法比较id和name字段。

然而,由于SubClass中的equals方法没有调用超类的equals方法来比较id字段,就导致了equals方法不是对称的。具体来说,如果我们创建一个SuperClass对象和一个SubClass对象,它们的id相等,但name不相等,那么SuperClass对象调用equals方法比较SubClass对象会返回false,而SubClass对象调用equals方法比较SuperClass对象会返回true。

为了解决这个问题,我们应该在子类的equals方法中调用超类的equals方法来比较超类的字段。修改后的代码如下:

代码语言:java
复制
class SubClass extends SuperClass {
    private String name;

    public SubClass(int id, String name) {
        super(id);
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        SubClass other = (SubClass) obj;
        return super.equals(obj) && Objects.equals(name, other.name);
    }
}

通过调用super.equals(obj)来比较超类的字段,我们保证了equals方法的对称性。

总结起来,当覆盖超类中的equals方法时,需要注意处理超类的字段,以保证equals方法的对称性。这样可以确保在比较对象相等性时得到正确的结果。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • equals方法的理解

    通常在面试中会被问到equals方法和==的区别,以及有没有重写过equals方法,以及重写equals方法的约定是什么? 下面简单的介绍一下我的理解: 首先,在比较基本类型中==和equals方法没有任何区别。 但是在比较引用类型,如对象中 equals 是通常是比较的是对象的实例是否相同。 ==通常是比较的是对象的实例的地址是否相同即对象实例的id。这是两个最重要的区别。 其次,重写equals方法的原则或者说约定是什么,以及什么时候应该覆盖equals呢 如果类具有自己特有的“逻辑相等”概念(不等同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这个时候我们要覆盖equals方法(通常属于值类的情况)。—来自于effective Java 中文版 但是在覆盖equals方法的时候要遵守的约定如下: equals方法实现了等价的关系 1.自反性。对于任何非null的引用值x,x.equals(x)都必须返回true 2.对称性。对于任何非null的引用值x和y,当且仅当x.equals(y)返回true的时候,y.equals(x)也必须返回true 3.传递性。对于任何非null的引用值x,y和z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)也必须返回true。 4.一致性。对应任何非null的引用值x,y,只要equals比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致性的返回true或者一致性的返回false。—–来自于effective Java 中文版

    04
    领券