繼承類的載入順序 牛客網例題1

2021-08-17 22:21:51 字數 1917 閱讀 2195

publicclassbase

publicvoidcallname()

staticclasssubextendsbase

}

publicstaticvoidmain(string args)

}

輸出為null

(1) 父類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)

(2) 子類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 )

(3) 父類非靜態**塊( 包括非靜態初始化塊,非靜態屬性 )

(4) 父類建構函式

(5) 子類非靜態**塊 ( 包括非靜態初始化塊,非靜態屬性 )

(6) 子類建構函式

其中:類中靜態塊按照宣告順序執行,並且(1)和(2)不需要呼叫new類例項的時候就執行了(意思就是在類載入到方法區的時候執行的)

2.其次,需要理解子類覆蓋父類方法的問題,也就是

方法重寫實現多型問題。

base b = new sub();

它為多型的一種表現形式,宣告是base,實現是sub類,

理解為b

編譯時表現為base類特性,執行時表現為sub類特性。

當子類覆蓋了父類的方法後,意思是父類的方法已經被重寫,

題中父類初始化呼叫的方法為子類實現的方法,子類實現的方法中呼叫的basename為子類中的私有屬性。

由1.可知,此時只執行到步驟4.,子類非靜態**塊和初始化步驟還沒有到,子類中的basename還沒有被初始化。所以此時 basename為空。 所以為null。

例子2:

classx

}

classy

}

publicclasszextendsx

publicstaticvoidmain(string args)

}

輸出 yxyz

初始化過程: 

1.初始化父類中的靜態成員變數和靜態**塊

; 2.

初始化子類中的靜態成員變數和靜態**塊

; 3.初始化父類的普通成員變數和**塊,再執行父類的構造方法;

4.初始化子類的普通成員變數和**塊,再執行子類的構造方法; 

(1)初始化父類的普通成員變數和**塊,執行  y y=new

y();

輸出y 

(2)再執行父類的構造方法;輸出x

(3)初始化子類的普通成員變數和**塊,執行  y y=new

y();

輸出y 

(4)再執行子類的構造方法;輸出z

所以輸出yxyz

類連線 繼承中類載入的順序

繼承中,類載入的順序 1 父類的靜態 塊,子類的靜態 塊 2 父類的初始化塊,父類的構造方法 3 子類的初始化塊,子類的構造方法 public class importantdemo system.out.println 開始了 system.out.println main new test1 b...

牛客網模擬面試的題目1

1 請你談談共享記憶體相關的api sys shm.h中。1 新建共享記憶體shmget int shmget key t key,size t size,int shm key 共享記憶體鍵值,可以理解為共享記憶體的唯一性標記。size 共享記憶體大小 shmflag 建立程序和其他程序的讀寫許可...

二進位制中1的個數(牛客網(六))

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。public class solution return count 首先想到的是沒有考慮負數的情況。負數右移高位補1,正數右移高位補0 負數 正數左移低位補0。當函式輸入的是負數時,如果一直右移,就會進入死迴圈。為了避免死迴圈,我們...