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 */
結果:

總結: 將子類向上轉型後,子類對象在內存中依舊是子類對象,即使一個父類變量指向該對象後,該對象依舊是子類對象。