今天,複習的是繼承的內存分配。咱們知道,Java中內存能夠初略分爲堆、棧、方法區。java
父類
學生null0
子類
學生tom20函數
能夠先畫個內存圖:post
能夠簡易理解成父類的空間是一個小圓,被子類的大圓包住了,因此當咱們從子類找一個變量,是先從大圈圈找,找到了就返回,若是大圈圈沒有,那就到小圈圈裏找。spa
這個程序執行的基本流程是:.net
1.虛擬機加載Test類,提取類信息到方法區;線程
2.經過保存在方法去的字節碼,虛擬機開始執行main方法,main函數入棧;對象
3.執行Student s = new Student();給student實例對象分配堆空間。又由於實現本身要先實現父類,因此,虛擬機加載person類到方法區,並在堆中爲父類成員變量在子類空間中初始化。而後加載student類到方法區,爲子類的成員變量分配空間並初始化。blog
4.接下來兩條語句爲成員變量賦值,因爲name跟age是從父類繼承而來,會被保存在子類父對象中,因此就根據引用變量s持有的引用找到堆中的對象(子類對象),而後給name跟age賦值。繼承
5.調用say()方法,經過引用變量s持有的引用找到堆中的實例對象,經過實例對象持有的本類在方法區的引用,找到本類的類型信息,定位到say()方法。say()方法入棧。開始執行say()方法中的字節碼。ip
6.say()方法執行完畢,say方法出棧,程序回到main方法,main方法執行完畢出棧,主線程消亡,虛擬機實例消亡,程序結束。
總結:相同的方法會被重寫,變量沒有重寫之說,若是子類聲明瞭跟父類同樣的變量,那意味着子類將有兩個相同名稱的變量。一個存放在子類實例對象中,一個存放在父類子對象中。父類的private變量,也會被繼承而且初始化在子類父對象中,只不過對外不可見。
當出現多態狀況的時候,調的具體是哪一個函數又須要匹配了。