java 多態性詳解及罕見面試題。本站提示廣大學習愛好者:(java 多態性詳解及罕見面試題)文章只能為提供參考,不一定能成為您想要的結果。以下是java 多態性詳解及罕見面試題正文
java多態性
多態分兩種:
(1) 編譯時多態(設計時多態):辦法重載。
(2) 運轉時多態:JAVA運轉時零碎依據調用該辦法的實例的類型來決議選擇調用哪個辦法則被稱為運轉時多態。(我們平常說得多的事運轉時多態,所以多態次要也是指運轉時多態)
運轉時多態存在的三個必要條件:
一、要有承繼(包括接口的完成);
二、要有重寫;
三、父類援用指向子類對象。
多態的益處:
1.可交換性(substitutability)。多態對已存在代碼具有可交換性。例如,多態對圓Circle類任務,對其他任何圓形幾何體,如圓環,也異樣任務。
2.可擴大性(extensibility)。多態對代碼具有可擴大性。添加新的子類不影響已存在類的多態性、承繼性,以及其他特性的運轉和操作。實踐上新加子類更容易取得多態功用。例如,在完成了圓錐、半圓錐以及半球體的多態根底上,很容易增添球體類的多態性。
3.接口性(interface-ability)。多態是超類經過辦法簽名,向子類提供了一個共同接口,由子類來完善或許掩蓋它而完成的。如圖8.3 所示。圖中超類Shape規則了兩個完成多態的接口辦法,computeArea()以及computeVolume()。子類,如Circle和Sphere為了完成多態,完善或許掩蓋這兩個接口辦法。
4.靈敏性(flexibility)。它在使用中表現了靈敏多樣的操作,進步了運用效率。
5.簡化性(simplicity)。多態簡化對使用軟件的代碼編寫和修正進程,尤其在處置少量對象的運算和操作時,這個特點尤為突出和重要。
留意:優先級從高到低:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
相關面試題:
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...{}
(二)問題:以下輸入後果是什麼?
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
剖析:
做這種題的話要時時辰刻運用那個優先級順序:
關於第一題:
a1是A類的一個實例化對象,所以this指向A,然後查找this.show(b),由於沒有這個辦法,所以到super.show(b),但是由於A類沒有超類了,所以到this.show(super b),由於b的超類是A,所以相當於this.show(A),然後在A類中查找到了這個辦法,於是輸入A and A。
關於第二題:
異樣,a1是A類的實例化對象,所以this指向A,然後在A類中查找this.show(C)辦法,由於沒有這個辦法,所以到了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類的實例化對象,所以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,所以執行辦法this。show(A),在A辦法外面找show(A),找到了,但是由於a2是一個類B的援用對象,而B類外面掩蓋了A類的show(A)辦法,所以最終執行的是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),異樣沒有找到,發現B還有超類,即A,所以還持續在A類外面找show(A)辦法,找到了,但是由於a2是一個類B的援用對象,而B類外面掩蓋了A類的show(A)辦法,所以最終執行的是B類外面的show(A)辦法,即輸入B and A;
關於第六題:
a2是B類的援用對象,類型為A,所以this指向A類,然後在A類外面找this.show(D)辦法,找到了,但是由於a2是一個類B的援用對象,所以在B類外面查找有沒有掩蓋show(D)辦法,沒有,所以執行的是A類外面的show(D)辦法,即輸入A and D;
關於第七題:
b是B類的一個實例化對象,首相執行this.show(B),在B類外面找show(B)辦法,找到了,直接輸入B and B;
關於第八題:
b是B類的一個實例化對象,首相執行this.show(C),在B類外面找show(C)辦法,沒有找到,所以到了super.show(c),B的超類是A,所以在A類中找show(C)辦法,沒有找到,於是到了this.show(super C),C的超類是B,所以在B類中找show(B)f辦法,找到了,所以執行B類中的show(B)辦法輸入B and B;
關於第九題:
b是B類的一個實例化對象,首相執行this.show(D),在B類外面找show(D)辦法,沒有找到,於是到了super.show(D),B的超類是A類,所以在A類外面找show(D)辦法,找到了,輸入A and D;
這是我看過網上的標題之後總結出來的辦法,希望對大家有益處。
感激閱讀,希望能協助到大家,謝謝大家對本站的支持!