理解物件例項化順序

2022-05-07 02:51:13 字數 964 閱讀 4119

首選看乙個題目, 以下**的輸出結果是什麼:

public

class

super

public

void

callname()

public

static

void

main(string args)

}class sub extends

super

}

不知道各位看官的第一印象是什麼, 反正我的第一印象是輸出 父類的basename = "super".

然而實際情況是這樣的, 出乎了我的意料:

null

process finished with exit code 0

然後你就會想為什麼會這樣, 相信以下的內容大家都看過好多次了(當然還能記住多少,就不一定了..笑..).

物件例項化順序:

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

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

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

(4) 父類建構函式

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

(6) 子類建構函式

然後問題來了:

new sub();

a.首先會初始化父類的非靜態**塊,也就是 private string basename = "super"; 然後會執行父類的建構函式也就是 public super() ; 但是這時候有個問題, 在子類中有相同的方法 callname(); 因為例項化的是 子類, 那實際上呼叫的也是子類的 callname();方法, 輸出的應該是子類的basename; 但是那這時候還沒有到子類非靜態**塊的執行時間, 因此子類的basename還沒有初始化, 這時候他還沒有值, 所以列印的結果就是null.

子類物件例項化過程的理解

提到子類物件的例項化,就得先對this 與super做乙個回顧 1.this關鍵字 1.可以呼叫的結構 屬性 方法 構造器 2.this呼叫屬性 方法 this理解為 當前物件 或 當前正在建立的物件 1 在類的方法中,我們可以使用 this.屬性 或 this.方法 的方式,呼叫 當前物件屬性或方...

物件例項化

參考資料 尚矽谷jvm教程 面試題 美團 物件在jvm中是怎麼儲存的?物件頭資訊裡面有哪些東西?螞蟻金服 j a物件頭有什麼?8.1.1 建立物件的方式 8.1.2.建立物件的步驟 public class objecttest 前面所述是從位元組碼角度看待物件的建立過程,現在從執行步驟的角度來分析...

類的例項化順序

首先列出例項化的順序 具體大家可以自行通過 進行驗證。在例項化的時候,可能會出現成員變數例項化類,那麼成員例項化。假造到public father father new father 時,在去初始化father這類的public father father new father 就很容易程式設計死迴...