首選看乙個題目, 以下**的輸出結果是什麼:
publicclass
super
public
void
callname()
public
static
void
main(string args)
}class sub extends
super
}
不知道各位看官的第一印象是什麼, 反正我的第一印象是輸出 父類的basename = "super".
然而實際情況是這樣的, 出乎了我的意料:
nullprocess 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 就很容易程式設計死迴...