Java引用變數呼叫方法時的
阿新 • • 發佈:2019-01-04
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
父類的普通方法
子類的覆蓋父類的方法
注意:
- 引用變數在編譯階段只能呼叫其編譯時型別所具有的方法,但執行時則執行它執行時型別所具有的方法。因此,編寫Java程式碼時,引用變數只能呼叫宣告該變數時所用類裡包含的方法。
- 通過引用變數來訪問其包含的例項變數時,系統總是試圖訪問它編譯時型別所定義的成員變數,而不是它執行時型別所定義的成員變數。