qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          圖解Java繼承內存分配

            繼承的基本概念:

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

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

            (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只是記錄在對象內部的父類特征(屬性和方法)的一個引用。啥叫被屏蔽的成員變量或成員方法?就是被子類重寫了的方法和定義了跟父類相同的成員變量,由于不能被繼承,所以就稱作被屏蔽。

            說到這里,上面提出的疑惑也就解開了。

            本文轉載自:http://blog.csdn.net/thinking_in_android/article/details/8874171

          相關鏈接:

          圖解Java對象初始化過程以及方法調用

          圖解Java單例模式內存分配

          posted on 2013-05-10 09:27 順其自然EVO 閱讀(202) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 泊头市| 昌江| 南岸区| 缙云县| 临城县| 乐昌市| 尤溪县| 孝感市| 凤翔县| 班玛县| 五常市| 库伦旗| 尤溪县| 敦煌市| 克什克腾旗| 兴化市| 乌审旗| 广灵县| 资讯 | 噶尔县| 宝山区| 泰来县| 河津市| 乌拉特后旗| 玉环县| 张北县| 天津市| 扶绥县| 五常市| 习水县| 开鲁县| 宜兰县| 桃江县| 五台县| 万宁市| 江安县| 大洼县| 抚州市| 田东县| 疏勒县| 开化县|