java多態(tài)性
多態(tài)分兩種:
(1) 編譯時(shí)多態(tài)(設(shè)計(jì)時(shí)多態(tài)):方法重載旨涝。
(2) 運(yùn)行時(shí)多態(tài):JAVA運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類型來決定選擇調(diào)用哪個(gè)方法則被稱為運(yùn)行時(shí)多態(tài)。(我們平時(shí)說得多的事運(yùn)行時(shí)多態(tài),所以多態(tài)主要也是指運(yùn)行時(shí)多態(tài))
運(yùn)行時(shí)多態(tài)存在的三個(gè)必要條件:
一白华、要有繼承(包括接口的實(shí)現(xiàn))慨默;
二、要有重寫弧腥;
三厦取、父類引用指向子類對象。
多態(tài)的好處:
1.可替換性(substitutability)管搪。多態(tài)對已存在代碼具有可替換性虾攻。例如,多態(tài)對圓Circle類工作更鲁,對其他任何圓形幾何體霎箍,如圓環(huán),也同樣工作澡为。
2.可擴(kuò)充性(extensibility)漂坏。多態(tài)對代碼具有可擴(kuò)充性。增加新的子類不影響已存在類的多態(tài)性媒至、繼承性顶别,以及其他特性的運(yùn)行和操作。實(shí)際上新加子類更容易獲得多態(tài)功能拒啰。例如驯绎,在實(shí)現(xiàn)了圓錐、半圓錐以及半球體的多態(tài)基礎(chǔ)上谋旦,很容易增添球體類的多態(tài)性剩失。
3.接口性(interface-ability)。多態(tài)是超類通過方法簽名册着,向子類提供了一個(gè)共同接口赴叹,由子類來完善或者覆蓋它而實(shí)現(xiàn)的。如圖8.3 所示指蚜。圖中超類Shape規(guī)定了兩個(gè)實(shí)現(xiàn)多態(tài)的接口方法乞巧,computeArea()以及computeVolume()。子類摊鸡,如Circle和Sphere為了實(shí)現(xiàn)多態(tài)绽媒,完善或者覆蓋這兩個(gè)接口方法。
4.靈活性(flexibility)免猾。它在應(yīng)用中體現(xiàn)了靈活多樣的操作是辕,提高了使用效率。
5.簡化性(simplicity)猎提。多態(tài)簡化對應(yīng)用軟件的代碼編寫和修改過程获三,尤其在處理大量對象的運(yùn)算和操作時(shí),這個(gè)特點(diǎn)尤為突出和重要。
注意:優(yōu)先級從高到低:this.show(O)疙教、super.show(O)棺聊、this.show((super)O)、super.show((super)O)贞谓。
相關(guān)面試題:
class A {
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("A and A");
}
}
class B extends A{
public String show(B obj)...{
return ("B and B");
}
public String show(A obj)...{
return ("B and A");
}
}
class C extends B...{}
class D extends B...{}
(二)問題:以下輸出結(jié)果是什么限佩?
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(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
分析:
做這種題的話要時(shí)時(shí)刻刻使用那個(gè)優(yōu)先級順序:
對于第一題:
a1是A類的一個(gè)實(shí)例化對象,所以this指向A裸弦,然后查找this.show(b),由于沒有這個(gè)方法祟同,所以到super.show(b),但是由于A類沒有超類了理疙,所以到this.show(super b),由于b的超類是A晕城,所以相當(dāng)于this.show(A),然后在A類中查找到了這個(gè)方法,于是輸出A and A窖贤。
對于第二題:
同樣砖顷,a1是A類的實(shí)例化對象,所以this指向A主之,然后在A類中查找this.show(C)方法,由于沒有這個(gè)方法李根,所以到了super.show(C),由于A類的超類里面找槽奕,但是A沒有超類,所以到了this.show(super C)房轿,由于C的超類是B所以在A類里面查找this.show(B)方法粤攒,也沒找到,然后B也有超類囱持,就是A夯接,所以查找this.show(A),找到了,于是輸出A and A纷妆;
對于第三題:
同樣盔几,a1是A類的實(shí)例化對象,所以this指向A掩幢,然后在A類中找到this.show(D)方法逊拍,找到了,所以就輸出A and D际邻;
對于第四題:
a2是B類的引用對象芯丧,類型為A,所以this指向A類世曾,然后在A類里面找this.show(B)方法缨恒,沒有找到,所以到了super.show(B),由于A類沒有超類,所以到了this.show(super B)骗露,B的超類是A岭佳,即super B = A,所以執(zhí)行方法this椒袍。show(A)驼唱,在A方法里面找show(A),找到了驹暑,但是由于a2是一個(gè)類B的引用對象玫恳,而B類里面覆蓋了A類的show(A)方法,所以最終執(zhí)行的是B類里面的show(A)方法优俘,即輸出B and A京办;
對于第五題:
a2是B類的引用對象,類型為A帆焕,所以this指向A類惭婿,然后在A類里面找this.show(C)方法,沒有找到叶雹,所以到了super.show(C)方法财饥,由于A類沒有超類,所以到了this.show(super C),C的超類是B折晦,所以在A類里面找show(B)钥星,同樣沒有找到,發(fā)現(xiàn)B還有超類满着,即A谦炒,所以還繼續(xù)在A類里面找show(A)方法,找到了风喇,但是由于a2是一個(gè)類B的引用對象宁改,而B類里面覆蓋了A類的show(A)方法,所以最終執(zhí)行的是B類里面的show(A)方法魂莫,即輸出B and A还蹲;
對于第六題:
a2是B類的引用對象,類型為A耙考,所以this指向A類秽誊,然后在A類里面找this.show(D)方法,找到了琳骡,但是由于a2是一個(gè)類B的引用對象锅论,所以在B類里面查找有沒有覆蓋show(D)方法,沒有楣号,所以執(zhí)行的是A類里面的show(D)方法最易,即輸出A and D怒坯;
對于第七題:
b是B類的一個(gè)實(shí)例化對象,首相執(zhí)行this.show(B)藻懒,在B類里面找show(B)方法剔猿,找到了,直接輸出B and B嬉荆;
對于第八題:
b是B類的一個(gè)實(shí)例化對象归敬,首相執(zhí)行this.show(C),在B類里面找show(C)方法鄙早,沒有找到汪茧,所以到了super.show(c),B的超類是A,所以在A類中找show(C)方法限番,沒有找到舱污,于是到了this.show(super C),C的超類是B,所以在B類中找show(B)f方法弥虐,找到了扩灯,所以執(zhí)行B類中的show(B)方法輸出B and B;
對于第九題:
b是B類的一個(gè)實(shí)例化對象霜瘪,首相執(zhí)行this.show(D)珠插,在B類里面找show(D)方法,沒有找到颖对,于是到了super.show(D),B的超類是A類捻撑,所以在A類里面找show(D)方法,找到了惜互,輸出A and D布讹;
轉(zhuǎn)載:https://m.jb51.net/article/97263.htm