多型的使用和概述以及弊端和好處
阿新 • • 發佈:2019-01-28
多型的概述
多型的概述
多型:同一個物件(事物),在不同時刻體現出來的不同狀態。
舉例:
貓是貓,貓是動物。
水(液體,固體,氣態)。
多型的前提:
A:要有繼承關係。
B:要有方法重寫。
其實沒有也是可以的,但是如果沒有這個就沒有意義。
動物 d = new 貓();
d.show();
動物 d = new 狗();
d.show();
C:要有父類引用指向子類物件。
程式碼體現
父 f = new 子(); class Fu { public int num = 100; public void show() { System.out.println("show Fu"); } public static void function() { System.out.println("function Fu"); } } class Zi extends Fu { public int num = 1000; public int num2 = 200; public void show() { System.out.println("show Zi"); } public void method() { System.out.println("method zi"); } public static void function() { System.out.println("function Zi"); } } class DuoTaiDemo { public static void main(String[] args) { //要有父類引用指向子類物件。 //父 f = new 子(); Fu f = new Zi(); System.out.println(f.num); //找不到符號 //System.out.println(f.num2); f.show(); //找不到符號 //f.method(); f.function(); }
}
多型的程式碼理解
多型的問題理解: class 孔子爹 { public int age = 40; public void teach() { System.out.println("講解JavaSE"); } } class 孔子 extends 孔子爹 { public int age = 20; public void teach() { System.out.println("講解論語"); } public void playGame() { System.out.println("英雄聯盟"); } } //Java培訓特別火,很多人來請孔子爹去講課,這一天孔子爹被請走了 //但是還有人來請,就剩孔子在家,價格還挺高。孔子一想,我是不是可以考慮去呢? //然後就穿上爹的衣服,帶上爹的眼睛,粘上爹的鬍子。就開始裝爹 //向上轉型 孔子爹 k爹 = new 孔子(); //到人家那裡去了 System.out.println(k爹.age); //40 k爹.teach(); //講解論語 //k爹.playGame(); //這是兒子才能做的 //講完了,下班回家了 //脫下爹的裝備,換上自己的裝備 //向下轉型 孔子 k = (孔子) k爹; System.out.println(k.age); //20 k.teach(); //講解論語 k.playGame(); //英雄聯盟
多型的好處
A:提高了程式碼的維護性(繼承保證)
B:提高了程式碼的擴充套件性(由多型保證)
多型的弊端
不能使用子類的特有功能。 因為呼叫method方法的時候首先回去找父類中有沒有這個方法 結果父類中沒有這個方法 所以就會報錯
弊端的解決辦法
不能使用子類的特有功能。 我就想使用子類的特有功能?行不行? 行。 怎麼用呢? A:建立子類物件呼叫方法即可。(可以,但是很多時候不合理。而且,太佔記憶體了) B:把父類的引用強制轉換為子類的引用。(向下轉型) 物件間的轉型問題: 向上轉型: Fu f = new Zi(); 向下轉型: Zi z = (Zi)f; //要求該f必須是能夠轉換為Zi的。
程式碼解釋
class Fu {
public void show() {
System.out.println("show fu");
}
}
class Zi extends Fu {
public void show() {
System.out.println("show zi");
}
public void method() {
System.out.println("method zi");
}
}
class DuoTaiDemo4 {
public static void main(String[] args) {
//測試
Fu f = new Zi();
f.show();
//f.method();
//建立子類物件
//Zi z = new Zi();
//z.show();
//z.method();這個是可以呼叫show和method方法的 但是又要為新的物件Zi開闢記憶體空間 這樣的做法顯然是不合理的
//你能夠把子的物件賦值給父親,那麼我能不能把父的引用賦值給子的引用呢?
//如果可以,但是如下
Zi z = (Zi)f;
z.show();
z.method();
}
}
多型繼承中的記憶體圖解
多型中物件變化記憶體圖解