一、介紹
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 + "在逛街");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500955.html
標籤:其他
下一篇:idea永久激活教程(新版)
