日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java多态+多态中隐含的问题

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多态+多态中隐含的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】RAEDME

0.1)本文總結于 core java volume 1, 感覺多態中存在的這個問題很新穎,故分享之;


【1】繼承與is-a法則

1.1)有一個用來判斷是否應該設計為繼承關系的規則: 這就是 is-a 規則, 它表明子類的每個對象也是超類的對象;
1.2)is-a法則: is-a 法則 的另一種表述法是 置換法則, 它表明程序中出現超類對象的任何地方都可以用子類對象置換;
如, 可以將子類的對象賦給超類變量:

Employee e; e = new Employee(); e = new Manager();

【2】多態

2.1)多態定義: 在java中, 對象變量是多態 的, 一個 Employee變量既可以引用一個 Employee 類對象,也可以引用一個 Employee 類的 任何子類對象;
2.2)從以下代碼,就可以看出 置換法則的優點:

Manager boss = new Manager(......); Employee[] staff = new Employee[3]; staff[0] = boss; staff[1] = new Employee("tangtang", 1, 2, 3, 4); staff[2] = new Employee("rongrong", 4, 3, 2, 1);

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中, 子類數組的引用可以轉換成超類數組的引用, 而不需要采用強制類型轉換, 如,下面是一個經理數組:

Manager[] managers = new Manager[10];

將它轉換為 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多态+多态中隐含的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。