1、理解多態思想
學了繼承關系,我們知道繼承關系是一種“is a”的關系,也就是說父類的一種特殊情況,我們看一下下邊這個例子
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(); // 吃魚。。。
}
}
- 子類的對象也是動物,那么可不可以認為狗/貓對象就是動物類型的對象
Animal d = new Dog();
Animal c = new Dog();
當代碼像這樣寫的時候多態就產生了
Animal a = new Dog();
對象(a)具有兩種類型:
- 編譯類型:聲明對象變量的類型:Animal,表示把對象看成是什么類型
- 運行類型:對象的真實類型:Dog,運行類型->對象的真實類型
- 編譯類型必須是運行類型的父類或者相同
當編譯類型和運行類型不同的時候,多態就產生了。
所謂多態就是對象具有多種形態,對象可以存在不同的形式
Animal a = null;
a = new Dog(); // a此時表示Dog類型的形態
a = new Cat(); // a此時表示Cat類型的形態
- 多態的前提:可以使繼承關系,也可以是實現關系(接口和實現類),在開發中一般指的是第二種
- 多態的特點:把子類對象賦給父類變量,在運行時期會表現出具體的子類特征(調用子類方法)
2、多態的好處
當把不同的子類對象當作父類類型來看待,可以屏蔽不同子類對象之間的實現差異,從而寫出通用的代碼達到通用編程,以適應需求的不斷變化。
下邊的代碼中 我們將上邊的代碼示例增加一個Person類,喂養的方法傳入Animal類,根據傳入的具體類型調用具體類型的方法。
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... 吃魚。。。
}
}