1.什么是多態(tài)
- 求面積的功能,圓、矩形、三角形實現(xiàn)起來是不一樣的;跑的動作,小貓、小狗和大象,跑起來是不一樣的。
- 所以,多態(tài)就是同一種行為的多種表現(xiàn)方式;
2. 前提 (重點)
- 繼承父類或者實現(xiàn)接口
- 子類方法的重寫(不重寫,沒有意義)
- 父類引用指向子類對象
3.格式的體現(xiàn)
父類類型 變量名 = new 子類對象
變量名.方法() // 這個方法在父類聲明,在子類重寫
編譯時,看父類,是只能調(diào)用父類聲明的方法,不能調(diào)用子類擴展的方法,運行時看子類,是一定是子類擴展的方法
4.多態(tài)的好處
事跡開發(fā)中,父類類型作為方法形式參數(shù),傳遞子類對象給方法,進行方法的調(diào)用,更能體現(xiàn)出多態(tài)的便利和擴展性
5.代碼測試
// 定義父類
public abstract class Animal{
public abstract void eat();
}
// 定義子類
class Cat extends Animal{
public void eat(){
System.out.println("吃魚")
}
}
public Dog extends Animal{
public void eat(){
System.out.println("吃骨頭")
}
}
// 測試類
public class test{
public static void main(String[] args){
// 多態(tài)形式 創(chuàng)建對象
Cat c = new Cat();
Dog d = new Dog();
// 調(diào)用showCatEat
showCatEat(c);
// 調(diào)用showDogEat
showDogEat(d);
/*
以上兩個方法, 均可以被showAnimalEat(Animal a)方法所替代
而執(zhí)行效果一致
*/
showAnimalEat(c);
showAnimalEat(d);
}
public static void showCatEat (Cat c){
c.eat();
}
public static void showDogEat (Dog d){
d.eat();
}
// 父類類型可以接受子類對象
public static void showAnimalEat (Animal a){
a.eat();
}
}
- 由于多態(tài)特性的支持,showAnimalEat方法的Animal類型,是Cat和Dog的父類類型,父類類型接收子類對象,當然可以把Cat對象和Dog對象,傳遞給方法。
- 當eat方法執(zhí)行時,多態(tài)規(guī)定,執(zhí)行的是子類重寫的方法,那么效果自然與showCatEat、showDogEat方法一致,所以showAnimalEat完全可以替代以上兩方法。
6.多態(tài)數(shù)組
例如:家里養(yǎng)了兩只貓,兩條狗,想要統(tǒng)一管理他們的對象,可以使用多態(tài)數(shù)組
public class TestAnimal {
public static void main(String[] args) {
Animal[] all = new Animal[4];//可以存儲各種Animal子類的對象
all[0] = new Cat();
all[1] = new Cat();
all[2] = new Dog();
all[3] = new Dog();
for (int i = 0; i < all.length; i++) {
all[i].eat();//all[i]編譯時是Animal類型,運行時看存儲的是什么對象
}
}
}
7.多態(tài)轉(zhuǎn)型
- 向上轉(zhuǎn)型 : 多態(tài)本身是子類類型向父類類型向上轉(zhuǎn)換的過程,當父類引用指向一個子類對象時,便是向上轉(zhuǎn)型,格式是:
父親類型 變量名 = new 子類類型()
Animal a = new Dog();
- 向下轉(zhuǎn)型:父類類型向子類類型向下轉(zhuǎn)換的過程,這個過程是強制的。
子類類型 變量名 = (子類類型) 父類變量名;
如:Cat c =(Cat) a;
為什么要轉(zhuǎn)型
當使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤。也就是說,不能調(diào)用子類擁有,而父類沒有的方法。編譯都錯誤,更別說運行了。這也是多態(tài)給我們帶來的一點"小麻煩"。所以,想要調(diào)用子類特有的方法,必須做向下轉(zhuǎn)型。