JAVA多態的內存解釋/用父對象初始化子對象/子對象初始化父對象

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
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章