Java重寫Equals()該用instanceof還是getClass()?

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

public class Student {
	private String name;
	
	@Override
	public boolean equals(Object object){
		if (object == this)
			return true;
		// 使用getClass()判斷對象是否屬於該類
		if (object == null || object.getClass() != getClass())
			return false;
		Student student = (Student)object;
		return name != null && name.equals(student.name);
}

網上流行instanceof 版本如下

public class Student {
	private String name;

	@Override
	public boolean equals(Object object){
		if (object == this)
			return true;
		// 通過instanceof來判斷對象是否屬於類
		if (object == null || !(object instanceof Student))
			return false;
		Student student = (Student)object;
		return name!=null && name.equals(student.name);
	}
}

事實上兩種方案都是有效的,區別就是getClass()限制了對象只能是同一個類,而instanceof卻允許對象是同一個類或其子類,這樣equals方法就變成了父類與子類也可進行equals操作了,這時候如果子類重定義了equals方法,那麼就可能變成父類對象equlas子類對象爲true,但是子類對象equlas父類對象就爲false了,如下所示

class GoodStudent extends Student {

    @Override
    public boolean equals(Object object) {
        return false;
    }

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

        son.setName("test");
        father.setName("test");

		// 當使用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	
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章