1饲鄙、理解多態(tài)思想
學(xué)了繼承關(guān)系,我們知道繼承關(guān)系是一種“is a”的關(guān)系,也就是說父類的一種特殊情況说莫,我們看一下下邊這個例子
class Animal {
public void eat(){
System.out.println("吃一般的食物");
}
}
class Dog extends Animal {
@Override
public void eat() {
super.eat();
System.out.println("吃肉骨頭");
}
}
class Cat extends Animal {
@Override
public void eat() {
super.eat();
System.out.println("吃魚。舔糖。愈犹。");
}
}
public class Demo {
public static void main(String[] args) {
Animal a = new Dog();
a.eat(); // 吃肉骨頭
a = new Cat();
a.eat(); // 吃魚。阻荒。挠锥。
}
}
- 子類的對象也是動物,那么可不可以認(rèn)為狗/貓對象就是動物類型的對象
Animal d = new Dog();
Animal c = new Dog();
當(dāng)代碼像這樣寫的時候多態(tài)就產(chǎn)生了
Animal a = new Dog();
對象(a)具有兩種類型:
- 編譯類型:聲明對象變量的類型:Animal侨赡,表示把對象看成是什么類型
- 運行類型:對象的真實類型:Dog蓖租,運行類型->對象的真實類型
- 編譯類型必須是運行類型的父類或者相同
當(dāng)編譯類型和運行類型不同的時候,多態(tài)就產(chǎn)生了羊壹。
所謂多態(tài)就是對象具有多種形態(tài)蓖宦,對象可以存在不同的形式
Animal a = null;
a = new Dog(); // a此時表示Dog類型的形態(tài)
a = new Cat(); // a此時表示Cat類型的形態(tài)
- 多態(tài)的前提:可以使繼承關(guān)系,也可以是實現(xiàn)關(guān)系(接口和實現(xiàn)類)油猫,在開發(fā)中一般指的是第二種
- 多態(tài)的特點:把子類對象賦給父類變量稠茂,在運行時期會表現(xiàn)出具體的子類特征(調(diào)用子類方法)
2、多態(tài)的好處
當(dāng)把不同的子類對象當(dāng)作父類類型來看待情妖,可以屏蔽不同子類對象之間的實現(xiàn)差異睬关,從而寫出通用的代碼達(dá)到通用編程诱担,以適應(yīng)需求的不斷變化。
下邊的代碼中 我們將上邊的代碼示例增加一個Person類电爹,喂養(yǎng)的方法傳入Animal類蔫仙,根據(jù)傳入的具體類型調(diào)用具體類型的方法。
class Person {
public void feed(Animal a) {
System.out.println("feeding...");
a.eat();
}
}
public class Demo {
public static void main(String[] args) {
Person p = new Person();
Dog d = new Dog();
p.feed(d); // feeding... 吃肉骨頭
Cat c = new Cat();
p.feed(c); // feeding... 吃魚藐不。匀哄。。
}
}