標籤: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之旅_物件導向_多態