首頁 > Java > java教程 > 主體

對於Java中多態性的補充

无忌哥哥
發布: 2018-07-23 10:39:33
原創
1293 人瀏覽過

Java引用類型有兩個類型:一個是編譯時類型,另一個是執行時間類型。編譯時類型由宣告變數時使用的類型,執行時間類型有實際賦給該變數的物件決定。如果編譯時類型和執行時間類型不一致,就可能出現所謂多態。

public class BaseClass {

	public int book = 6;
	public void base() {
		System.out.println("父类中的普通方法");
	}
	public void text() {
		System.out.println("父类中被覆盖的方法");
	}
}
登入後複製
public class subClass extends BaseClass{
	public String book ="java";
	public void text() {
		System.out.println("子类中覆盖父类的方法");
	}
	public void sub() {
		System.out.println("子类中的普通方法");
	}
	public static void main(String[] args) {
		//下面编译时类型和运行时类型完全一样,所以不存在多态
		BaseClass bc = new BaseClass();
		System.out.println(bc.book);
		//下面两次调用的是BaseClass的方法
		bc.text();
		bc.base();
		subClass sc = new subClass();
		System.out.println(sc.book);
		//下面调用的是subClass类的方法
		sc.sub();
		sc.text();
		//下面编译时类型与运行时类型是不一样的,就是所谓的多态
		BaseClass bs = new subClass();
		System.out.println(bs.book);
		bs.text();
		bs.base();
		//bs.sub();
		//bs是父类的类型,他访问的是父类的shi'li'bian'liang
	}
	
}
登入後複製

上面程式的main()方法中創造了三個變量,前兩個引用變量,他們的編譯時類型和運行時類型完全相同,因此調用他們的成員變量和成員方法非常正常,但是第三個變數的編譯時類型和執行時間類型不一致,當呼叫這個引用變數的text方法是,在父類別中定義了該方法,子類別中將這個方法覆寫掉,實際執行的方法是子類別中覆寫父類別的方法。

Java允許將子類別物件直接賦給一個父類別的參考變量,而無需任何的類型轉換,或稱為向上轉型,向上轉型有系統自動完成。

當執行階段呼叫該引用變數的方法時,其方法行為總是表現出子類別的行為特徵,而不是父類別的行為特徵,這就可能出現:相同類型的變數'呼叫同一個方法是呈現不同的行為特徵,而不是父類別的行為特徵,這就是多態。

與方法不同的是,物件的實例變數則不具備多態性。

结果:
6
父类中被覆盖的方法
父类中的普通方法
java
子类中的普通方法
子类中覆盖父类的方法
6
子类中覆盖父类的方法
父类中的普通方法
登入後複製

注意

  1. #引用變數在編譯階段只能呼叫其編譯時類型所具有的方法,但運行時則執行它運行時類型所具有的方法,因此,當編寫Java程式碼時,引用變數只能呼叫宣告該變數時所用類別中的方法。

  2. #透過引用類型變數來存取其包含的實例變數時,系統總是試圖存取定義該變數的編譯時類型所定義的實例變量,而不是它運行時所定義的實例變數。

以上是對於Java中多態性的補充的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板