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