1. 程式人生 > >Java引用變數呼叫方法時的

Java引用變數呼叫方法時的

Java引用變數有兩個型別,分為:編譯時型別執行時型別

編譯時型別:即宣告引用變數時的型別
執行時型別:即生成的物件的型別

例如:Animal a=new Dog();其中編譯時型別為Animal,執行時型別為Dog.

當相同型別的引用變數呼叫具有繼承關係類中的方法時,就有可能出現多型。【當把一個子類物件直接賦給父類引用變數時,這個父類引用變數的編譯時型別為父類,而執行時型別為子類,當執行時呼叫該引用變數的方法時,其方法總是表現出子類方法的行為特徵】,示例程式碼如下:

package com.exercise;

class BaseClass{
	public int book=6;
	public void base(){
		System.out.println("父類的普通方法");
	}
	public void test(){
		System.out.println("父類的被覆蓋的方法");
	}
}

public class SubClass extends BaseClass{
	public String book="輕量級Java EE企業應用實戰";
	public void test(){
		System.out.println("子類的覆蓋父類的方法");
	}
	public void sub(){
		System.out.println("子類的普通方法");
	}
	public static void main(String[] args){
		BaseClass bc=new BaseClass();
		System.out.println(bc.book);
		bc.base();
		bc.test();
		SubClass sc=new SubClass();
		System.out.println(sc.book);
		sc.base();
		sc.test();
		BaseClass p=new SubClass();
		System.out.println(p.book);
		p.base();
		p.test();
	}
}


執行結果如下:
6
父類的普通方法
父類的被覆蓋的方法
輕量級Java EE企業應用實戰
父類的普通方法
子類的覆蓋父類的方法
6
父類的普通方法
子類的覆蓋父類的方法


注意:

  1. 引用變數在編譯階段只能呼叫其編譯時型別所具有的方法,但執行時則執行它執行時型別所具有的方法。因此,編寫Java程式碼時,引用變數只能呼叫宣告該變數時所用類裡包含的方法。
  2. 通過引用變數來訪問其包含的例項變數時,系統總是試圖訪問它編譯時型別所定義的成員變數,而不是它執行時型別所定義的成員變數。