1 /* 2 需求:設計一個簡單的java程序,證明強制轉換語句並不能改變其在內存中的形式 3 思路:設計一個父子類,創建子類對象,將子類向上轉型,查看轉型前後該對象在內存中是否發生變化 4 */ 5 6 class ExchangeTest 7 { 8 public static void main(String[] args) 9 { 10 Child c = new Child(23); 11 System.out.println(c); 12 Father f = (Father)c; 13 c.show(); 14 f.show(); 15 System.out.println(f);//c和f都是指向了內存中同一個對象,且該對象是Child的實例對象 16 } 17 } 18 19 class Father 20 { 21 int worknum; 22 Father(int i){ 23 worknum = i; 24 } 25 void show(){ 26 System.out.println("Father " + worknum); 27 } 28 } 29 30 class Child extends Father 31 { 32 int studynum; 33 Child(int i){ 34 super(i); 35 studynum = i; 36 } 37 void show(){ 38 System.out.println("Child " + studynum); 39 } 40 } 41 42 43 /* 44 總結: 45 將子類向上轉型後,子類對象在內存中依舊是子類對象,即使一個父類變量指向該對象後,該對象依舊是子類對象。 46 47 48 運行時出現的bug 49 ----------------------------------------------------------------------------------- 50 ExchangeTest.java:31: 錯誤: 無法將類 Father中的構造器 Father應用到給定類型; 51 Child(int i){ 52 ^ 53 需要: int 54 找到: 沒有參數 55 原因: 實際參數列表和形式參數列表長度不同 56 1 個錯誤 57 58 錯誤原因: 子類構造函數Child(int i){}中首行有個隱藏的默認語句super();該語句會調用 59 父類的空參構造函數,因為父類寫了Father(int i){} 所以原來隱藏的Father(){} 60 沒有了,因此子類構造函數中的super()找不到Father(){} 因此報錯 61 ----------------------------------------------------------------------------------- 62 */
結果:
總結: 將子類向上轉型後,子類對象在內存中依舊是子類對象,即使一個父類變量指向該對象後,該對象依舊是子類對象。