Java重写Equals()该用instanceof还是getClass()?

网上流行的getClass()版本如下

class Student {

    private String name;
    private String address;

    @Override
    public boolean equals(Object object) {
        if (object == this)
            return true;
        if (object.getClass() != getClass())
            return false;

        Student student = (Student) object;
        return getName() != null && getName().equals(student.getName());
    }
    // 为限制文章长度,忽略getter,setter方法
}

网上流行instanceof 版本如下

class Student {

    private String name;
    private String address;

    @Override
    public boolean equals(Object object) {
        if (object == this)
            return true;
        if (!(object instanceof Student)) {
            return false;
        }

        Student student = (Student) object;
        return getName() != null && getName().equals(student.getName());
    }

    // 为限制文章长度,忽略getter,setter方法
}

事实上两种方案都是有效的,区别就是getClass()限制了对象只能是同一个类,而instanceof却允许对象是同一个类或其子类,这样equals方法就变成了父类与子类也可进行equals操作了,这时候如果子类重定义了equals方法,那么就可能变成父类对象equlas子类对象为true,但是子类对象equlas父类对象就为false了,如下所示

class GoodStudent extends Student {

    @Override
    public boolean equals(Object object) {
        if (object == this)
            return true;
        if (!(object instanceof Student)) {
            return false;
        }
        Student student = (Student) object;
        return getAddress() != null && getAddress().equals(student.getAddress());   
    }

    public static void main(String[] args) {
        GoodStudent son = new GoodStudent();
        Student father = new Student();

        son.setName("test");
        son.setAddress("address1");
        father.setName("test");
        father.setAddress("address2");
        
		// 当使用instance of时
        System.out.println(son.equals(father)); // 这里为false
        System.out.println(father.equals(son)); // 这里为true

		// 当使用getClass()时
        System.out.println(son.equals(father)); // 这里为false
        System.out.println(father.equals(son)); // 这里为false	
    }
}

版权声明:本文为NEWCIH原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。