我有布魯斯Eckel的思維在Java第四版,第二段的第128頁上的問題,最後一句話就問:思考
如果一個重載的構造函數中定義會發生什麼沒有初始化
w3
並且在其定義中沒有「默認」初始化w3
?
我發現這種說法令人困惑,難以理解,本書的專家或讀者能否幫助我一點?謝謝!
我有布魯斯Eckel的思維在Java第四版,第二段的第128頁上的問題,最後一句話就問:思考
如果一個重載的構造函數中定義會發生什麼沒有初始化
w3
並且在其定義中沒有「默認」初始化w3
?
我發現這種說法令人困惑,難以理解,本書的專家或讀者能否幫助我一點?謝謝!
Window w3 = new Window(3);
它只是守着,如果有人不重載的構造函數初始化w3
正常。這種字段實例化會自動放在每個構造函數的開頭。所以即使超載的也會收到w3
初始化。
如果只聲明Window w3
,則在執行重載的構造函數時,w3
將保持爲null
。
這裏是一本書的代碼:
import static net.mindview.util.Print.*;
// When the constructor is called to create a
// Window object, you’ll see a message:
class Window {
Window(int marker)
{
print("Window(" + marker + ")");
}
}
class House {
Window w1 = new Window(1);
// Before constructor
House() {
// Show that we’re in the constructor:
print("House()");
w3 = new Window(33); // Reinitialize w3
}
Window w2 = new Window(2);
// After constructor void f() { print("f()"); }
Window w3 = new Window(3);
// At end
}
在Java中每個字段類型都有一個預定義的defaault值,這是空,零,還是假的,分別適用於有問題的類型。另一方面,如果一個字段是final
,則沒有默認值,並且在構建時不會提供一個編譯器錯誤。
-w3
如果它的一個字段(即Instance variable
。)
-默認情況下它會被初始化爲null
,作爲對象參考變的默認值是NULL。
-現在,如果重載的構造不初始化它,它的價值將是null
。
我沒有這本書,也沒有讀過它。因此,這只是一種猜測:
w3
是類的成員變量
class A {
public int w3; // w3 has no default initialization
public B() {
w3 = 1; // w3 is initialized here
}
public B(boolean x) {
// w3 is not initialized here
}
}
你可以做這樣的事情:
A firstObject = new A();
System.out.println("firstObject.w3 is " + firstObject.w3);
A secondObject = new A(false);
System.out.println("secondObject.w3 is " + secondObject.w3);
你的輸出就會
firstObject.w3 is 1
secondObject.w3 is 0
說明:firstObject
用第一個構造函數創建,即s請參閱w3
至1
。 secondObject
是使用重載構造函數創建的,需要參數boolean
。這個構造函數沒有設置w3,也沒有w3
的默認初始化。因此,它從未設置。在Java中,你得到的變量下面的值沒有缺省初始化:
int/short/byte
:0
long
:0L
double
:0.0d
float
:0.0f
char
:\u0000
boolean
:false
Object
(和所有派生類):null
final
領域:他們沒有默認值,並拋出一個編譯錯誤,如果沒有缺省初始化
你可以添加句子之前或之後?我們需要它被寫入的上下文.. –
只是一個隨機猜測:'w3'會是'null'? –
Rohit是對的。你是否期望大多數人隨時都可以在他們的桌面上看到本書的這一版本? – AlexR