一.

ExtendsDemo2就不再畫了,里面就兩個函數,一個是主函數,一個是構造函數。其實我覺着還有show()函數。

主函數和局部變量進棧后,開始創建對象,這時候Zi類就開始加載了。但是有繼承的關系,所以應該是父類先進來。原因是子類在用父類的東西,父類不先進來,子類就用不了。
父類加載進來之后,有一個父類的構造函數(這點說明什么,即使沒有創建,構造函數也是一直都存在的),在方法區的父類空間里,num=4,或者說num進不進來呢?父類加載之后,就是子類加載進來。

類加載進來后,就開始創建對象了。我們都知道對象中肯定有一個num=5,但是num=4在哪?如果它在方法區里面的話,它是不開辟空間,那怎么運算?我們都知道方法區里面存的都是代碼,運算區都應該在棧堆里面。父類是沒有對象的,所以父類是沒有必要存儲num的(怎么理解),其實是存在子類里面的,怎么存的呢?子一繼承,就意味着它里面多了一個屬性。

子類對象中的兩個屬性表現如下,先有的fu的num屬性,后有的zi的num屬性。再進行分別的初始化。

緊接着,初始化完畢,我們就把地址賦值給this,指向完畢以后,我們都知道成員變量一定存放在堆里面,堆里面就這么一個對象,那么兩個num只能在這一個地方分空間存儲,有自己表示。

當我們進行c.show()的時候,show()方法進棧了,show()有this所屬,this是當前對象,就把地址編號拿過來,它就指向了當前對象。

打印的時候,執行的時候,輸出this的num,就找到this的對象,里面有兩個num,找誰?this是本類的,就找zi的。接下來,打印super當中的時候,這個子類正因為和加載完成的父類有關系,它有一個super引用,代表的是這個父類,代表的是父類這片空間。


父類過程當中,成員變量隨着子類對象的建立,已經存儲在了對象當中了,接下來打印super.num的時候,走的是父類的num,fu的那片空間。對象中有子和父區分的,不區分,調用存在不確定性,它們有自己的存儲。
這個圖作為了解,這種情況在開發中幾乎看不到。因為,描述的父類當中已經定義好了num,意味着它本身是共性內容,那子類建立的時候,為什么重新定義一個?又重新寫屬性,有點多余,父類有,直接拿來用就行。所以這種現象不多見,幾乎沒有。違反繼承的思想。
通常情況下,它們都是私有的,它們對外提供方法訪問,setnum(),getnum()。所以子類直接使用setnum(),getnum()就能完成父類當中num的訪問了。沒有必要完成num定義。

問一個問題,父類中的私有內容子類是不是具備?
子類私不私有不用管,沒什么用,(下面截圖中所示)super.num是在訪問父類中的num。一編譯,出現了問題。


不私有沒事,(父類中的num前面沒有private修飾),子類當中不具備父類私有內容。子類對於父類中的num本身是繼承過來的,就跟子類有自己的私有num是一個道理。就好像,子類中有一個num被私有了,它一樣要在子類空間中存儲,(存儲在創建的對象中),我們在其他的類中,訪問num,訪問不了。因為num在存的時候,有private的修飾(在內存中是以一個數值的形式存在的),標志着是一個私有權限,外界不能訪問,只能通過內部間接地方法來訪問(private的目的是為了數據的安全性,不讓外界接觸)。

由於父類中的num是私有的,那么子類雖然具有num,但也是私有的,外界無法訪問。通過一些方法可以間接訪問。

開發的時候,不多見,面試的時候常見。
