《疯狂Java讲义精粹》读书笔记2 ------ 多态
-----------------《瘋狂Java講義精粹》2讀書筆記---------------
Java引用變量有兩個類型:
· 編譯時類型(由聲明該變量時使用的類型決定)
· 運行時類型(由實際賦給該變量的對象決定)
當編譯時類型和運行時類型不一致,就可能出現多態(Polymorphism)。往往是相同類型的變量、調用同一個方法時呈現出多種不同的行為特征。
?
看下面這個例子:
1 public class TestExtends extends BaseClass{ 2 public String book = "子類的book成員"; 3 public void test(){ 4 System.out.println("子類覆蓋父類的test方法"); 5 } 6 public void sub(){ 7 System.out.println("子類自己的方法"); 8 } 9 10 public static void main(String[] args) { 11 /** 12 * 子類其實是一種特殊的父類,因此Java允許把一個子類對象直接賦給一個父類引用, 13 * 無需仍和轉換,或者稱為向上轉型(upcasting),由系統自動完成。 14 */ 15 BaseClass bc = new TestExtends();//父類引用指向子類對象 16 System.out.println(bc.book);//調用父類的book 17 bc.base();//調用基類的普通方法 18 bc.test();//調用子類覆蓋的方法 19 //bc.sub();//將會出錯 20 } 21 }結果為:
6基類的普通方法....子類覆蓋父類的test方法?
通過引用變量來訪問其包含的實例成員時,系統總是訪問它編譯時所定義的成員,而不是運行時所定義的成員,即使它實際所引用的對象確實包含該方法。
例如上面的引用變量bc想調用運行時的成員方法sub(即bc.sub())時就會出錯。
那么怎么才能讓這個引用變量調用它運行時的成員方法呢?
其實很簡單,只需要強制轉換類型就可以了。也就是說:強制轉換類型可以將一個引用類型的變量轉換成其子類類型。當然,在執行強制轉換類型時應當注意:
· 基本類型的轉換只能在數值類型(整形、字符型和浮點型)之間轉換。數值類型和布爾類型之間不能進行類型轉換。
· 引用類型之間的轉換只能在具有繼承關系的兩個類型之間轉換。如果試圖把一個父類型轉換成子類類型,則這個對象必須實際上是子類實例才行(即編譯時類型為父類型,而運行時類型為子類類型才行),否則會出現ClassCastException異常。
例如:將上面的代碼第19行進行強制類型轉換從而調用子類的成員方法:
19 ((TestExtends) bc).sub();//轉換后調用運行時的成員方法運行的結果為:
6基類的普通方法....子類覆蓋父類的test方法子類自己的方法?
轉載于:https://www.cnblogs.com/CocoonFan/archive/2013/03/05/2943663.html
總結
以上是生活随笔為你收集整理的《疯狂Java讲义精粹》读书笔记2 ------ 多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽世界怀旧服伊崔格的智慧怎么做 伊崔格
- 下一篇: 酒馆亚煞极怎么玩