- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java多態(tài)到底都有啥好處
多態(tài)到底是啥,就是當子類(lèi)繼承父類(lèi)的方法時(shí),對其繼承下來(lái)的方法按照自己的方式重新定義(覆蓋重寫(xiě))。
之前繼承有提到過(guò)。父類(lèi)引用指向子類(lèi)對象。這時(shí)的引用只能調用子類(lèi)覆蓋重寫(xiě)了的方法,不能調用子類(lèi)特有方法。自動(dòng)轉換
public class Main { public static void main(String[]args) { Father f = new Son(); f.money(); } } class Father{ void money() { System.out.println("父類(lèi)的錢(qián)"); } } class Son extends Father{ void money() { System.out.println("子類(lèi)的錢(qián)"); } void SonPlay() { System.out.println("爸爸我能打游戲嗎?"); } }
運行結果:
假如我要該引用區調用子類(lèi)特有的方法(不是覆蓋重寫(xiě))呢? 會(huì )報錯 (下面的向下轉型就是解決這個(gè)問(wèn)題)
下面舉個(gè)例子
不同語(yǔ)言輸出"HelloWorld"
(1)父類(lèi)為正常類(lèi)
public class Language{ //編程語(yǔ)言類(lèi) void HelloWorld() { //輸出HelloWorld } }
public class CLanguage extends Language{ //C語(yǔ)言類(lèi)繼承編程語(yǔ)言類(lèi) void HelloWorld() { //輸出HelloWorld System.out.println("printf(\"HelloWorld!\");"); } }
public class JavaLanguage extends Language{ //Java繼承編程語(yǔ)言類(lèi) void HelloWorld(){ System.out.println("System.out.println(\"HelloWorld!\")"); } }
提供一個(gè)函數調用
public class Test { public static void main(String[]args) { //inputHelloWorld(new CLanguage()); //inputHelloWorld(new JavaLanguage()); //或者 Language language; language = new CLanguage(); inputHelloWorld(language); language = new JavaLanguage(); inputHelloWorld(language); } public static void inputHelloWorld(Language language) { language.HelloWorld(); } }
在不改變函數的形參(父類(lèi))下,實(shí)參(子類(lèi))的改變不會(huì )讓程序報錯。也就是說(shuō),我只需要關(guān)心的是函數的形參是與Language類(lèi)相關(guān)的類(lèi)(本身或者子類(lèi)對象)就行,而無(wú)需考慮傳入的實(shí)參到底是哪個(gè)子類(lèi)對象。
運行結果:
假如父類(lèi)是接口或者是抽象類(lèi)呢?也可以
(2)父類(lèi)為接口
假如父類(lèi)真的就是為了提供某標準,或者父類(lèi)無(wú)需實(shí)現內容等情況,可以考慮吧父類(lèi)變成接口,接口也支持多態(tài)。
public class Test { public static void main(String[]args) { //inputHelloWorld(new CLanguage()); //inputHelloWorld(new JavaLanguage()); //或者 Language language; language = new CLanguage(); inputHelloWorld(language); language = new JavaLanguage(); inputHelloWorld(language); } public static void inputHelloWorld(Language language) { language.HelloWorld(); } } interface Language{ //編程語(yǔ)言類(lèi) public void HelloWorld() ; //輸出HelloWorld } class CLanguage implements Language{ //C語(yǔ)言類(lèi)繼承編程語(yǔ)言類(lèi) public void HelloWorld() { //輸出HelloWorld System.out.println("printf(\"HelloWorld!\");"); } } class JavaLanguage implements Language{ public void HelloWorld(){ System.out.println("System.out.println(\"HelloWorld!\")"); } }
運行結果:
當然,抽象類(lèi)作為父類(lèi)也可以實(shí)現多態(tài)哦。
把父類(lèi)引用指向子類(lèi)對象的引用在強轉為不同子類(lèi)對象。 轉完之后的對象可以調用子類(lèi)特有方法
(解決上述的調用子類(lèi)的特有方法會(huì )報錯)
public class Main { public static void main(String[]args) { Father f = new Son(); //f.money(); Son s = (Son)f; s.SonPlay(); } } class Father{ void money() { System.out.println("父類(lèi)的錢(qián)"); } } class Son extends Father{ void money() { System.out.println("子類(lèi)的錢(qián)"); } void SonPlay() { System.out.println("爸爸我能打游戲嗎?"); } }
運行結果:
在舉上面的編程語(yǔ)言輸出HelloWorld例子,假如我要求inputLanguage方法對于傳入的實(shí)參中的子類(lèi)對象進(jìn)行判斷,假如傳入的對象是C語(yǔ)言類(lèi)就輸出新增的特有的方法,Java類(lèi)也是一樣
這里就有點(diǎn)像簡(jiǎn)單工廠(chǎng)模式(實(shí)參是啥我new啥)了,這里是實(shí)參是啥,我強轉之后,我調用對應的方法。
public class CLanguage implements Language{ //C語(yǔ)言類(lèi)繼承編程語(yǔ)言類(lèi) public void HelloWorld() { //輸出HelloWorld System.out.println("printf(\"HelloWorld!\");"); } public void CReadMe() { //新增C語(yǔ)言子類(lèi)特有方法 System.out.println("我是C語(yǔ)言"); } }
public class JavaLanguage implements Language{ public void HelloWorld(){ System.out.println("System.out.println(\"HelloWorld!\")"); } public void JavaReadMe() {//新增Java子類(lèi)特有方法 System.out.println("我是Java"); } }
修改inputHelloWorld函數
public class Test { public static void main(String[]args) { //inputHelloWorld(new CLanguage()); //inputHelloWorld(new JavaLanguage()); //或者 Language language; language = new CLanguage(); inputHelloWorld(language); language = new JavaLanguage(); inputHelloWorld(language); } public static void inputHelloWorld(Language language) { if(language instanceof CLanguage) { CLanguage clanguage = (CLanguage) language; clanguage.CReadMe(); }else if(language instanceof JavaLanguage) { JavaLanguage javalanguage = (JavaLanguage)language; javalanguage.JavaReadMe(); } language.HelloWorld(); } }
運行結果:
總得來(lái)說(shuō),多態(tài)可以使函數在其父類(lèi)形參不變下,實(shí)參可以傳入多個(gè)不同的子類(lèi)對象。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站