Java之旅_物件導向_多態

來源:互聯網
上載者:User

標籤:java   font   log   dog   nbsp   oob   rac   引用   存在   

參考並摘自:http://www.runoob.com/java/java-polymorphism.html

多態

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

多態就是同一個介面,使用不同的執行個體而執行不同的操作。

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

1.繼承  2.重寫  3.父類引用指向子類對象

如Parent a = new Child();

當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調用子類的同名方法。

多態的好處:可以使程式有良好的擴充,並可以對所有類的對象進行通用處理。

多態執行個體:

abstract class Animal{    abstract void eat();}class Cat extends Animal{    public void eat(){        System.out.println("eat fish");    }    public void work(){        System.out.println("catch mouse");    }}class Dog extends Animal{    public void eat(){        System.out.println("eat bone");    }    public void work(){        System.out.println("watch home");    }}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 c = (Cat)a; //向下轉型        c.work();    }    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(); } }}

 

//運行結果eat fishcatch mouseeat bonewatch homeeat fishcatch mouse

 虛方法:

class Animal{    public Animal(int a){        System.out.println("superclass...");    }    public void eat(){        System.out.println("superclass test....");    }    public void eat2(){        System.out.println("superclass eat2...");    }    public void doeat(){        //空方法,實際運行子類方法    }}class Cat extends Animal{    public Cat(){        super(100);//父類構造器帶參數時,子類構造器中必須通過super調用父類構造器並配參數。        System.out.println("subclass..");    }    public void eat2(){        System.out.println("subclass eat2...");    }    public void doeat(){        eat(); //父類有,子類沒有,子類直接調用        eat2(); //父類有,子類重寫,調用子類方法直接調用        this.eat2();//同上        super.eat2();//父類有,子類重寫,調用父類方法用super    }    }public class Test{    public static void main(String[] args){        Animal a = new Cat(); //父類引用指向子類對象        a.doeat();    }}
//運行結果:
superclass...
subclass..superclass test....subclass eat2...subclass eat2...superclass eat2...

編譯的時候,編譯器使用父類中的方法驗證,運行時使用子類方法執行,該過程稱為虛擬方法調用,該方法稱為虛擬方法。

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.