BruceEckelのThinkingInJava 4th Editionの128ページ、2番目の段落、最後の文に質問があります。
初期化されないオーバーロードされたコンストラクターが定義され、その定義
w3
に「デフォルト」の初期化がなかった場合はどうなりw3
ますか?
この声明は理解しにくいと思いましたが、この本の専門家や読者は私を少し助けてくれますか?ありがとう!
BruceEckelのThinkingInJava 4th Editionの128ページ、2番目の段落、最後の文に質問があります。
初期化されないオーバーロードされたコンストラクターが定義され、その定義
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のすべてのフィールドタイプには、定義済みのデフォルト値があります。これは、問題のタイプに適用できる場合、それぞれnull、0、またはfalseです。一方、フィールドがの場合、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
れた最初のコンストラクターで作成されました。パラメータを必要とするオーバーロードされたコンストラクタで作成されました。このコンストラクターはw3を設定しません。また、のデフォルトの初期化もありません。したがって、設定されることはありません。Javaでは、デフォルトの初期化なしで変数に対して次の値を取得します。w3
1
secondObject
boolean
w3
int/short/byte
:0
long
:0L
double
:0.0d
float
:0.0f
char
:\u0000
boolean
:false
Object
(およびすべての派生クラス):null
final
フィールド:デフォルト値がなく、デフォルトの初期化がない場合はコンパイラエラーがスローされます