多態(tài)(Polymorphism)
1. 什么是多態(tài)呢?
多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(OOP)的一個重要特征,多態(tài)的字面意思就是多種狀態(tài)。在面向?qū)ο笳Z言中,同一操作作用于不同的對象,可以有不同的實現(xiàn)方式,產(chǎn)生不同的執(zhí)行結(jié)果。簡單的說來就是一句話:使用父類類型的引用指向子類的對象。
簡單例子:我們小時候每年過年要向長輩拜年,每年得到壓歲錢跟往年幾乎是一樣的。今年你學習成績優(yōu)秀,問聲“爺爺過年好”,爺爺很高興,很可能多給了你500塊錢(方法重寫)。問聲“叔叔過年好”,叔叔也很高興,也多給了你100塊錢(方法重寫)。對于拜年這個動作,對于不同的人,得到壓歲錢也不同,這就是多態(tài)。
public class NewYearMoney {
public void getNewYearMoney(){
System.out.println("往年拜年壓歲錢: 500塊");
}
}
public class GrandpaNewYearMoney extends NewYearMoney {
public void getNewYearMoney(){
System.out.println("我今年給孫子壓歲錢: 1000塊");
}
}
public class UncleNewYearMoney extends NewYearMoney {
public void getNewYearMoney(){
System.out.println("我今年給侄子壓歲錢: 600塊");
}
}
public class HappyNewYear{
public static void main(String[] args) {
NewYearMoney n = new NewYearMoney();
n.getNewYearMoney();
NewYearMoney g = new GrandpaNewYearMoney();
g.getNewYearMoney();
NewYearMoney u = new UncleNewYearMoney();
u.getNewYearMoney();
}
}
// 往年拜年壓歲錢: 500塊
// 我今年給孫子壓歲錢: 1000塊
// 我今年給侄子壓歲錢: 600塊
2. 我們?yōu)槭裁匆枚鄳B(tài)?
我們知道,封裝可以隱藏實現(xiàn)細節(jié),使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。而多態(tài)除了提高代碼的復(fù)用性外,還可以解決項目中緊偶合的問題,提高程序的可擴展性.。耦合度講的是模塊模塊之間,代碼代碼之間的關(guān)聯(lián)度。通過對系統(tǒng)的分析把他分解成一個一個子模塊,子模塊提供穩(wěn)定的接口,達到降低系統(tǒng)耦合度的的目的,模塊模塊之間盡量使用模塊接口訪問,而不是隨意引用其他模塊的成員變量。 派生類的功能可以被基類的方法或引用變量所調(diào)用,這叫向后兼容,可以提高可擴充性和可維護性。
3. 多態(tài)分類
多態(tài)一般分為兩種:編譯時多態(tài)和運行時多態(tài)。
編譯時多態(tài)(重載式多態(tài)):也就是說這種多態(tài)在編譯時已經(jīng)確定好了。重載大家都知道,方法名相同而參數(shù)列表不同的一組方法就是重載。在調(diào)用這種重載的方法時,通過傳入不同的參數(shù)最后得到不同的結(jié)果。
有人覺得重載因為針對的是方法,不是面向?qū)ο缶幊趟枷胩赜械?。而面向?qū)ο蟮娜筇匦灾皇嵌鄳B(tài),由此可見,重載不是面向?qū)ο螅敲嫦蚍椒?,故不是多態(tài)。所以,我們暫且認為是特殊的多態(tài)吧。
運行時多態(tài)(重寫式多態(tài)):這種多態(tài)通過動態(tài)綁定(dynamic binding)技術(shù)來實現(xiàn),是指在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法。
4. 使用運行時多態(tài)要注意什么?
① JAVA運行時系統(tǒng)根據(jù)調(diào)用該方法的實例的類型來決定選擇調(diào)用哪個方法則被稱為運行時多態(tài)。
② Java多態(tài)運行的三個表要存在條件:繼承、重寫、父類引用指向子類對象。
寫完嘍!ㄟ(▔,▔)ㄏㄟ(▔,▔)ㄏㄟ(▔,▔)ㄏ
知識重在總結(jié)和梳理,只有不斷地去學習并運用,才能化為自己的東西。當你能為別人講明白的時候,說明自己已經(jīng)掌握了。
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處!
如果有錯誤的地方,或者有您的見解,還請不嗇賜教!
喜歡的話,麻煩點個贊!