基本概念
多態(tài)是面向?qū)ο缶幊陶Z(yǔ)言的關(guān)鍵特征之一。
多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力访雪。
多態(tài)就是同一個(gè)接口拄轻,使用不同的實(shí)例而執(zhí)行不同操作摘刑。
多態(tài)性是對(duì)象多種表現(xiàn)形式的體現(xiàn)。
舉例官卡,現(xiàn)實(shí)中蝗茁,比如我們按下 F1 鍵這個(gè)動(dòng)作:
- 如果當(dāng)前在 Flash 界面下彈出的就是 AS 3 的幫助文檔醋虏;
- 如果當(dāng)前在 Word 下彈出的就是 Word 幫助;
- 在 Windows 下彈出的就是 Windows 幫助和支持哮翘。
同一個(gè)事件發(fā)生在不同的對(duì)象上會(huì)產(chǎn)生不同的結(jié)果颈嚼。
多態(tài)的優(yōu)點(diǎn)
- 消除類型之間的耦合關(guān)系
- 可替換性
- 可擴(kuò)充性
- 接口性
- 靈活性
- 簡(jiǎn)化性
多態(tài)存在的三個(gè)必要條件
- 繼承
- 重寫(xiě)(子類重寫(xiě)父類的方法)
- 父類引用指向子類對(duì)象
比如:
Parent p = new Child();
當(dāng)使用多態(tài)方式調(diào)用方法時(shí),首先檢查父類中是否有該方法饭寺,如果沒(méi)有阻课,則編譯錯(cuò)誤;如果有艰匙,再去調(diào)用子類的同名方法限煞。
多態(tài)的好處:可以使程序有良好的擴(kuò)展,并可以對(duì)所有類的對(duì)象進(jìn)行通用處理员凝。
以下是一個(gè)多態(tài)實(shí)例的演示署驻,詳細(xì)說(shuō)明請(qǐng)看注釋:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 對(duì)象調(diào)用 show 方法
show(new Dog()); // 以 Dog 對(duì)象調(diào)用 show 方法
Animal a = new Cat(); // 向上轉(zhuǎn)型
a.eat(); // 調(diào)用的是 Cat 的 eat
Cat c = (Cat)a; // 向下轉(zhuǎn)型
c.work(); // 調(diào)用的是 Cat 的 catchMouse
}
public static void show(Animal a) {
a.eat();
// 類型判斷
if (a instanceof Cat) { // 貓做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃魚(yú)");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨頭");
}
public void work() {
System.out.println("看家");
}
}
執(zhí)行以上程序,輸出結(jié)果為:
吃魚(yú)
抓老鼠
吃骨頭
看家
吃魚(yú)
抓老鼠
多態(tài)的實(shí)現(xiàn)方式
方式一:重寫(xiě):
子類重新 實(shí)現(xiàn)父類的方法绊序。方式二:接口
1)生活中的接口最具代表性的就是插座硕舆,例如一個(gè)三接頭的插頭都能接在三孔插座中,因?yàn)檫@個(gè)是每個(gè)國(guó)家都有各自規(guī)定的接口規(guī)則骤公,有可能到國(guó)外就不行抚官,那是因?yàn)閲?guó)外自己定義的接口類型。
2) java中的接口類似于生活中的接口阶捆,就是一些方法特征的集合凌节,但沒(méi)有方法的實(shí)現(xiàn)。方式三:抽象類和抽象方法