多態的使用和概述以及弊端和好處


多態的概述

多態的概述

多態:同一個對象(事物),在不同時刻體現出來的不同狀態。
舉例:
貓是貓,貓是動物。
水(液體,固體,氣態)。

多態的前提:
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();
}

}

多態繼承中的內存圖解

這里寫圖片描述

多態中對象變化內存圖解

這里寫圖片描述


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com