多態的概念,特點與使用


多態:可以理解為事物存在的多種體現形態

如:人:男人,女人

  動物:貓,狗,鳥

貓這個動物應該是貓類型的:貓 cat = new 貓();

同時貓也是動物的一種:動物 y = new 貓();  動物是貓和狗具體事物抽取出來的父類型,父類型指向了子類對象 

 

1、多態的體現

  父類的引用指向了自己的子類對象

  父類的引用也可以接收自己的子類對象

2、多態的前提

  必須是類與類之間有關系,要么繼承,要么實現

  還有一個前提:存在覆蓋  

3、多態的好處

  多態的出現大大的提高了程序的擴展性

4、多態的弊端

  雖然提高了擴展性,但是只能使用父類的引用訪問父類中的成員

5、多態的應用

6、多態使用的注意事項  

 

看一個關於多態的例子:

 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("教數學");
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("睡覺在沙發上");
25     }
26 }
27 //將代碼進一步優化,定義一個工具類,這樣就不需要實例化每一個老師對象,直接調用工具類,然后把各種類型的Teacher傳進去既可
28 class TeachTest
29 {
30     public static void teach(Teacher t)//Teacher t類型是Teacher由於多態可以直接傳MathTeacher等
31     {
32         t.teach();
33         t.sleep();
34     }
35 }
36 class Test
37 {
38     public static void main(String[] args)
39     {
40         /*
41         實例化一個新的數學老師
42         Teacher t = new MathTeacher(); 類型提升,向上轉型
43         t.sleep();
44         如果想要調用貓的特有方法該怎么做?
45         強制將父類引用轉成子類類型,向下轉型
46         MathTeacher mt = (MathTeacher)t;
47         mt.teach();  就可以調用數學老師里面的教學方法
48         */
49         /*
50         如果要調用類的方法,先實例化一個類,然后分別調用
51         MathTeacher mt = new MathTeacher();
52         mt.teach();
53         mt.sleep();
54         ChineseTeacher ct = new ChineseTeacher();
55         ct.teach();
56         ct.sleep();
57         發現這樣比較麻煩,向上抽取,定義一個新的工具類TeachTest,將方法封裝進去
58         */
59         TeachTest tt = new TeachTest();
60         tt.teach(new MathTeacher());
61         tt.teach(new ChineseTeacher());
62     }
63 }

在多態中成員函數的特點:

在編譯時期:參閱引用型變量所屬的類中是否有調用的方法,如果有,編譯通過,如果沒有,編譯失敗

在運行時期:參閱對象所屬的類中是否有調用的方法

簡單總結:成員函數在多態調用時,編譯看左邊,運行看右邊

 

(面試)在多態中成員變量靜態成員函數的特點:

無論編譯或運行,都參考左邊(引用型變量所屬的類)

如:

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 //靜態的方法也是一樣。

 

一個集合了接口,多態的例子

 1 /*
 2 類 主板,主板有運行方法run()
 3 一段時間后想要上網 加入網卡類
 4 想要聽音樂 加入 聲卡類
 5 
 6 但是這樣一個一個的加入使得代碼的擴展性很差,每次都要重新修改很多代碼
 7 
 8 於是引入一個通用的接口PCI類
 9 所有設備都有打開和關閉功能
10 讓網卡和聲卡分別取實現PCI接口,重寫成自己的打開和關閉功能
11 
12 給主板加上一個實現pcirun的方法,傳遞參數的值為PCI類型的
13 可以利用多態PCI p = new NetCard();
14 
15 所以在下面主函數中運行時 創建新的主板對象以后
16         mb.pcirun(new NetCard());
17         mb.pcirun(new SoundCard());
18 就可以分別使用網卡和聲卡了,如果以后還要再加入比如顯卡
19 就只需要建立一個顯卡類去實現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 大大的降低了主板和各種獨立設備直接的耦合性
74 中間用一個PCI接口來連接起來
75 程序日后非常方便擴展
76 */


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM