Java---多态
1>Java引用變量有兩個類型,一個是編譯時類型,一個是運行時類型。
編譯時類型由聲明該變量時使用的類型決定,運行時類型由實際賦給該變量的對象決定。
如果編譯時類型和運行時類型不一致時,就可能出現所謂的多態。
2>測試
2.1>基類
package com.demo.poly;public class BaseClass {public int book=6;public void base(){System.out.println("---父類的普通方法---base()");}public void test(){System.out.println("---父類的普通方法---test()");}}
2.2>子類
package com.demo.poly;public class SubClass extends BaseClass {//重新定義一個book實例變量隱藏父類的book實例變量public String book="JAVA SE";public void sub(){System.out.println("***子類的普通方法***sub()");}public void test(){System.out.println("***子類的普通方法***test()");}}2.3>測試類
package com.demo.poly;public class PolyDemo {public static void main(String[] args) {// TODO Auto-generated method stub//編譯時類型和運行時類型不一樣,因此有可能會發生多態BaseClass bc= new SubClass();bc.base();/** 引用變量 bc 的編譯時類型是BaseClass,而運行時類型是SubClass* 當調用該引用 變量的test()方法時(BaseClass 類中定義了該方法,子類SubClass 覆蓋(Override)了父類的方法),* 實際執行的時SubClass類中的覆蓋了后的test()方法,這就可能出現多態了。 * * 如下所示的調用,執行SubClass中具有的方法test()*/bc.test();/* 引用變量 bc 的編譯時類型是BaseClass,而運行時類型是SubClass* 當調用子類的方法sub()時,會出現如下編譯錯誤:* The method sub() is undefined for the type BaseClass.* 引用變量在編譯階段只能調用其編譯時類型所具有的方法,但是運行時則會執行其運行時類型所具有的方法,* 所以編寫Java代碼時,引用變量只能調用聲明該變量時所用類里包含的方法,而不能調用其運行時類型類里所包含的方法。* *///bc.sub();/** 可以通過 強制類型轉換實現* 即調用引用變量的運行時類型所具有的方法,* 引用類型之間的類型轉換只能在具有繼承關系的兩個類型之間進行,* 如果兩個沒有任何繼承關系的類型,則無法進行類型轉換,將在編譯時出現錯誤。* * 如果試圖把一個父類型實例轉換成子類類型,則這個父類實例必須是子類類型(即編譯時類型是父類型,運行時是子類類型)才行,* 否則將會出現ClassCastException異常。* */SubClass sc;if(bc instanceof SubClass){sc=(SubClass)bc;sc.sub();}else {System.out.println("----------Error");}/** 對象的實例變量則不具備多態性* 通過引用變量來訪問其包含的實例變量時,系統總是試圖訪問它編譯時類型所定義的成員變量,* 而不是它運行時類型所定義的成員變量* */System.out.println("----book:"+bc.book);//6,而不是“JAVA SE”}}
?運行結果如下:
總結
- 上一篇: Java---形参个数可变的方法
- 下一篇: Java 对象初始化过程