web-dev-qa-db-ja.com

Javaのデフォルト値と初期化

reference に基づいて、プリミティブ型にはデフォルト値があり、Objectsはnullです。コードをテストしました。

public class Main {
    public static void main(String[] args) {
        int a;
        System.out.println(a);
    }
}

System.out.println(a);は、variable a might not have been initializedを示す変数aを指すエラーになりますが、指定された参照では、integerはデフォルト値として0を持ちます。ただし、以下のコードでは、実際に0が出力されます。

public class Main {
    static int a;
    public static void main(String[] args) {
        System.out.println(a);
    }
}

最初のコードで何が問題になる可能性がありますか?クラスは インスタンス 変数はローカル変数とは異なる動作をしますか?

68
Michael Ardan

最初のコードサンプルでは、​​amainメソッドのローカル変数です。メソッドのローカル変数は、使用する前に初期化する必要があります。

2番目のコードサンプルでは、​​aはクラスメンバー変数であるため、デフォルト値に初期化されます。

63
Juned Ahsan

参照 をより注意深く読んでください:

デフォルト値

fieldが宣言されている場合、常に値を割り当てる必要はありません。 Fields宣言されているが初期化されていないものは、コンパイラによって適切なデフォルトに設定されます。一般的に、このデフォルトはデータ型に応じてゼロまたはヌルになります。ただし、このようなデフォルト値に依存することは、一般的にプログラミングスタイルが悪いと見なされます。

次のグラフは、上記のデータ型のデフォルト値をまとめたものです。

。 。 。

ローカル変数はわずかに異なります。コンパイラーは、初期化されていないローカル変数にデフォルト値を割り当てません。宣言されているローカル変数を初期化できない場合は、使用する前に必ず値を割り当ててください。初期化されていないローカル変数にアクセスすると、コンパイル時エラーが発生します。

59
Paolo

これらは、関与する主な要因です。

  1. メンバー変数(デフォルトOK)
  2. 静的変数(デフォルトOK)
  3. 最終メンバー変数(初期化されず、コンストラクターで設定する必要があります)
  4. 最終静的変数(初期化されていない、静的ブロック{}に設定する必要がある)
  5. ローカル変数(初期化されていない)

注1:実装されたすべてのコンストラクターで最終メンバー変数を初期化する必要があります!

注2:コンストラクター自体のブロック内で最終メンバー変数を初期化する必要があり、それらを初期化する別のメソッドを呼び出す必要はありません。たとえば、これは無効です。

private final int memberVar;

public Foo() {
    //invalid initialization of a final member
    init();
}

private void init() {
    memberVar = 10;
}

注3:プリミティブを格納している場合でも、配列はJavaのオブジェクトです。

注4:配列を初期化すると、メンバーまたはローカル配列に関係なく、そのすべての項目がデフォルトに設定されます。

上記のケースを示すコード例を添付します。

public class Foo {
    //static and member variables are initialized to default values

    //primitives
    private int a; //default 0
    private static int b; //default 0

    //objects
    private Object c; //default NULL
    private static Object d; //default NULL

    //arrays (Note: they are objects too, even if they store primitives)
    private int[] e; //default NULL
    private static int[] f; //default NULL

    //what if declared as final?

    //primitives
    private final int g; //not initialized, MUST set in constructor
    private final static int h; //not initialized, MUST set in a static {}

    //objects
    private final Object i; //not initialized, MUST set in constructor
    private final static Object j; //not initialized, MUST set in a static {}

    //arrays
    private final int[] k; //not initialized, MUST set in constructor
    private final static int[] l; //not initialized, MUST set in a static {}

    //initialize final statics
    static {
        h = 5;
        j = new Object();
        l = new int[5]; //elements of l are initialized to 0
    }

    //initialize final member variables
    public Foo() {
        g = 10;
        i = new Object();
        k = new int[10]; //elements of k are initialized to 0
    }

    //A second example constructor
    //you have to initialize final member variables to every constructor!
    public Foo(boolean aBoolean) {
        g = 15;
        i = new Object();
        k = new int[15]; //elements of k are initialized to 0
    }

    public static void main(String[] args) {
        //local variables are not initialized
        int m; //not initialized
        Object n; //not initialized
        int[] o; //not initialized

        //we must initialize them before usage
        m = 20;
        n = new Object();
        o = new int[20]; //elements of o are initialized to 0
    }
}
14
Kostas Chalkias

プリミティブ型の値を宣言する際に留意すべきことがいくつかあります。

彼らです:

  1. メソッド内で宣言された値にはデフォルト値は割り当てられません。
  2. インスタンス化された変数または静的変数として宣言された値には、0であるデフォルト値が割り当てられます。

あなたのコードで:

public class Main {
    int instanceVariable;
    static int staticVariable;
    public static void main(String[] args) {
        Main mainInstance = new Main() 
        int localVariable;
        int localVariableTwo = 2;
        System.out.println(mainInstance.instanceVariable);
        System.out.println(staticVariable);
       // System.out.println(localVariable); //will throw compilation error
        System.out.println(localVariableTwo);

    }
}
6
Pritam Banerjee

はい、インスタンス変数はデフォルト値に初期化されます。ローカル変数の場合、使用する前に初期化する必要があります

public class Main {
      int instaceVariable; // Instance variable will be initalized to default value
    public static void main(String[] args) {
        int localVariable = 0; // Local Variable Need to initalize before use
    }
}
2
upog

ローカル変数はデフォルト値を取得しません。それらの初期値は、何らかの方法で値を割り当てることなく未定義です。ローカル変数を使用するには、初期化する必要があります。

クラスレベル(メンバーとして、つまりフィールドとして)とメソッドレベルで変数を宣言する場合、大きな違いがあります。

クラスレベルでフィールドを宣言すると、タイプに応じてデフォルト値が取得されます。メソッドレベルまたはブロック({}内の任意のコードを意味する)で変数を宣言する場合、値を取得せず、何らかの方法で開始値、つまり割り当てられた値を取得するまで未定義のままにします。

1
Ani

すべてのメンバー変数はヒープにロードする必要があるため、クラスのインスタンスを作成するときにデフォルト値で初期化する必要があります。ローカル変数の場合、それらはヒープにロードされず、Java 7の前に使用されるまでスタックに格納されるため、明示的に初期化する必要があります。

0
newuser

Javaでは、デフォルトの初期化はローカル変数には適用できないクラスメンバーのインスタンス変数にのみ適用できます。

0
ramesh