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 子类中覆盖父类的方法 父类中的普通方法
以上是對於Java中多態性的補充的詳細內容。更多資訊請關注PHP中文網其他相關文章!