「次のどれが「デフォルト」コンストラクターに当てはまりますか?」という質問に遭遇しました。
オプション「クラスのインスタンスメンバーを初期化します。」間違った選択でした。
今、私の理解は、次のようなコードがある場合
Class Test {
String name;
}
次に、コンパイラは次のようなデフォルトのコンストラクタを作成します
Class Test {
String name;
Test(){
super();
name = null;
}
}
デフォルトのコンストラクターは、インスタンスメンバーname = nullを初期化していませんか?
クラスコンストラクターは初期化を行うものではなく、JVMがこれを行います。オブジェクトのメモリが作成されると、オブジェクトのメンバーはデフォルトで予測可能な値に初期化され、デフォルト値になります。
- 各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます( §15.9 、 §15.10.2 ):
- タイプバイトの場合、デフォルト値はゼロ、つまり
(byte)0
の値です。- Short型の場合、デフォルト値はゼロ、つまり
(short)0
の値です。- タイプintの場合、デフォルト値はゼロ、つまり
0
です。- Long型の場合、デフォルト値はゼロ、つまり
0L
です。- Float型の場合、デフォルト値は正のゼロ、つまり
0.0f
です。- Double型の場合、デフォルト値は正のゼロ、つまり
0.0d
です。- Char型の場合、デフォルト値はヌル文字、つまり
'\u0000'
です。- ブール型の場合、デフォルト値は
false
です。- すべての参照タイプ( §4. )の場合、デフォルト値は
null
です。
あなたの仮定は近いですが、コンストラクターのパラメーターが評価される前に-各フィールドに値を割り当てる前に-これらのフィールドは既にデフォルト値を保持しており、これはJVMによって行われます。
サブセクション §15.9.4 を読んで、初期化プロセスの実行方法を理解してください。
In Javaフィールドは初期化されますbeforeコンストラクター。これは次のコードで簡単に証明できます。
public class MyClass {
int myField = initMyField();
MyClass(){
System.out.println("ctor");
}
static int initMyField() {
System.out.println("init field");
return 1;
}
}
出力
init field
ctor
また、逆コンパイルされたコードを確認することもできます。
インスタンスメンバを初期化するデフォルトのコンストラクタではない
name = null
?
いいえ、コンストラクタは呼び出されますafterすべてのインスタンス変数はデフォルト値で初期化されます:0
または primitive numeric types の同等の値、false
タイプのboolean
、 reference types のnull
。
いいえ、インスタンス変数を初期化するのはデフォルトのコンストラクターではありません。各タイプにはデフォルト値があります。オブジェクトを作成した瞬間に、デフォルト値が使用されます。
したがって、インスタンス変数を明示的に初期化しない場合、それらは暗黙的に定義されたデフォルト値を引き続き使用します。
つまり、intの場合は0、参照型の場合はnullなど
ただし、デフォルト値が指定されていることを当然のことと考えてはならず、変数を初期化しないことを選択するべきではないことに注意してください。
空の実装でデフォルトのコンストラクタをオーバーライドする空のコンストラクタを定義してみてください。すべてのインスタンス変数がまだ初期化されていることがわかります。
します。質問は使用法に基づいていますが。
public class Main {
String x;
Main() {
x = "Init";
}
@Override
public String toString() {
return x;
}
public static void main(String[] args) {
System.out.println(new Main());
}
}
出力:
Init
Javaクラスでは、最初の静的制御フローが実行されます。静的制御フローでは、オブジェクトを作成する場合、次のステップが(上記の順序で)実行されます)イナタンス制御フローの一部:
したがって、上記のコードでは、コンストラクターが実行される前でも、インスタンス変数「name」はすでにnull(参照型のデフォルト値)に割り当てられています。
デフォルトコンストラクターは、オブジェクトにデフォルト値を提供し、通常、コンストラクターが明示的に定義されていない場合にコンパイラーによって作成されます。例えば.
class DefaultTest{
int id;
String name;
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
DefaultTest s1=new DefaultTest();
DefaultTest s2=new DefaultTest();
s1.display();
s2.display();
}
}
NB:コンパイラーが定義されていないため、コンパイラーは2つのオブジェクトに0のヌル値を割り当てるデフォルトのコンストラクターを生成します。