標籤:
定義:指允許不同類的對象對同一訊息做出響應。即同一訊息可以根據發送對象的不同而採用多種不同的行為方式。(發送訊息就是函數調用)
多態的前提:
A:有繼承或者實現關係。
B:有方法重寫。
C:有父類或者父介面引用指向子類對象。
多態的分類:
a:具體類多態
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
b:抽象類別多態
abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
c:介面多態
interface Fu {}
class Zi implements Fu {}
Fu f = new Zi();
多態中的成員訪問特點
A:成員變數
編譯看左邊,運行看左邊
B:構造方法
子類的構造都會預設訪問父類構造
C:成員方法
編譯看左邊,運行看右邊
D:靜態方法
編譯看左邊,運行看左邊
為什麼?
因為成員方法有重寫。
多態的好處:
A:提高代碼的維護性(繼承體現)
B:提高代碼的擴充性(多態體現)
多態的弊端:
父不能使用子的特有功能。
現象:
子可以當作父使用,父不能當作子使用。
多態中的轉型
A:向上轉型
從子到父
B:向下轉型
從父到子
1 class 孔子爹 { 2 public int age = 40; 3 4 public void teach() { 5 System.out.println("講解JavaSE"); 6 } 7 } 8 9 class 孔子 extends 孔子爹 {10 public int age = 20;11 12 public void teach() {13 System.out.println("講解論語");14 }15 16 public void playGame() {17 System.out.println("英雄聯盟");18 }19 }20 21 //Java培訓特別火,很多人來請孔子爹去講課,這一天孔子爹被請走了22 //但是還有人來請,就剩孔子在家,價格還挺高。孔子一想,我是不是可以考慮去呢?23 //然後就穿上爹的衣服,帶上爹的眼睛,粘上爹的鬍子。就開始裝爹24 //向上轉型25 孔子爹 k爹 = new 孔子();26 //到人家那裡去了27 System.out.println(k爹.age); //4028 k爹.teach(); //講解論語29 //k爹.playGame(); //這是兒子才能做的30 31 32 //講完了,下班回家了33 //脫下爹的裝備,換上自己的裝備34 //向下轉型35 孔子 k = (孔子) k爹; 36 System.out.println(k.age); //2037 k.teach(); //講解論語38 k.playGame(); //英雄聯盟39
java中多態的詳解