Java繼承中的一些關係——instanceof和equals

記錄一下看過的東西:

1.instanceof

public class Foot {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class Apple extends Foot {

    private String color;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}


Foot foot=new Apple();
Foot foot1=new Foot();
Apple apple=new Apple();
((Apple) foot).setColor("green");

if (foot instanceof Apple){
     System.out.println("33333");
     System.out.println(((Apple) foot).getColor());
}

if (foot1 instanceof Apple){
     System.out.println("444444");
}

if (apple instanceof Foot){
     System.out.println("55555");
}

輸出結果:

類及其子類都是其實例,能通過instanceof的校驗。

2.抽象類

public abstract class Animal {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public abstract void getDescroption();
}

public class Dog extends Animal {
    @Override
    public void getDescroption() {
        System.out.println("this is a dog");
    }
}

Animal animal=new Dog();
animal.getDescroption();

輸出結果:

定義抽象類的實例實際上是抽象類實現類的實例,在調用抽象方法時,實際上是調用的子類對象中的方法。

可以看出抽象方法一個很重要的角色就是佔位,一是保證了實現類一定實現具體方法,二是使用變量animal調用子類對象中的方法實現,編譯只允許調用在類中聲明的方法。

如果省略了抽象方法的定義,實際上變成了只存在從屬關係的父子類。

3.equals方法

在Object中,這個方法將判斷兩個對象是否具有相同的引用。(參考前面的值傳遞,對象參數傳遞的是地址的拷貝)

Object是所有類的超類,如果想比較自己創建的類,如姓名,年齡等數據一致,就認爲是同一Cat,此時就需要重寫equals方法。

public class Cat {
    private int age;
    private String name;
    private boolean tag;

    @Override
    public boolean equals(Object o) {
        //實參o傳遞的是地址值的副本
        //檢測this和o是否引用同一個對象
        if (this == o) return true;
        //檢測o是否爲null,或者this和o是否屬於同一個類
        if (o == null || getClass() != o.getClass()) return false;
        //將o轉換爲Cat類型
        Cat cat = (Cat) o;
        //判斷實例域數據是否匹配
        return age == cat.age &&
                tag == cat.tag &&
                Objects.equals(name, cat.name);
    }
}

如果Cat的所有子類不變,可以用 ! (o instanceof Cat) 代替getClass != o.getClass(),數據一致的情況下所有的子類也可以通過equals判斷。這是特殊情況,建議不要使用——違反equals的對稱性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章