一、介紹 instanceof是在多態中引出的,因為在多態發生時,子類只能調用父類中的方法(編譯時類型的方法),而子類自己獨有的方法(運行時類型的方法)無法調用,如果強制調用的話就需要向下轉型,語法和基本類型的強制類型轉換一樣;但是向下轉型具有一定的風險,很有可能無法成功轉化,為了判斷能否成功轉化, ...
一、介紹
instanceof是在多態中引出的,因為在多態發生時,子類只能調用父類中的方法(編譯時類型的方法),而子類自己獨有的方法(運行時類型的方法)無法調用,如果強制調用的話就需要向下轉型,語法和基本類型的強制類型轉換一樣;但是向下轉型具有一定的風險,很有可能無法成功轉化,為了判斷能否成功轉化,就需要 instanceof 先進行一個判斷,然後再進行轉換操作。
二、語法
引用類型變數(object) instanceof 類(class)
三、理解
通俗點就是:什麼什麼…是否是…什麼什麼;
判斷前面的對象是否屬於後面的類,或者屬於其子類,如果是就返回 true,若不是則返回 false。
四、註意事項
instanceof前面的引用變數編譯時的類型要麼與後面的類型相同,要麼與後面的類型具有父子繼承關係;
只要是向下轉型,一定要先用instanceof繼續判斷後,再進行轉換!
五、總結
instanceof總的來說就是在向下轉型中必須使用的,可以保證自己代碼的健壯性;
所以向下轉型步驟是:先判斷(instanceof),再轉換(type)
六、案例
- 案例一
Object test01 = "Java"; // test實際類型是String,但是Object是所有類的父類 System.out.println(test01 instanceof Object); // 返回true ,因為test編譯時時Object類,test可以是Object類實例 System.out.println(test01 instanceof String); // 返回true ,因為Object是String的父類,test可以是String類的實例 System.out.println(test01 instanceof Math); // 返回false ,因為Object是Math的父類,但是test不是Math類的實例 // 不符合instanceof語法規則: String test02 = "Java"; // test02是String類 System.out.println(test02 instanceof Math); // 編譯出錯,String類和Math類無繼承關係
- 案例二
/**
* 在多態中的使用
*/
public class PolymorphismTest02 {
public static void main(String[] args) {
//此處發生多態
Person s = new Students("學生小明");
Person t = new Teachers("老師小紅");
s.classes();
s.doWork();
// 無法調用students特有的方法,這時需要向下轉型
// s.playing();
trans(s);
// 同理Teachers
t.classes();
t.doWork();
// 也無法調用teachers特有的方法,這時需要向下轉型
// t.shopping();
trans(t);
}
// 這個函數能很好的體現出為什麼需要用instancof,
// 因為你不能確定傳入函數的參數到底是Teachers還是Students
public static void trans(Person p) {
if (p instanceof Students) {
Students s2 = (Students)p;
// 通過向下轉型便可以調用Students特有方法了
s2.playing();
}
else if (p instanceof Teachers) {
Teachers t2 = (Teachers)p;
t2.shopping();
}
}
}
// 抽象一個人類作為父類
class Person {
String name;
public void classes() {}
public void doWork() {}
}
// 學生類
class Students extends Person {
Students(String myName) {
this.name = myName;
}
// 子類重寫父類方法,覆蓋了父類方法
public void classes() {
System.out.println(this.name + "在聽課");
}
// 子類重寫父類方法,覆蓋了父類方法
public void doWork() {
System.out.println(this.name + "在寫作業");
}
// 子類獨有方法
public void playing() {
System.out.println(this.name + "在玩游戲");
}
}
// 老師類
class Teachers extends Person {
Teachers(String myName) {
this.name = myName;
}
// 子類重寫父類方法,覆蓋了父類方法
public void classes() {
System.out.println(this.name + "在上課");
}
// 子類重寫父類方法,覆蓋了父類方法
public void doWork() {
System.out.println(this.name + "在改作業");
}
// 子類獨有方法
public void shopping() {
System.out.println(this.name + "在逛街");
}
}