5

Java は、デフォルト コンストラクターを使用してインスタンス変数にデフォルト値を割り当てます。しかし、独自のコンストラクターを定義した場合、Java はどのようにデフォルト値を与えるのでしょうか (コンストラクターを作成すると、デフォルトのコンストラクターが追加されないため)。

4

4 に答える 4

8

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
于 2012-06-11T09:10:45.823 に答える
0
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);
    }

}

デフォルトのコンストラクタを書き直します。コンストラクターで何もしませんでしたが、変数が割り当てられています。

于 2012-06-11T09:55:15.810 に答える
0

aioobeの答えは正しいです。なぜ/どのようにそのようになっているのかを言いたいだけです:

デフォルトまたは独自のコンストラクターがあるかどうかに関係なく、Java コンパイラーはそれぞれのインスタンス初期化「メソッド」<init>を構築します (逆コンパイルされたバイトコードを調べたい場合は、コンストラクターのパラメーターを使用して void と呼ばれます)。

<init>「メソッド」の構造は次のとおりです。

  • 別のコンストラクターの呼び出し
  • インスタンス変数初期化子 (インスタンス変数初期化子とインスタンス初期化子)
  • コンストラクタ本体。

詳細については、JLS と JVMS、およびこのすばらしい紹介を参照してください。

于 2012-06-11T09:36:36.390 に答える
0

を使用してオブジェクトを作成すると、次のようになりますnewJLS 12.5を参照

  1. オブジェクトのスペースがヒープに割り当てられ、オブジェクトのサイズとクラスがオブジェクトに関連付けられます。

  2. オブジェクトのすべてのフィールドがデフォルト値に設定されます。つまりnull、または参照型であり、プリミティブ型の場合はゼロまたは false です。

  3. superまたは引数 (存在する場合)の引数式thisが評価され、コンストラクター チェーンが再帰的に呼び出されます。

  4. まだ評価されていない場合 (this連鎖によって)、このクラスのインスタンス フィールド初期化子と初期化子ブロックが順番に評価/実行されます。

  5. オブジェクトの初期化を完了するために、コンストラクター本体の残りの部分 (存在する場合) が実行されます。

明示的に宣言されたコンストラクターまたはデフォルトのコンストラクターがある場合でも、同じ手順が使用されます。デフォルトのコンストラクターは、 を呼び出すだけのコンストラクターの省略形ですsuper()

そう ....

Java は、デフォルト コンストラクターを使用してインスタンス変数にデフォルト値を割り当てます。

実際には、デフォルト値はその前に割り当てられ、(実際には) 初期化子などが(空の) デフォルト コンストラクターが実行される前に実行されます。

デフォルトのコンストラクターは、デフォルトの初期化を行う責任を負いません。したがって、それが呼び出されないという事実は問題ではありません。

于 2012-06-11T09:26:46.820 に答える