web-dev-qa-db-ja.com

デフォルトのコンストラクターは、クラスのインスタンスメンバーを初期化しませんか?

「次のどれが「デフォルト」コンストラクターに当てはまりますか?」という質問に遭遇しました。

オプション「クラスのインスタンスメンバーを初期化します。」間違った選択でした。

今、私の理解は、次のようなコードがある場合

    Class Test {
        String name;
    }

次に、コンパイラは次のようなデフォルトのコンストラクタを作成します

    Class Test {
        String name;
        Test(){
            super();
            name = null;
        }
    }

デフォルトのコンストラクターは、インスタンスメンバーname = nullを初期化していませんか?

15
SERich

クラスコンストラクターは初期化を行うものではなく、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 を読んで、初期化プロセスの実行方法を理解してください。

10
smac89

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

また、逆コンパイルされたコードを確認することもできます。

4
Cheng Chen

インスタンスメンバを初期化するデフォルトのコンストラクタではないname = null

いいえ、コンストラクタは呼び出されますafterすべてのインスタンス変数はデフォルト値で初期化されます:0または primitive numeric types の同等の値、falseタイプのbooleanreference typesnull

3
Andrew Tobilko

いいえ、インスタンス変数を初期化するのはデフォルトのコンストラクターではありません。各タイプにはデフォルト値があります。オブジェクトを作成した瞬間に、デフォルト値が使用されます。

したがって、インスタンス変数を明示的に初期化しない場合、それらは暗黙的に定義されたデフォルト値を引き続き使用します。

つまり、intの場合は0、参照型の場合はnullなど

ただし、デフォルト値が指定されていることを当然のことと考えてはならず、変数を初期化しないことを選択するべきではないことに注意してください。


空の実装でデフォルトのコンストラクタをオーバーライドする空のコンストラクタを定義してみてください。すべてのインスタンス変数がまだ初期化されていることがわかります。

1
user3437460

します。質問は使用法に基づいていますが。

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
1
RCInd

Javaクラスでは、最初の静的制御フローが実行されます。静的制御フローでは、オブジェクトを作成する場合、次のステップが(上記の順序で)実行されます)イナタンス制御フローの一部:

  1. インスタンスメンバー(インスタンス変数とインスタンスブロック)を上から下に識別します。
  2. インスタンス変数の割り当てとインスタンスブロックの実行。
  3. コンストラクターの実行。

したがって、上記のコードでは、コンストラクターが実行される前でも、インスタンス変数「name」はすでにnull(参照型のデフォルト値)に割り当てられています。

0
Rajdeep Sarkar

デフォルトコンストラクターは、オブジェクトにデフォルト値を提供し、通常、コンストラクターが明示的に定義されていない場合にコンパイラーによって作成されます。例えば.

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のヌル値を割り当てるデフォルトのコンストラクターを生成します。

0
mc.Ambugo