Java繼承內存分配

        在學習編程的過程中,我覺得不止要獲得課本的知識,更多的是通過學習技術知識提高解決問題的能力,這樣我們才能走在最前方,更多Java學習,請搜索瘋狂Java;

  繼承的基本概念:

  (1)Java不支持多繼承,也就是說子類至多隻能有一個父類。

  (2)子類繼承了其父類中不是私有的成員變量和成員方法,作爲自己的成員變量和方法。

  (3)子類中定義的成員變量和父類中定義的成員變量相同時,則父類中的成員變量不能被繼承。

  (4)子類中定義的成員方法,並且這個方法的名字返回類型,以及參數個數和類型與父類的某個成員方法完全相同,則父類的成員方法不能被繼承。

  分析以上程序示例,主要疑惑點是“子類繼承父類的成員變量,父類對象是否會實例化?私有成員變量是否會被繼承?被繼承的成員變量在哪裏分配空間?”

  1:虛擬機加載ExtendsDemo類,提取類型信息到方法區。

  2:通過保存在方法區的字節碼,虛擬機開始執行main方法,main方法入棧。

  3:執行main方法的第一條指令,new Student(); 這句話就是給Student實例對象分配堆空間。因爲Student繼承Person父類,所以,虛擬機首先加載Person類到方法區,並在堆中爲父類成員變量在子類空間中初始化。然後加載Student類到方法區,爲Student類的成員變量分配空間並初始化默認值。將Student類的實例對象地址賦值給引用變量s。

  4:接下來兩條語句爲成員變量賦值,由於name跟age是從父類繼承而來,會被保存在子類父對象中(見圖中堆中在子類實例對象中爲父類成員變量分配了空間並保存了父類的引用,並沒有實例化父類。),所以就根據引用變量s持有的引用找到堆中的對象(子類對象),然後給name跟age賦值。

  4:調用say()方法,通過引用變量s持有的引用找到堆中的實例對象,通過實例對象持有的本類在方法區的引用,找到本類的類型信息,定位到say()方法。say()方法入棧。開始執行say()方法中的字節碼。

  5:say()方法執行完畢,say方法出棧,程序回到main方法,main方法執行完畢出棧,主線程消亡,虛擬機實例消亡,程序結束。

  總結:相同的方法會被重寫,變量沒有重寫之說,如果子類聲明瞭跟父類一樣的變量,那意味着子類將有兩個相同名稱的變量。一個存放在子類實例對象中,一個存放在父類子對象中。父類的private變量,也會被繼承並且初始化在子類父對象中,只不過對外不可見。

  super關鍵字在java中的作用是使被屏蔽的成員變量或者成員方法變爲可見,或者說用來引用被屏蔽的成員變量或成員方法,super只是記錄在對象內部的父類特徵(屬性和方法)的一個引用。啥叫被屏蔽的成員變量或成員方法?就是被子類重寫了的方法和定義了跟父類相同的成員變量,由於不能被繼承,所以就稱作被屏蔽。

  瘋狂Java培訓的課程採用針對性培養,全面提升學員就業能力,重點加強訓練職業素質。老師辛勤的講解,讓學員充分感受Java的魅力,充分激發每個學員對於編程的熱愛,讓學員在半年的時間內掌握8-10萬的代碼量,成爲真正的技術高手,瘋狂Java採用企業全真模擬開發訓練,迅速積累項目經驗。讓學員迅速獲得其他人需要花費兩年才能獲得的工作技能,無憂就業!

 

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