Java は、デフォルト コンストラクターを使用してインスタンス変数にデフォルト値を割り当てます。しかし、独自のコンストラクターを定義した場合、Java はどのようにデフォルト値を与えるのでしょうか (コンストラクターを作成すると、デフォルトのコンストラクターが追加されないため)。
4 に答える
Java は、デフォルト コンストラクターを使用してインスタンス変数にデフォルト値を割り当てます。
いいえ、そうではありません。コンストラクターを実行する前に、すべてのメンバーにデフォルト値を自動的に割り当てます。
しかし、独自のコンストラクターを定義した場合、Java はどのようにデフォルト値を与えるのでしょうか (コンストラクターを作成すると、デフォルトのコンストラクターが追加されないため)。
それでもすべてのメンバーにデフォルト値が割り当てられます。
class Test {
int i;
Object ref;
Test() {
System.out.println(i);
System.out.println(ref);
}
public static void main(String[] args) {
new Test();
}
}
出力:
0
null
public class DefaultValue {
private boolean BOOLEAN;
private byte BYTE;
private short SHORT;
private int INT ;
private long LONG;
private float FLOAT;
private double DOUBLE;
private char CHAR;
private Object OBJECT;
public DefaultValue() {
System.out.println("I did nothing!");
}
public static void main(String args[]) {
DefaultValue dv = new DefaultValue();
System.out.println(dv.BOOLEAN);
System.out.println(dv.BYTE);
System.out.println(dv.SHORT);
System.out.println(dv.INT);
System.out.println(dv.LONG);
System.out.println(dv.FLOAT);
System.out.println(dv.DOUBLE);
System.out.println(dv.CHAR);
System.out.println(dv.OBJECT);
}
}
デフォルトのコンストラクタを書き直します。コンストラクターで何もしませんでしたが、変数が割り当てられています。
aioobeの答えは正しいです。なぜ/どのようにそのようになっているのかを言いたいだけです:
デフォルトまたは独自のコンストラクターがあるかどうかに関係なく、Java コンパイラーはそれぞれのインスタンス初期化「メソッド」<init>
を構築します (逆コンパイルされたバイトコードを調べたい場合は、コンストラクターのパラメーターを使用して void と呼ばれます)。
各<init>
「メソッド」の構造は次のとおりです。
- 別のコンストラクターの呼び出し
- インスタンス変数初期化子 (インスタンス変数初期化子とインスタンス初期化子)
- コンストラクタ本体。
詳細については、JLS と JVMS、およびこのすばらしい紹介を参照してください。
を使用してオブジェクトを作成すると、次のようになりますnew
。JLS 12.5を参照
オブジェクトのスペースがヒープに割り当てられ、オブジェクトのサイズとクラスがオブジェクトに関連付けられます。
オブジェクトのすべてのフィールドがデフォルト値に設定されます。つまり
null
、または参照型であり、プリミティブ型の場合はゼロまたは false です。super
または引数 (存在する場合)の引数式this
が評価され、コンストラクター チェーンが再帰的に呼び出されます。まだ評価されていない場合 (
this
連鎖によって)、このクラスのインスタンス フィールド初期化子と初期化子ブロックが順番に評価/実行されます。オブジェクトの初期化を完了するために、コンストラクター本体の残りの部分 (存在する場合) が実行されます。
明示的に宣言されたコンストラクターまたはデフォルトのコンストラクターがある場合でも、同じ手順が使用されます。デフォルトのコンストラクターは、 を呼び出すだけのコンストラクターの省略形ですsuper()
。
そう ....
Java は、デフォルト コンストラクターを使用してインスタンス変数にデフォルト値を割り当てます。
実際には、デフォルト値はその前に割り当てられ、(実際には) 初期化子などが(空の) デフォルト コンストラクターが実行される前に実行されます。
デフォルトのコンストラクターは、デフォルトの初期化を行う責任を負いません。したがって、それが呼び出されないという事実は問題ではありません。