同一個(gè)對(duì)象,在不同時(shí)刻表現(xiàn)出來的不同形態(tài)就叫多態(tài)
多態(tài)的形式:
有 繼承 / 實(shí)現(xiàn) 關(guān)系
有方法重寫
有父(類 / 接口)引用指向(子 / 實(shí)現(xiàn))類對(duì)象👇
//父類引用 指向 子類對(duì)象
父類 對(duì)象名 = new 子類名();
//父接口引用 指向 實(shí)現(xiàn)類對(duì)象
接口名 對(duì)象名 = new 實(shí)現(xiàn)類名();
public class Animal() {public int height = 10;
public void eat() {Sout: "動(dòng)物吃東西";
}
}
class Cat extends Animal() {public int height = 20;
public int weight = 40;
@Override
public void eat() {Sout: "貓吃魚";
}
public void play() {Sout: "貓玩老鼠";
}
}
3.1 成員變量編譯看左邊,運(yùn)行看左邊 (因?yàn)槌蓡T變量沒有重寫)
javac
在編譯代碼的時(shí)候,會(huì)看左邊(父類)有沒有這個(gè)成員變量java
在運(yùn)行代碼的時(shí)候,會(huì)拿左邊(父類)的成員變量的值作為最終值public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
Sout: ani.height;// 輸出:10 (來自父類)
Sout: ani.weight;// 報(bào)錯(cuò),因?yàn)锳nimal類里沒有成員變量weight
}
}
3.2 成員方法編譯看左邊,運(yùn)行看右邊 (因?yàn)槌蓡T方法有重寫)
javac
在編譯代碼的時(shí)候,會(huì)看左邊(父類)有沒有這個(gè)成員方法java
在運(yùn)行代碼的時(shí)候,會(huì)拿右邊(子類)的成員方法作為最終值public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
ani.age();// 輸出:貓吃魚 (來自子類)
ani.play();//報(bào)錯(cuò),因?yàn)锳nimal類沒有成員方法play()
}
}
4 多態(tài)的利與弊
好處定義方法時(shí),使用父類型作為參數(shù),可以接收所有的子類對(duì)象
。以后再使用的時(shí)候,只需要使用具體的子類型參與操作即可。提高了程序的擴(kuò)展性
在多態(tài)形式下,右邊對(duì)象可以實(shí)現(xiàn)解耦合,便于擴(kuò)展和維護(hù)。
? 如 A extends C, B extends C。C類中有一個(gè)工作:打掃衛(wèi)生。
? 起初A類對(duì)象在打掃衛(wèi)生:C c = new A();
c.work();
? 現(xiàn)在想讓B類對(duì)象去打掃衛(wèi)生,只需要改變子類對(duì)象C c = new B();
,后續(xù)所有的代碼都不需要更改。
public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
ani.age();// 輸出:貓吃魚 (來自子類)
ani.play();//報(bào)錯(cuò),因?yàn)锳nimal類沒有成員方法play()
}
}
class Animal() {public int height = 10;
public void eat() {Sout: "動(dòng)物吃東西";
}
}
class Cat extends Animal() {public int height = 20;
public int weight = 40;
@Override
public void eat() {Sout: "貓吃魚";
}
public void play() {Sout: "貓玩老鼠";
}
}
5 多態(tài)的轉(zhuǎn)型
5.1 向上轉(zhuǎn)型(自動(dòng)類型轉(zhuǎn)換)從子到父
//向上轉(zhuǎn)型
Animal ani = new Cat();
5.2 向下轉(zhuǎn)型(強(qiáng)制類型轉(zhuǎn)換)從父到子
作用: 可以轉(zhuǎn)為真正的子類類型,從而調(diào)用子類獨(dú)有的功能
轉(zhuǎn)換類型與真實(shí)對(duì)象類型不一致的時(shí)候會(huì)報(bào)錯(cuò),所以:
轉(zhuǎn)型需謹(jǐn)慎,要加以判斷:
語(yǔ)法:a instanceof B
//變量a是不是B類型,如果是,返回true
public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
//ani是不是貓類型?是就轉(zhuǎn)型,不是就不轉(zhuǎn)
if(ani instanceof Cat) {//向下轉(zhuǎn)型
Cat cat = (Cat)ani;
//此時(shí)就可以用子類的特有功能
cat.play();
} else {System.out.println("沒有該類型,無法轉(zhuǎn)換");
}
}
}
關(guān)于強(qiáng)轉(zhuǎn)前的判斷,jdk14以后有新特性:
語(yǔ)法:a instanceof B b
? //變量a是不是B類型,如果是,則強(qiáng)轉(zhuǎn)為B類型,轉(zhuǎn)換后的變量名更改為b;如果不是不強(qiáng)轉(zhuǎn),結(jié)果為false
if(ani instanceof Cat cat) {cat.play();
} else {System.out.println("沒有該類型,無法轉(zhuǎn)換");
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
本文題目:第13講面向?qū)ο笕筇卣髦鄳B(tài)-創(chuàng)新互聯(lián)
分享路徑:http://muchs.cn/article26/degjjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站導(dǎo)航、App開發(fā)、微信公眾號(hào)、電子商務(wù)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容