java多态的理解(运行时多态)_Java多态的理解
什么是多態
面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而準備的。這是我們最后一個概念,也是最重要的知識點。
多態的定義:指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而采用多種不同的行為方式。(發送消息就是函數調用)。
實現多態的技術稱為:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
多態的作用:消除類型之間的耦合關系。
現實中,關于多態的例子不勝枚舉。比方說按下 F1 鍵這個動作,如果當前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;如果當前在 Word 下彈出的就是 Word 幫助;在 Windows 下彈出的就是 Windows 幫助和支持。同一個事件發生在不同的對象上會產生不同的結果。
多態存在的三個必要條件 1、要有繼承;2、要有重寫;3、父類引用指向子類對象。
上菜
public class A { public String show(D obj) { //方法一 return ("A and D"); } public String show(A obj) { //方法二 return ("A and A"); } static class B extends A { public String show(B obj) { //方法三 return ("B and B"); } public String show(A obj) { //方法四 return ("B and A"); } } static class C extends B { } static class D extends B { } public static void main(String[] args) { A a2 = new B(); A a1 = new A(); B b = new B(); C c = new C(); D d = new D(); System.out.println("1--" + a1.show(b)); System.out.println("2--" + a1.show(c)); System.out.println("3--" + a1.show(d)); // 創建了B對象 類型是A ,調用超類函數,子類重寫了 調用子類的 System.out.println("4--" + a2.show(b)); System.out.println("5--" + a2.show(c)); System.out.println("6--" + a2.show(d)); // 子類沒有 去找超類 System.out.println("7--" + b.show(b)); System.out.println("8--" + b.show(c)); System.out.println("9--" + b.show(d)); System.out.println("10--" + d.show(d));????}}實驗結果
1--A and A2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
10--A and D
讓我們分析一下,理清其中各個類的繼承關系
那我們開始分析輸出A a1 = new A();這是普通的創建對象,故a1擁有調用方法一和方法二的能力。那么究竟調用哪個方法呢,這里面涉及方法的重載。其實,在編譯的時候,編譯器已經進行了前期綁定,即把show();方法與類中的方法主體2進行綁定。就是說,在編譯時,系統就已經知道應該調用哪個方法,即使你有方法的重載。
故 a1.show(b)會與方法二綁定;a1.show(c)會與方法二綁定;a1.show(d)會與方法一綁定。且都在編譯時完成綁定。
但A a2 = new B();就涉及了多態 了,B實現了向上轉型。創建了一個父類引用,指向子類對象。這樣的做法很常見,因為這樣不僅增加了靈活性(父類引用可以隨時指向任意子類對象),也提高了擴展性。但要知道的是,向上轉型的缺點,就是不能調用子類中有而父類沒有的方法。
故A a2 = new B();中,方法四對方法二進行了重寫,所以a2擁有調用方法一和方法四的能力,而方法三不能調用(由上一段可知)。所以,在編譯時, a2.show(b)會與方法四綁定;a2.show(c)會與方法四綁定;a2.show(d)會與方法一綁定。
B b = new B();這是普通的創建子類對象,B繼承于A,且方法四重寫了方法二,所以b擁有調用方法一,方法三,方法四的能力。所以b.show(b)會與方法三綁定,b.show(c)會與方法三綁定,b.show(d)會與方法一綁定。
對于多態,可以總結它為:
一、使用父類類型的引用指向子類的對象;
二、該引用只能調用父類中定義的方法和變量;
三、如果子類中重寫了父類中的一個方法,那么在調用這個方法的時候,將會調用子類中的這個方法;(動態連接、動態調用)
四、變量不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變量,那么在編譯時會報錯。
多態還可以用來做類型約束,編譯器就可以確定對象類型,避免類型轉換異常
總結
以上是生活随笔為你收集整理的java多态的理解(运行时多态)_Java多态的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台积电第一大客户(预计为苹果)去年贡献营
- 下一篇: 中国性能车!全新领克03 TCR赛车官图