[英]Java: initialization sequence of object
有一個代碼作為初級Java開發人員的任務給出。 我在五年內使用Java,這段代碼讓我很困惑:
public class Main {
String variable;
public static void main(String[] args) {
System.out.println("Hello World!");
B b = new B();
}
public Main(){
printVariable();
}
protected void printVariable(){
variable = "variable is initialized in Main Class";
}
}
public class B extends Main {
String variable = null;
public B(){
System.out.println("variable value = " + variable);
}
protected void printVariable(){
variable = "variable is initialized in B Class";
}
}
輸出將是:
Hello World!
variable value = null
但是如果我們改變String variable = null;
到String variable;
我們將有:
Hello World!
variable value = variable is initialized in B Class
第二個輸出對我來說更清楚。 所以,據我所知,Java中的inizialisation序列如下:
還有post描述了this
關鍵字在超類的上下文中的行為 - 從基類方法調用基類重寫函數
根據上面給出的規則,我假設有這樣的序列:
B
類的新實例; Main
; main.variable
; Main
類的默認構造函數; Main
類中調用方法b.printVariable()
; (為什么不調用main.printvariable
?我們這里沒有this
關鍵詞。) b.variable
“ 變量在B類中初始化 ” B
級; b.variable
,我是對的嗎? B
類的默認構造函數 請,有人可以完整和完整地解釋這種繼承inizialisation序列是如何工作的。 為什么更改String variable = null;
到String variable;
導致另一個輸出。
順序是:
所以基本上,超級對象Main()是在B類的任何初始化事件之前構造的。這意味着變量= null會在以后發生。 這是有道理的,否則B可以打破Main的初始化。
約書亞布洛赫在他有效的java書中介紹了很多關於如何做正確的危險繼承的好理由,我會推薦它。
首先,您需要了解,當您編寫variable = null;
時會發生什么variable = null;
。 該代碼何時執行。 這基本上決定了輸出。
在開始之前,我還應該提到,當您創建class B
對象時,不會調用主類的printVariable()
函數。 相反,總是會調用B的printVariable()
。
記住這一點,當你有variable = null
,B的構造函數的執行將開始。 將調用First Main()
,它將調用printVariable()方法。 最后, variable=null
,將被稱為覆蓋variable
變量。
在另一種情況下,如果你沒有初始化variable=null
, printVariable()
函數設置的variable
將不會被覆蓋,因此你得到的是你所期望的。
總之,當你執行new B()
時,這是語句的執行順序:
Main() //super constructor
B#printVariable()
initializtion of variables in B's constructor (if any) [i.e. variable=null, if present]
這是一個很好的運動! 但要問初級開發人員,這不是一個公平的問題。 這個適合老年人。 但是為了使這個文本在技術訪談中有用,我通過在Main的構造函數中添加一個參數來修改它:
public Main(String something){
printVariable();
}
如果該人將回答將要發生的事情,那么刪除該論點並詢問原始問題。 如果這個人不回答 - 沒有必要繼續 - 他/她是初中。
您還可以刪除B類中受保護的限定符,並詢問如果您的目標是不雇用此人將會發生什么:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.