Java中多態的理解總結

多態: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種改寫需求的時候,例如打遊戲的時候,有兵種(父類)攻擊方式(父類方法),這時候玩家就可以選擇不同的兵(子類),然後就會用不同的攻擊方式(子類方法)。

很多時候,多態的理解,建議還是自己寫幾個類感受一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章