1. 程式人生 > >java繼承中疑惑

java繼承中疑惑

為了理清思路,撰寫此文

記java中的繼承的一些困惑。。。

先上程式碼

//先定義一個父類
public class Fu {
   
int num = 10;
    public void
method(){
        System.
out.println(num);
   
}
}

//定義子類

public class Zi extends Fu {

    int num = 20;

}

 

//測試類

public class Test {

    public static void main(String[] args) {

        Zi zi = new Zi();

        zi.method();

    }

}

執行結果是 :10

疑問來了,既然子類繼承了父類的方法,按理說子類也應該有個mathod的方法,可是從執行結果上看,顯然子類沒有,那繼承到底繼承的是什麼呢????

 

到這裡了先總結下思路

按照別人經常做的比喻,子類比喻成兒子,一個兒子只能有一個父親,一個子類也只能有一個父類,但是到這你會發現,這個父親是多麼的盡職,父類不管有多少個子類,他都像猴子一樣弄出來多少個分身去和子類在一起,就是每個子類都有一塊空間是劃分給父類的,假如一個父類有100個子類,那麼和上圖一樣的記憶體空間就有100份,,好吧,到了這裡大概明白,繼承只是為了程式設計師的程式碼容易編寫,其實在虛擬機器裡面執行的時候並不像程式設計師寫的程式碼那樣只有一個記憶體然後子類記憶體去呼叫(也可能真的是這樣,只不過沒理解到)。

到了這裡了,再來看看構造方法吧,

首先構造方法是無法繼承的,疑問點就是,為什麼構造方法的第一句都是先呼叫父類的構造方法???還有呼叫了父類的構造方法後子類是如何獲得的值???

子類的例項化只是把父類的構造器當一個方法去呼叫的,因為在jvm堆中,一個物件中包含了從父類繼承過來的成員變數,實際上沒有例項化父類,是為子類中從父類繼承的成員變數初始化

上面這段話摘自網上一個大佬的回答,感覺頗為有道理,呼叫父類的構造方法並沒有給子類的什麼,只是初始化了和這個子類一起的那個父類分身的成員變數,以方便子類的呼叫,間接的完成了子類物件的構造,

雖然想法形成了文字,但是總感覺不是很透徹,寫的不對的地方還請大佬們多指教