您好,登錄后才能下訂單哦!
Java中多態(tài)的優(yōu)勢是什么?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
之前繼承有提到過。父類引用指向子類對象。這時的引用只能調(diào)用子類覆蓋重寫了的方法,不能調(diào)用子類特有方法。自動轉(zhuǎn)換
public class Main { public static void main(String[]args) { Father f = new Son(); f.money(); } } class Father{ void money() { System.out.println("父類的錢"); } } class Son extends Father{ void money() { System.out.println("子類的錢"); } void SonPlay() { System.out.println("爸爸我能打游戲嗎?"); } }
運行結(jié)果:
假如我要該引用區(qū)調(diào)用子類特有的方法(不是覆蓋重寫)呢? 會報錯 (下面的向下轉(zhuǎn)型就是解決這個問題)
下面舉個例子
不同語言輸出"HelloWorld"
(1)父類為正常類
public class Language{ //編程語言類 void HelloWorld() { //輸出HelloWorld } }
public class CLanguage extends Language{ //C語言類繼承編程語言類 void HelloWorld() { //輸出HelloWorld System.out.println("printf(\"HelloWorld!\");"); } }
public class JavaLanguage extends Language{ //Java繼承編程語言類 void HelloWorld(){ System.out.println("System.out.println(\"HelloWorld!\")"); } }
提供一個函數(shù)調(diào)用
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(); } }
在不改變函數(shù)的形參(父類)下,實參(子類)的改變不會讓程序報錯。也就是說,我只需要關(guān)心的是函數(shù)的形參是與Language類相關(guān)的類(本身或者子類對象)就行,而無需考慮傳入的實參到底是哪個子類對象。
運行結(jié)果:
假如父類是接口或者是抽象類呢?也可以
(2)父類為接口
假如父類真的就是為了提供某標準,或者父類無需實現(xiàn)內(nè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{ //編程語言類 public void HelloWorld() ; //輸出HelloWorld } class CLanguage implements Language{ //C語言類繼承編程語言類 public void HelloWorld() { //輸出HelloWorld System.out.println("printf(\"HelloWorld!\");"); } } class JavaLanguage implements Language{ public void HelloWorld(){ System.out.println("System.out.println(\"HelloWorld!\")"); } }
運行結(jié)果:
當然,抽象類作為父類也可以實現(xiàn)多態(tài)哦。
把父類引用指向子類對象的引用在強轉(zhuǎn)為不同子類對象。 轉(zhuǎn)完之后的對象可以調(diào)用子類特有方法
(解決上述的調(diào)用子類的特有方法會報錯)
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("父類的錢"); } } class Son extends Father{ void money() { System.out.println("子類的錢"); } void SonPlay() { System.out.println("爸爸我能打游戲嗎?"); } }
運行結(jié)果:
在舉上面的編程語言輸出HelloWorld例子,假如我要求inputLanguage方法對于傳入的實參中的子類對象進行判斷,假如傳入的對象是C語言類就輸出新增的特有的方法,Java類也是一樣
這里就有點像簡單工廠模式(實參是啥我new啥)了,這里是實參是啥,我強轉(zhuǎn)之后,我調(diào)用對應(yīng)的方法。
public class CLanguage implements Language{ //C語言類繼承編程語言類 public void HelloWorld() { //輸出HelloWorld System.out.println("printf(\"HelloWorld!\");"); } public void CReadMe() { //新增C語言子類特有方法 System.out.println("我是C語言"); } }
public class JavaLanguage implements Language{ public void HelloWorld(){ System.out.println("System.out.println(\"HelloWorld!\")"); } public void JavaReadMe() {//新增Java子類特有方法 System.out.println("我是Java"); } }
修改inputHelloWorld函數(shù)
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(); } }
運行結(jié)果:
Java的基本數(shù)據(jù)類型分為:1、整數(shù)類型,用來表示整數(shù)的數(shù)據(jù)類型。2、浮點類型,用來表示小數(shù)的數(shù)據(jù)類型。3、字符類型,字符類型的關(guān)鍵字是“char”。4、布爾類型,是表示邏輯值的基本數(shù)據(jù)類型。
關(guān)于Java中多態(tài)的優(yōu)勢是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。