多態:polymorphism
多態: poly + morphism 許多形態
在希臘語中,poly指的是許多,morphism指的是形態
其中多態包括:
編譯時多態
運行時多態
編譯時多態:
在編譯時決定編譯所需要使用的目標方法。通常是父類所決定
運行時多態:
在運行時決定運行所需要使用的目標方法,通常是子類所決定,如果子類沒有重寫父類該方法,那麼將使用父類的方法。
其實編譯時多態和運行時多態就是我們常說的,編譯看父類,運行看子類,在使用多態的時候,編譯時應注意父類有無聲明該方法,若無聲明,那麼將編譯報錯。
舉例體現多態
創建一個父類
package Fs;
public class Father {
void eat () {
System.out.println("father eat");
}
void sleep() {
System.out.println("father sleep");
}
}
創建一個子類1,只重寫父類的eat方法
package Fs;
public class Son_1 extends Father {
@Override
void eat() {
System.out.println("son1 eat");
}
}
創建一個子類2,重寫父類的eat和sleep方法
package Fs;
public class Son_2 extends Father {
@Override
void eat() {
System.out.println("son_2 eat");
}
@Override
void sleep() {
System.out.println("son_2 sleep");
}
}
創建一個運行類:
package Fs;
public class Run {
public static void main(String[] args) {
System.out.println("=========父類對象==========");
Father f1 = new Father();
f1.eat();
f1.sleep();
System.out.println();
System.out.println("=========子類對象賦予父類引用,son1子類只重寫eat方法=========");
Father f2 = new Son_1();
f2.eat();
f2.sleep();
System.out.println();
System.out.println("=========子類對象賦予父類引用,son2子類重寫eat和sleep方法=========");
Father f3 = new Son_2();
f3.eat();
f3.sleep();
}
}
測試結果:由測試的結果,我們可以看到,當子類只重寫了父類部分方法的時候,通過多態調用該方法,編譯時候會先檢查父類的該方法,編譯通過以後,運行時檢查子類有無重寫該方法,如果有,那麼將使用子類重寫後的方法,沒有則將使用父類的方法。
=========父類對象==========
father eat
father sleep
=========子類對象賦予父類引用,son1子類只重寫eat方法=========
son1 eat
father sleep
=========子類對象賦予父類引用,son2子類重寫eat和sleep方法=========
son_2 eat
son_2 sleep
多態的運用更多是在父類有通用的方法,子類對父類的方法有n種改寫需求的時候,例如打遊戲的時候,有兵種(父類)攻擊方式(父類方法),這時候玩家就可以選擇不同的兵(子類),然後就會用不同的攻擊方式(子類方法)。
很多時候,多態的理解,建議還是自己寫幾個類感受一下。