Java多態(tài)到底都有啥好處
多態(tài)到底是啥,就是當子類繼承父類的方法時,對其繼承下來的方法按照自己的方式重新定義(覆蓋重寫)。
1.向上轉(zhuǎn)型。
之前繼承有提到過。父類引用指向子類對象。這時的引用只能調(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)哦。
2.向下轉(zhuǎn)型。
把父類引用指向子類對象的引用在強轉(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)用對應的方法。
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é)果:
總得來說,多態(tài)可以使函數(shù)在其父類形參不變下,實參可以傳入多個不同的子類對象。
相關(guān)文章
java微信小程序步數(shù)encryptedData和開放數(shù)據(jù)解密的實現(xiàn)
這篇文章主要介紹了java微信小程序步數(shù)encryptedData和開放數(shù)據(jù)解密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09使用java實現(xiàn)各種數(shù)據(jù)統(tǒng)計圖(柱形圖,餅圖,折線圖)
用Jfree實現(xiàn)條形柱狀圖表,java代碼實現(xiàn)??山?jīng)常用于報表的制作,代碼自動生成后可以自由查看??梢宰杂膳渲脠D表的各個屬性,用來達到自己的要求和目的。本文給大家介紹使用java實現(xiàn)各種數(shù)據(jù)統(tǒng)計圖(柱形圖,餅圖,折線圖),需要的朋友可以參考下2015-10-10java自定義ClassLoader加載指定的class文件操作
這篇文章主要介紹了java自定義ClassLoader加載指定的class文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Java實現(xiàn)自定義LinkedList類的示例代碼
LinkedList類跟ArrayList類不同,它通過指針以及結(jié)點的操作對鏈表進行增刪改查。本文就來和大家分享下Java如何為實現(xiàn)自定義LinkedList類,需要的可以參考一下2022-08-08Java數(shù)據(jù)結(jié)構(gòu)之AC自動機算法的實現(xiàn)
AC自動機算法常被認為是Trie樹+KMP算法的結(jié)合體,它是一個多模式匹配算法,在模式匹配領(lǐng)域被廣泛應用。本文將詳細為大家介紹AC自動機的原理與實現(xiàn)方法,感興趣的可以了解一下2022-12-12