多态的概念,特点与使用
多態(tài):可以理解為事物存在的多種體現(xiàn)形態(tài)
如:人:男人,女人
動物:貓,狗,鳥
貓這個動物應(yīng)該是貓類型的:貓 cat = new 貓();
同時貓也是動物的一種:動物 y = new 貓(); ?動物是貓和狗具體事物抽取出來的父類型,父類型指向了子類對象
?
1、多態(tài)的體現(xiàn)
父類的引用指向了自己的子類對象
父類的引用也可以接收自己的子類對象
2、多態(tài)的前提
必須是類與類之間有關(guān)系,要么繼承,要么實現(xiàn)
還有一個前提:存在覆蓋
3、多態(tài)的好處
多態(tài)的出現(xiàn)大大的提高了程序的擴展性
4、多態(tài)的弊端
雖然提高了擴展性,但是只能使用父類的引用訪問父類中的成員
5、多態(tài)的應(yīng)用
6、多態(tài)使用的注意事項
?
看一個關(guān)于多態(tài)的例子:
1 abstract class Teacher 2 { 3 public abstract void teach(); 4 public void sleep() 5 { 6 System.out.println("睡覺"); 7 } 8 } 9 class MathTeacher extends Teacher 10 { 11 public void teach() 12 { 13 System.out.println("教數(shù)學"); 14 } 15 } 16 class ChineseTeacher extends Teacher 17 { 18 public void teach() 19 { 20 System.out.println("教語文"); 21 } 22 public void sleep() 23 { 24 System.out.println("睡覺在沙發(fā)上"); 25 } 26 } 27 //將代碼進一步優(yōu)化,定義一個工具類,這樣就不需要實例化每一個老師對象,直接調(diào)用工具類,然后把各種類型的Teacher傳進去既可 28 class TeachTest 29 { 30 public static void teach(Teacher t)//Teacher t類型是Teacher由于多態(tài)可以直接傳MathTeacher等 31 { 32 t.teach(); 33 t.sleep(); 34 } 35 } 36 class Test 37 { 38 public static void main(String[] args) 39 { 40 /* 41 實例化一個新的數(shù)學老師 42 Teacher t = new MathTeacher(); 類型提升,向上轉(zhuǎn)型 43 t.sleep(); 44 如果想要調(diào)用貓的特有方法該怎么做? 45 強制將父類引用轉(zhuǎn)成子類類型,向下轉(zhuǎn)型 46 MathTeacher mt = (MathTeacher)t; 47 mt.teach(); 就可以調(diào)用數(shù)學老師里面的教學方法 48 */ 49 /* 50 如果要調(diào)用類的方法,先實例化一個類,然后分別調(diào)用 51 MathTeacher mt = new MathTeacher(); 52 mt.teach(); 53 mt.sleep(); 54 ChineseTeacher ct = new ChineseTeacher(); 55 ct.teach(); 56 ct.sleep(); 57 發(fā)現(xiàn)這樣比較麻煩,向上抽取,定義一個新的工具類TeachTest,將方法封裝進去 58 */ 59 TeachTest tt = new TeachTest(); 60 tt.teach(new MathTeacher()); 61 tt.teach(new ChineseTeacher()); 62 } 63 }在多態(tài)中成員函數(shù)的特點:
在編譯時期:參閱引用型變量所屬的類中是否有調(diào)用的方法,如果有,編譯通過,如果沒有,編譯失敗
在運行時期:參閱對象所屬的類中是否有調(diào)用的方法
簡單總結(jié):成員函數(shù)在多態(tài)調(diào)用時,編譯看左邊,運行看右邊
?
(面試)在多態(tài)中成員變量,靜態(tài)成員函數(shù)的特點:
無論編譯或運行,都參考左邊(引用型變量所屬的類)
如:
1 Fu f = new Zi(); 2 System.out.println(f.num);//打印的是父類里面的變量num 3 Zi z = new Zi(); 4 System.out.println(z.num);//打印的是子類里面的變量num 5 //靜態(tài)的方法也是一樣。?
一個集合了接口,多態(tài)的例子
1 /* 2 類 主板,主板有運行方法run() 3 一段時間后想要上網(wǎng) 加入網(wǎng)卡類 4 想要聽音樂 加入 聲卡類 5 6 但是這樣一個一個的加入使得代碼的擴展性很差,每次都要重新修改很多代碼 7 8 于是引入一個通用的接口PCI類 9 所有設(shè)備都有打開和關(guān)閉功能 10 讓網(wǎng)卡和聲卡分別取實現(xiàn)PCI接口,重寫成自己的打開和關(guān)閉功能 11 12 給主板加上一個實現(xiàn)pcirun的方法,傳遞參數(shù)的值為PCI類型的 13 可以利用多態(tài)PCI p = new NetCard(); 14 15 所以在下面主函數(shù)中運行時 創(chuàng)建新的主板對象以后 16 mb.pcirun(new NetCard()); 17 mb.pcirun(new SoundCard()); 18 就可以分別使用網(wǎng)卡和聲卡了,如果以后還要再加入比如顯卡 19 就只需要建立一個顯卡類去實現(xiàn)PCI接口,然后直接用主板中的pcirun方法就可以了。 20 21 */ 22 class MainBoard 23 { 24 public void run() 25 { 26 System.out.println("mainboard run"); 27 } 28 public void pcirun(PCI p) 29 { 30 p.open(); 31 p.close(); 32 } 33 } 34 interface PCI 35 { 36 public abstract void open(); 37 public abstract void close(); 38 } 39 class NetCard implements PCI 40 { 41 public void open() 42 { 43 System.out.println("netcard open"); 44 } 45 public void close() 46 { 47 System.out.println("netcard close"); 48 } 49 } 50 class SoundCard implements PCI 51 { 52 public void open() 53 { 54 System.out.println("SoundCard open"); 55 } 56 public void close() 57 { 58 System.out.println("SoundCard close"); 59 } 60 } 61 class Test 62 { 63 public static void main(String[] args) 64 { 65 MainBoard mb = new MainBoard(); 66 mb.run(); 67 mb.pcirun(new NetCard()); 68 mb.pcirun(new SoundCard()); 69 } 70 } 71 /* 72 這樣做的好處: 73 大大的降低了主板和各種獨立設(shè)備直接的耦合性 74 中間用一個PCI接口來連接起來 75 程序日后非常方便擴展 76 */轉(zhuǎn)載于:https://www.cnblogs.com/vilyo/archive/2012/08/05/2623554.html
總結(jié)
以上是生活随笔為你收集整理的多态的概念,特点与使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HP DVD-ROM TS-L663M
- 下一篇: 销售到出仓所经历的表