1.Java的對象模型相較於C++簡單很多,C++對象模型可以參考:https://blog.csdn.net/HeXiQuan123/article/details/100534110
2.希望能理解Java中引用即指針的含義。
父子對象模型如下所示:
主要考慮新增變量/函數/重寫函數
1) 父親指針指向子類對象
Father F=new Son();
F是什麼呢,F會認爲自己是,父類指針,那麼F可以訪問的相對地址範圍,就是父類大小的範圍,此時F無法調用子類新建的變量和函數。
F想想,自己是父類指針,自己偏移量n的位置,有一個Func2指針,F就去找這個Func2,沿着Func2,結果指到了被重寫的Func2函數,因爲賦值這個操作,只是用F指針指向了Son對象,並不會修改Son對象裏指針的指向。
自此,實現多態1: 父類引用子類對象,父類調用的方法是子類重寫的方法;
2) 子類指針 指向 父類對象
Son S=new Father();
肯定會報錯,畢竟兒子比爸爸nb,我想要100,你只給我50,這肯定不行
3)強制類型轉換
Son S=(Son)new Father()
強行用S指向new的Father對象,貌似Idea會編譯報錯。這種寫法是危險的,如果編譯器不檢查,S可能會去訪問未分配的內存,從途中可以看到,S訪問new Func的時候,但是 Father對象中沒有這部分代碼,會拋出錯誤。
Father F=new Son();
Son S=(Son) F;
這個可以編譯通過,最終結果就是還是Son引用指向了Son對象。在使用強制類型轉換後,應利用instanceof檢查類型是否對應,這一部分信息(C++中是在對象頭部添加Type_Info信息),Java應該也差不多,我們主要關注多態的地方,這部分暫時可以不考慮。
如何利用多態呢?
公司希望拿一個數組存儲所有員工的工資,員工氛圍Manager和Employee,Manager和Employee的工資計算方式不同
令Employee(父)派生Manager(子),Empoyee有一個getSalary() 返回Salary, Manager重寫getSalary返回 Salary+bonus;
就可以寫如下Employee數組來存放兩種類型,而不需要兩個數組。
Employee x=new Manager("hexiquan",20);
Employee y=new Employee("nauqixeh",200);
List<Employee> arr=new ArrayList<>(5);
arr.add(x);
arr.add(y);
for(Employee i:arr){
i.getSalary(5);
}
最後輸出:先調用Manager的getSalary,再調用Employee的getSalary
Manager
Employee