java中 instanceof 的用法
引言
instanceof 概念在多態中引出,因為在多態發生時,子類只能調用父類中的方法(編譯時類型的方法),而子類自己獨有的方法(運行時類型的方法)無法調用,如果強制調用的話就需要向下轉型,語法和基本類型的強制類型轉換一樣;但是向下轉型具有一定的風險,很有可能無法成功轉化,為了判斷能否成功轉化,就需要 instanceof 先進行一個判斷,然后再進行轉換操作;
instanceof 基本介紹
instanceof 是一個運算符,語法為:
引用類型變量(object) instanceof 類(class)功能:
判斷前面的對象是否屬于后面的類,或者屬于其子類;
如果是,返回 true,不是返回 false;
注意事項:
使用 instanceof 時需要保證:
instanceof 前面的引用變量編譯時的類型要么與后面的類型相同,要么與后面的類型具有父子繼承關系
例如:
其實對于instanceof 可以理解為:什么什么…是否是…什么什么
下面看一個測試代碼:
// 抽象一個人類作為父類 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 + "在逛街");} } 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);// 同理Teacherst.classes();t.doWork();trans(t);}// 這個函數能很好的體現出為什么需要用instancof,// 因為你不能確定傳入函數的參數到底是Teachers還是Studentspublic 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();}} }輸出結果:
學生在聽課 學生在寫作業 學生在玩游戲 老師在上課 老師在改作業 老師在逛街看完這個代碼,你應該明白為什么需要instanceof了吧;
因為在實際開發中,如果需要向下轉型的話,你無法保證你所要轉換的可以成功,所以一定要記住:
只要是向下轉型,一定要先用instanceof判斷,再進行轉換!!!!切記
這樣你的代碼就不會出現各種奇怪的bug了,這也是一個優秀的程序員應該掌握的;
總結
instanceof總的來說就是在向下轉型中必須使用的,可以保證自己代碼的健壯性;
所以向下轉型步驟是:先判斷(instanceof),再轉換(type)
總結
以上是生活随笔為你收集整理的java中 instanceof 的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [JAVA基础] 了解构造器Constr
- 下一篇: Java中的关键字——final