java多态+多态中隐含的问题
【0】RAEDME
0.1)本文總結于 core java volume 1, 感覺多態中存在的這個問題很新穎,故分享之;
【1】繼承與is-a法則
1.1)有一個用來判斷是否應該設計為繼承關系的規則: 這就是 is-a 規則, 它表明子類的每個對象也是超類的對象;
1.2)is-a法則: is-a 法則 的另一種表述法是 置換法則, 它表明程序中出現超類對象的任何地方都可以用子類對象置換;
如, 可以將子類的對象賦給超類變量:
【2】多態
2.1)多態定義: 在java中, 對象變量是多態 的, 一個 Employee變量既可以引用一個 Employee 類對象,也可以引用一個 Employee 類的 任何子類對象;
2.2)從以下代碼,就可以看出 置換法則的優點:
2.3)在上面的代碼中, 變量 staff[0] 和 boss 引用同一個對象, 但編譯器將 staff[0] 看做是 Employee對象;
2.4)這意味著, 可以這樣調用 boss.setBonus(…) ;但是不可以這么調用: staff[0].setBonus(……); 這是因為 staff[0] 聲明的類型是 Employee, 而setBonus 不是 Employee 類的方法;
2.5)也不能將一個超類的引用賦給子類變量,下面的賦值是非法的:
Manager m = staff[i]; 非法;原因很清楚, 不是所有的雇員都是經理;
Alert) 在java中, 子類數組的引用可以轉換成超類數組的引用, 而不需要采用強制類型轉換, 如,下面是一個經理數組:
將它轉換為 Employee 數組是完全合法的:
Employee[] staff = managers;【3】java多態機制存在的問題(很隱秘, 這個問題)
3.1)這樣做后,存在的問題(切記 managers 和 staff 引用的是同一個數組):
如, staff[0] = new Employee(“XiaoTang”, ……);
編譯器竟然接納了這個賦值操作。但這里, staff[0] 和 managers[0] 引用的是同一個對象, 似乎我們把一個普通員工歸入經理的行列了, 這是一種很忌諱發生的事情;當調用 managers[0].setBonus(10000)的時候, 將會導致調用一個不存在的實例域, 進而攪亂相鄰存儲空間的內容;
3.2)為了確保不發生這類錯誤, 所有數組都要牢記創建它們的元素類型,并負責監督僅將類型兼容的引用存儲到數組中;
總結
以上是生活随笔為你收集整理的java多态+多态中隐含的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel每日一练:三步制作动态图表,无
- 下一篇: 清理磁盘空间教你一招咋样清理磁盘空间