日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java多态的理解(运行时多态)_Java多态的理解

發布時間:2023/12/15 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 A
2--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多态的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。