Java之父、子實例的內存控制

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Julin1214/article/details/51509514
1繼承成員變量和繼承方法的區別
如果在子類重寫了父類方法,意味着子類裏定義的方法會徹底的覆蓋父類裏同名的方法,系統將不可能把父類裏的方法轉移到子類中。對於實例變量則不存在這樣的現象,即使子類中定義了與父類完全同名的實例變量,這個實例變量依然不可能覆蓋父類中定義的實例變量。
因爲繼承成員變量和繼承方法之存在這樣的差別,該實例變量的值取決於聲明該變量時的類型;
當通過該變量來調用它所引用的對象的方法時,該方法行爲取決於它所實際引用的對象的類型
2內存中的子類實例
程序允許某個方法通過return this;返回調用該方法的Java對象,但不允許直接 return super;甚至不允許直接將super當成一個引用變量使用。
super關鍵字本身並沒有引用任何對象,它甚至不能被當成一個真正的引用變量使用。
子類方法不能直接使用return super;但使用return this;返回調用該方法的對象是允許的;
程序不允許直接把super當成變量使用。
對於父子對象在內存中存儲有了準確的結論:當程序創意一個子類對象時,系統不僅會爲該類中定義的實例變量分配內存,也會爲其父類中定義的所有實例變量分配內存,即使子類定義了與父類中同名實例變量。當系統創建一個Java對象的時候,如果該Java類有兩個父類(一個直接父類A,一個間接父類B),假設A類中定義了2個實例變量,B類中定義了3個實例變量,當前類中定義了2個實例變量,那這個Java對象將會保存2+3+2個實例變量。
如果在子類中定義了與父類同名的實例變量,子類中定義的變量會隱藏父類中定義的變量。注意不是完全覆蓋,因此係統中爲創建子類對象時,依然會爲父類中定義的,隱藏的變量分配內存空間。
爲了在子類方法中訪問父類中定義的,隱藏的實例變量,或者爲了在子類方法中調用父類中定義的,被覆蓋的方法,可以通過super.作爲限定來修飾這些實例變量和實例方法。
訪問哪個實例變量由聲明該變量的類型決定。
3父子類的類變量
這裏再次強調,類變量屬於類本身,實例變量則屬於Java對象。類變量在初始化類階段就完成了初始化,而實力變量則在對象初始化階段初始化。
類變量本質上屬於類本身。通常不會涉及父子實例變量那樣複雜的情形,但由於Java通過對象來訪問類變量,因此也可以使用super.作爲限定來訪問父類中定義的類變量。
如果需要訪問父類中的類變量,則有兩種方式:
直接使用父類本身的類名作爲主調來訪問類變量
使用super.作爲限定訪問父類類變量。
通常建議第一種方式來訪問父類類變量,因爲類變量屬於類本身,使用類名作爲主調來訪問父類類變量能夠保持代碼可讀性。

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