亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java三大特性之多態

2019-11-06 06:51:25
字體:
來源:轉載
供稿:網友

多態的定義多態的三個必要條件多態的表現形式多態的種類多態的實現方式基于繼承實現的多態基于接口實現的多態經典案例答案分析多層父子調用的優先級

多態的定義

多態程序中定義的引用變量和通過該引用變量調用的方法所指向的具體類型和具體類型的方法在編程時并不確定,而只有在程序運行期間某一刻才能具體確定的情況稱之為多態。

寫的有點饒,但是可以看到幾個重點是引用的變量和該變量的方法在沒運行時我們是不確定它的具體類型的。

那么為什么會有這種情況呢,根據在繼承中的提現我們發現會發生這種情況的就是向下轉型的問題。 即;我們可以確定貓是動物,但是反過來如果別人給你是一只被袋子裝起來的動物(向上轉型)你是無法判斷它到底是貓還是小老虎(向下轉型)不是么。

多態的三個必要條件

因此多態出現的情況就很明顯了,它必須有一個前提場景才能發生;

實現多態有三個必要條件:繼承(extent)、重寫(overriding)、向上轉型

通過實例說明

public class Animal { public void fun1(){ System.out.Output

Animal 的Fun.....Cat 的Fun2...

從程序的運行結果中我們發現, a.fun1()首先是運行父類Animal中的fun1().然后再運行子類Cat中的fun2()。

所以對于多態我們可以總結如下:

指向子類的父類引用由于向上轉型了,它只能訪問父類中擁有的方法和屬性,而對于子類中存在而父類中不存在的方法,該引用是不能使用的,盡管是重載該方法。若子類重寫了父類中的某些方法,在調用這些方法的時候,必定是使用子類中定義的這些方法(動態連接、動態調用)。

多態的表現形式

java中的多態的表現形式一般分為兩種:overriding(重寫)和overloading(重載)

重寫overriding是父類和子類之間多態性的一種表現重載overloading是一個類中多態性的表現。

如果在子類中定義某方法與其父類有相同的名稱和參數,我們就可以這樣說此方法被子類重寫overriding,子類中的對象使用這個方法的時候,將調用子類中中的定義,此時對子類來說,父類中的方法定義如同被”屏蔽”了一樣(a不能調用fun1(String str)方法)。如果在一個類中定義了多個同名的方法,它們或有不同的參數或有不同的參數類型,則稱為方法的重載overloading。并且overloading的方式是可以改變返回值類型的,但是父類中并沒有這些重載的方法。

多態的種類

分為編譯時多態和運行時多態

多態的實現方式

兩種實現方式: - 基于繼承 - 基于接口

基于繼承實現的多態

上面的例子都是基于繼承實現的,當然下面這個也是基于繼承:

public class Wine { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Wine(){ } public String drink(){ return "喝的是 " + getName(); } /** * 重寫toString() */ public String toString(){ return null; }}public class JNC extends Wine{ public JNC(){ setName("JNC"); } /** * 重寫父類方法,實現多態 */ public String drink(){ return "喝的是 " + getName(); } /** * 重寫toString() */ public String toString(){ return "Wine : " + getName(); }}public class JGJ extends Wine{ public JGJ(){ setName("JGJ"); } /** * 重寫父類方法,實現多態 */ public String drink(){ return "喝的是 " + getName(); } /** * 重寫toString() */ public String toString(){ return "Wine : " + getName(); }}public class Test { public static void main(String[] args) { //定義父類數組 Wine[] wines = new Wine[2]; //定義兩個子類 JNC jnc = new JNC(); JGJ jgj = new JGJ(); //父類引用子類對象 wines[0] = jnc; wines[1] = jgj; for(int i = 0 ; i < 2 ; i++){ System.out.println(wines[i].toString() + "--" + wines[i].drink()); } System.out.println("-------------------------------"); }}

OUTPUT:

Wine : JNC--喝的是 JNCWine : JGJ--喝的是 JGJ-------------------------------

在上面的代碼中JNC、JGJ繼承Wine,并且重寫了drink()、toString()方法,程序運行結果是調用子類中方法,輸出JNC、JGJ的名稱,這就是多態的表現。不同的對象可以執行相同的行為,但是他們都需要通過自己的實現方式來執行,這就要得益于向上轉型了。

我們都知道所有的類都繼承自超類Object,toString()方法也是Object中方法,當我們這樣寫時:Object o = new JGJ(); System.out.println(o.toString());

所以基于繼承實現的多態可以總結如下:對于引用子類的父類類型,在處理該引用時,它適用于繼承該父類的所有子類,子類對象的不同,對方法的實現也就不同,執行相同動作產生的行為也就不同。

基于接口實現的多態

繼承是通過重寫父類的同一方法的幾個不同子類來體現的,那么就可就是通過實現接口并覆蓋接口中同一方法的幾不同的類體現的。 在接口的多態中,指向接口的引用必須是指定這實現了該接口的一個類的實例程序,在運行時,根據對象引用的實際類型來執行對應的方法。 繼承都是單繼承,只能為一組相關的類提供一致的服務接口。但是接口可以是多繼承多實現,它能夠利用一組相關或者不相關的接口進行組合與擴充,能夠對外提供一致的服務接口。所以它相對于繼承來說有更好的靈活性。

這里就不寫代碼了,接口繼承,執行的方法根據具體的子類型來確定,借口本身是不能直接調用的,所以執行的具體方法根據傳遞的子類型來執行它的實現方法。

經典案例

這是一個非常變態的多態案例,作者寫得非常詳細:

http://blog.csdn.net/thinkGhoster/archive/2008/04/19/2307001.aspx

public class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } }public class B extends A{ public String show(B obj){ return ("B and B"); } public String show(A obj){ return ("B and A"); } }public class C extends B{}public class D extends B{}public class Test { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); 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)); 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)); }}

答案

① A and A ② A and A ③ A and D ④ B and A ⑤ B and A ⑥ A and D ⑦ B and B ⑧ B and B ⑨ A and D

分析

①②③比較好理解,一般不會出錯。④⑤就有點糊涂了,為什么輸出的不是"B and B”呢?!!先來回顧一下多態性。 運行時多態性是面向對象程序設計代碼重用的一個最強大機制,動態性的概念也可以被說成“一個接口,多個方法”。Java實現運行時多態性的基礎是動態方法調度,它是一種在運行時而不是在編譯期調用重載方法的機制。 方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫(Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。 (但是如果強制把超類轉換成子類的話,就可以調用子類中新添加而超類沒有的方法了。)

好了,先溫習到這里,言歸正傳!

多層父子調用的優先級

上面的案例實際上涉及方法調用的優先問題

優先級由高到低依次為:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。讓我們來看看它是怎么工作的。

比如④,a2.show(b),a2是一個引用變量,類型為A,則this為a2,b是B的一個實例,于是它到類A里面找show(B obj)方法,沒有找到,于是到A的super(超類)找,而A沒有超類,因此轉到第三優先級this.show((super)O),this仍然是a2,這里O為B,(super)O即(super)B即A,因此它到類A里面找show(A obj)的方法,類A有這個方法,但是由于a2引用的是類B的一個對象,B覆蓋了A的show(A obj)方法,因此最終鎖定到類B的show(A obj),輸出為"B and A”。
上一篇:java運行機制

下一篇:java中循環遍歷

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频在线观看| 亚洲性av在线| 成人av在线亚洲| 亚洲国产97在线精品一区| 永久免费精品影视网站| 日韩成人在线视频网站| 日韩中文字幕亚洲| 欧美剧在线观看| 日韩av三级在线观看| 中文字幕亚洲无线码在线一区| 国产精品女视频| 久久九九精品99国产精品| 日韩精品中文字幕在线观看| 日韩精品电影网| 亚洲成人国产精品| 17婷婷久久www| 好吊成人免视频| 国产精品久久久久久影视| 国产精品一区久久久| 精品在线欧美视频| 91av在线精品| 在线播放精品一区二区三区| 精品久久久国产| 久久久久国产视频| 日韩在线免费av| 日韩欧美在线视频免费观看| 欧美精品一区二区三区国产精品| 日韩在线观看免费全集电视剧网站| 国产精品天天狠天天看| 国产精品视频在线观看| 亚洲高清色综合| 一区二区三区高清国产| 日韩欧美高清在线视频| 国产日韩精品入口| 97在线免费观看视频| 国产91精品视频在线观看| 色狠狠久久aa北条麻妃| 亚洲国产精品国自产拍av秋霞| 欧美日韩国产成人高清视频| 最近日韩中文字幕中文| 日韩一区在线视频| 国产精品成人aaaaa网站| 国外成人免费在线播放| 91精品国产综合久久久久久蜜臀| 日本sm极度另类视频| 欧美另类第一页| 精品亚洲一区二区| 中文字幕日韩免费视频| 国产精品丝袜久久久久久高清| 成人福利在线观看| 午夜精品福利电影| 日韩中文视频免费在线观看| 午夜剧场成人观在线视频免费观看| 日韩在线不卡视频| 中文字幕自拍vr一区二区三区| 国产经典一区二区| 91精品视频在线播放| 午夜精品久久久久久久男人的天堂| 亚洲性av在线| 久久久久久亚洲精品不卡| 日本精品va在线观看| 欧美一区视频在线| 午夜精品福利电影| 国产精品久久久久久久久久久久| 成人性生交xxxxx网站| 成人两性免费视频| 欧洲成人免费视频| 欧美老女人性视频| 亚洲国产精品资源| 国产视频一区在线| 色综合色综合久久综合频道88| 色综合男人天堂| 欧美大学生性色视频| 97视频在线观看播放| 欧美性极品少妇精品网站| 九色精品免费永久在线| 色av吧综合网| 91高清视频免费观看| 日韩黄色av网站| 日韩av片永久免费网站| 亚洲精品久久7777777| 蜜臀久久99精品久久久无需会员| 欧美性猛xxx| 久久香蕉国产线看观看av| 国产成人综合精品在线| 欧美另类极品videosbest最新版本| 成人h视频在线观看播放| 911国产网站尤物在线观看| 欧美精品国产精品日韩精品| 俺去啦;欧美日韩| 亚洲男人天天操| 欧美电影在线观看网站| 国产综合久久久久久| 欧美激情欧美激情| 国产亚洲精品久久久优势| 91国内在线视频| 亚洲欧美国产高清va在线播| 韩国国内大量揄拍精品视频| 91精品久久久久久久久久入口| 日本在线观看天堂男亚洲| 性欧美办公室18xxxxhd| 国产成人精品优优av| 爱福利视频一区| 亚洲国产欧美一区二区三区同亚洲| 国产日韩在线免费| 日韩暖暖在线视频| 日韩中文av在线| 久久亚洲私人国产精品va| 国产有码在线一区二区视频| 亚洲色图35p| 国产日韩欧美另类| 日韩精品视频免费在线观看| 在线看片第一页欧美| 亚洲成人免费网站| 亚洲精品视频免费在线观看| 国产一区二区在线播放| 日韩免费高清在线观看| 中文字幕久久久av一区| 成人精品aaaa网站| 美女视频久久黄| 亚洲一区二区少妇| 色噜噜狠狠色综合网图区| 国产一区二区丝袜| 欧美激情伊人电影| 亚洲自拍偷拍色片视频| 亚洲欧美在线一区二区| 亚洲精品suv精品一区二区| 亚洲一区久久久| 色琪琪综合男人的天堂aⅴ视频| 国产精品www网站| 成人在线国产精品| 日韩中文字幕视频在线| 亚洲a在线观看| 日韩电视剧免费观看网站| 成人av在线网址| 欧美日韩国产在线看| 亚洲欧美激情一区| www.日韩.com| 国产午夜精品久久久| 国产精品视频xxx| 最新国产精品拍自在线播放| 欧美精品video| 欧美色videos| 最近2019中文字幕在线高清| 日韩欧美高清在线视频| 欧美成人精品xxx| 久久全球大尺度高清视频| 91超碰中文字幕久久精品| 国产精品青草久久久久福利99| 欧美另类69精品久久久久9999| 精品露脸国产偷人在视频| 日韩美女激情视频| 琪琪亚洲精品午夜在线| 丝袜亚洲另类欧美重口| 午夜精品99久久免费| 久久久亚洲国产天美传媒修理工| 精品香蕉一区二区三区| 在线观看久久久久久| 亚洲成人精品视频在线观看| 日韩精品电影网| 亚洲精品午夜精品| 欧美日韩国产丝袜美女| 日韩在线资源网| 日韩中文在线中文网在线观看|