java中 instanceof 的用法
引言
instanceof 概念在多態(tài)中引出,因?yàn)樵诙鄳B(tài)發(fā)生時(shí),子類只能調(diào)用父類中的方法(編譯時(shí)類型的方法),而子類自己獨(dú)有的方法(運(yùn)行時(shí)類型的方法)無(wú)法調(diào)用,如果強(qiáng)制調(diào)用的話就需要向下轉(zhuǎn)型,語(yǔ)法和基本類型的強(qiáng)制類型轉(zhuǎn)換一樣;但是向下轉(zhuǎn)型具有一定的風(fēng)險(xiǎn),很有可能無(wú)法成功轉(zhuǎn)化,為了判斷能否成功轉(zhuǎn)化,就需要 instanceof 先進(jìn)行一個(gè)判斷,然后再進(jìn)行轉(zhuǎn)換操作;
instanceof 基本介紹
instanceof 是一個(gè)運(yùn)算符,語(yǔ)法為:
引用類型變量(object) instanceof 類(class)功能:
判斷前面的對(duì)象是否屬于后面的類,或者屬于其子類;
如果是,返回 true,不是返回 false;
注意事項(xiàng):
使用 instanceof 時(shí)需要保證:
instanceof 前面的引用變量編譯時(shí)的類型要么與后面的類型相同,要么與后面的類型具有父子繼承關(guān)系
例如:
其實(shí)對(duì)于instanceof 可以理解為:什么什么…是否是…什么什么
下面看一個(gè)測(cè)試代碼:
// 抽象一個(gè)人類作為父類 class Person {String name;public void classes() {}public void doWork() {} } // 學(xué)生類 class Students extends Person {Students(String myName) {this.name = myName;}// 子類重寫父類方法,覆蓋了父類方法public void classes() {System.out.println(this.name + "在聽(tīng)課");}// 子類重寫父類方法,覆蓋了父類方法public void doWork() {System.out.println(this.name + "在寫作業(yè)");}// 子類獨(dú)有方法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 + "在改作業(yè)");}// 子類獨(dú)有方法public void shopping() {System.out.println(this.name + "在逛街");} } public class PolymorphismTest02 {public static void main(String[] args) {//此處發(fā)生多態(tài)Person s = new Students("張三");Person t = new Teachers("李四");s.classes();s.doWork();// 無(wú)法調(diào)用students特有的方法,這時(shí)需要向下轉(zhuǎn)型//s.playing();trans(s);// 同理Teacherst.classes();t.doWork();trans(t);}// 這個(gè)函數(shù)能很好的體現(xiàn)出為什么需要用instancof,// 因?yàn)槟悴荒艽_定傳入函數(shù)的參數(shù)到底是Teachers還是Studentspublic static void trans(Person p) {if (p instanceof Students) {Students s2 = (Students)p;// 通過(guò)向下轉(zhuǎn)型便可以調(diào)用Students特有方法了s2.playing();}else if (p instanceof Teachers) {Teachers t2 = (Teachers)p;t2.shopping();}} }輸出結(jié)果:
學(xué)生在聽(tīng)課 學(xué)生在寫作業(yè) 學(xué)生在玩游戲 老師在上課 老師在改作業(yè) 老師在逛街看完這個(gè)代碼,你應(yīng)該明白為什么需要instanceof了吧;
因?yàn)樵趯?shí)際開(kāi)發(fā)中,如果需要向下轉(zhuǎn)型的話,你無(wú)法保證你所要轉(zhuǎn)換的可以成功,所以一定要記住:
只要是向下轉(zhuǎn)型,一定要先用instanceof判斷,再進(jìn)行轉(zhuǎn)換!!!!切記
這樣你的代碼就不會(huì)出現(xiàn)各種奇怪的bug了,這也是一個(gè)優(yōu)秀的程序員應(yīng)該掌握的;
總結(jié)
instanceof總的來(lái)說(shuō)就是在向下轉(zhuǎn)型中必須使用的,可以保證自己代碼的健壯性;
所以向下轉(zhuǎn)型步驟是:先判斷(instanceof),再轉(zhuǎn)換(type)
總結(jié)
以上是生活随笔為你收集整理的java中 instanceof 的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [JAVA基础] 了解构造器Constr
- 下一篇: [JAVA基础类库] Objec类