更新時(shí)間:2019-09-17 11:38:09 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3449次
今天動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編為大家分享Java繼承多態(tài)經(jīng)典案例,希望通過(guò)此文能夠幫助到大家,下面就隨小編一起看看Java繼承多態(tài)經(jīng)典案例。
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 Demo2 {
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(a1.show(b)); // A and A
System.out.println(a1.show(c)); // A and A
System.out.println(a1.show(d)); // A and D
System.out.println(a2.show(b)); // B and A
System.out.println(a2.show(c)); // B and A
System.out.println(a2.show(d)); // A and D
System.out.println(b.show(b)); // B and B
System.out.println(b.show(c)); // B and B
System.out.println(b.show(d)); // A and D
}
}
分析:
多態(tài)的兩種形式:1、父類(lèi)做形參,子類(lèi)做實(shí)參。2、父類(lèi)的引用指向子類(lèi)的實(shí)例對(duì)象。
首先分析一個(gè)各個(gè)類(lèi)所具有的方法。
A:public String show(D obj); public String show(A obj);
B:public String show(D obj); public String show(A obj); public String show(B obj); public String show(A obj);-(被重寫(xiě))
C:public String show(D obj); public String show(A obj); public String show(B obj); public String show(A obj);-(被重寫(xiě))
D:public String show(D obj); public String show(A obj); public String show(B obj); public String show(A obj);-(被重寫(xiě))
執(zhí)行程序。
A a1 = new A();A a2 = new B();,a1 是多態(tài)形式1。看如下代碼。System.out.println(a1.show(b));A中的show方法只有D A 做形參,沒(méi)有B做形參的,然而A是B的父類(lèi),所以,這里實(shí)現(xiàn)的是多態(tài)形式1。 System.out.println(a1.show(c));同上一個(gè),A是C的間接父類(lèi)。System.out.println(a1.show(d));由于有D做形參的方法,所以直接使用。
System.out.println(a2.show(b));這個(gè)比較復(fù)雜, 明確一點(diǎn)很重要:a2是A類(lèi)的引用,只能引用A中已有的方法,沒(méi)有的方法不能引用,有人會(huì)說(shuō)為什么不是 “B and B”,輸出“B and B”的方法是子類(lèi)B的方法,顯然不會(huì)調(diào)用。具體過(guò)程而是查看A中的方法,發(fā)現(xiàn)沒(méi)有以B為參數(shù)的方法,但有以A為參數(shù)的方法,父類(lèi)為形參,這里又是第一種形式的多態(tài),于是就調(diào)用這個(gè)方法,但是這個(gè)方法在B中重寫(xiě)了,所以就會(huì)調(diào)用子類(lèi)的方法輸出“B and A”。System.out.println(a2.show(c));同理,C的間接父類(lèi)是A。System.out.println(a2.show(d)); A中有以D為參數(shù)的方法,直接調(diào)用。
System.out.println(b.show(b));查看B中有沒(méi)有以B為參數(shù)的方法,直接調(diào)用B的以B為參數(shù)的方法。System.out.println(b.show(c)); 查看B中有沒(méi)有以C為參數(shù)的方法,但是沒(méi)有,于是查找父類(lèi)中有沒(méi)有以B為參數(shù)的方法。也沒(méi)有,于是查找B中有沒(méi)有以父類(lèi)B為參數(shù)的方法,索性,這里有所以就調(diào)用。假設(shè),這里沒(méi)有的話(huà),就會(huì)繼續(xù)查找有沒(méi)有以間接父類(lèi)A為參數(shù)的方法。System.out.println(b.show(d)); 查找B中有沒(méi)有以D為參數(shù)的方法,但是沒(méi)有,于是看看從父類(lèi)繼承來(lái)的方法中有沒(méi)有以D為參數(shù)的方法,顯然有,所以調(diào)用并輸出。
總結(jié)
明確多態(tài)的兩種形式,謹(jǐn)記父類(lèi)引用只能調(diào)用父類(lèi)的方法,不能調(diào)用子類(lèi)中的方法。如果調(diào)用到了子類(lèi)的方法,那么一定是子類(lèi)中重寫(xiě)的方法。
super關(guān)鍵字用于調(diào)用子類(lèi)中從父類(lèi)繼承得到的成員變量和方法,this關(guān)鍵字用于調(diào)用當(dāng)前對(duì)象的屬性和方法。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編為大家分享的“Java繼承多態(tài)經(jīng)典案例”的內(nèi)容,希望對(duì)大家有幫助,更多java最新資訊請(qǐng)繼續(xù)關(guān)注動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會(huì)有精彩內(nèi)容分享與你。
相關(guān)免費(fèi)視頻教程推薦
java繼承視頻教程下載——繼承案例:http://www.ilovecolors.com.cn/xiazai/2606.html
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743