10.多態(tài)

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)型。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容