使用Java實現物件導向編程——第三章 多態

來源:互聯網
上載者:User

標籤:idt   lsp   條件   width   gui   傳回值   技術分享   分享圖片   強制類型轉換   

1、多態:(polymorphism):

是具有表現多種形態能力的特徵;

(專業化的說法:)同一個實現介面(參考型別),使用不同的執行個體而執行不同的操作

指一個引用(類型)在不同情況下的多種狀態。也可以理解成:多態是指通過指向父類的指標,來調用在不同子類中實現的方法。

多態是同一個行為具有多個不同表現形式或形態的能力,

多態就是同一個介面,使用不同的執行個體而執行不同操作,多態性是對象多種表現形式的體現。

多態的優點:

  1. 消除類型之間的耦合關係

  2. 可替換性

  3. 可擴充性

  4. 介面性

  5. 靈活性

  6. 簡化性

  7、可以減少類中代碼量

  8、可以提高代碼的拓展性和可維護性

多態存在的三個必要條件:

繼承

重寫

父類引用指向子類對象

2、實現多態:

實現多態的三個要素:

    編寫具有繼承關係的父類和子類;

  子類重寫父類方法;

  使用父類的引用指向子類的對象;

實現多態的兩種方式(繼承和介面):

使用父類作為方法形參實現多態:

  Eg:使用多態最佳化主人給寵物餵食;

     

使用父類作為方法傳回值實現多態:

 

樣本(錯誤):

      

Eg1:多態的形式1:父類Pet做形參,子類做實參;

狗類(子類):

     

企鵝類(子類):

     

貓類(子類):

    

主人類:

    

測試類別:

 

 

輸出結果:

     

Eg2:多態的形式2:父類做參考型別,子類執行個體化;

測試類別(其他類見eg1)

 

運行結果(注意藍色部分):

 

Eg3:父類作為方法傳回值,自類執行個體化,類型自動轉換;

主人類(在eg1的主人類上增加代碼):

 

測試類別(其他類見eg1):

 

運行結果:

 

3、轉換:

向上轉型:子類到父類的轉換;

  //自動轉型

  Pet pet=new Dog();

 

Eg:向下轉換:

主人類:

public class Master {

       public void play(Pet pet){

               if (pet instanceof Dog) {    //如果傳入的是狗狗

                Dog dog = (Dog) pet;

                dog.catchingFlyDisc();

       }else if (pet instanceof Penguin) {   //如果傳入的是企鵝

                Penguin pgn = (Penguin) pet;

                pgn.swimming();

       }

       }

}

 

向下轉型:父類到子類的轉換(強制類型轉換):

    ●instanceof運算子:instanceof通常和強制類型轉換結合使用

    文法:

      對象  instanceof  類或介面    

Eg1:實現寵物玩的方法:

子類和寵物類:    

         

主人類:

測試類別:

 

輸出結果:

 

Eg2

public class Test {

    public static void main(String[] args) {

      show(new Cat());  // 以 Cat 對象調用 show 方法

      show(new Dog());  // 以 Dog 對象調用 show 方法

               

      Animal a = new Cat();  // 向上轉型 

      a.eat();               // 調用的是 Cat 的 eat

      Cat c = (Cat)a;        // 向下轉型 

      c.work();        // 調用的是 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("吃魚"); 

   } 

   public void work() { 

       System.out.println("抓老鼠"); 

   } 

 

class Dog extends Animal { 

   public void eat() { 

       System.out.println("吃骨頭"); 

   } 

   public void work() { 

       System.out.println("看家"); 

   } 

}

4、  附加:

●父類引用指向子類對象,引用對象只能調用子類重寫父類的方法並不能調用子類特有的方法。不然會報錯;

實現多態的條件:繼承的存在、子類重寫父類的方法、父類引用變數指向子類對象;

 

●子類轉換為父類(將一個父類的引用指向一個子類對象),稱為向上轉型;

●一個類繼承父類,且都有方法重載的過程,在調用的時候如果該子類有該方法,則用該子類方法,如果該子類沒有該方法則調用父類的該方法;

●繼承體系下,如果沒有用super關鍵字指定調用屬性和方法,先在子類中,再去父類找;

●Java中的繼承和多態。用父類聲明,執行個體化父類對象,調用的是父類中的方法。

用子類聲明,執行個體化子類,調用的是子類中的方法。

用父類聲明,執行個體化子類,調用的是子類中的重寫方法。

●子類對象賦值給父類引用,此時調用的方法是被子類重寫的方法。

 

使用Java實現物件導向編程——第三章 多態

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.