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);
}
}
最初のコードで何が問題になる可能性がありますか?クラスは インスタンス 変数はローカル変数とは異なる動作をしますか?
最初のコードサンプルでは、a
はmain
メソッドのローカル変数です。メソッドのローカル変数は、使用する前に初期化する必要があります。
2番目のコードサンプルでは、a
はクラスメンバー変数であるため、デフォルト値に初期化されます。
参照 をより注意深く読んでください:
デフォルト値
fieldが宣言されている場合、常に値を割り当てる必要はありません。 Fields宣言されているが初期化されていないものは、コンパイラによって適切なデフォルトに設定されます。一般的に、このデフォルトはデータ型に応じてゼロまたはヌルになります。ただし、このようなデフォルト値に依存することは、一般的にプログラミングスタイルが悪いと見なされます。
次のグラフは、上記のデータ型のデフォルト値をまとめたものです。
。 。 。
ローカル変数はわずかに異なります。コンパイラーは、初期化されていないローカル変数にデフォルト値を割り当てません。宣言されているローカル変数を初期化できない場合は、使用する前に必ず値を割り当ててください。初期化されていないローカル変数にアクセスすると、コンパイル時エラーが発生します。
これらは、関与する主な要因です。
注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
}
}
プリミティブ型の値を宣言する際に留意すべきことがいくつかあります。
彼らです:
あなたのコードで:
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);
}
}
はい、インスタンス変数はデフォルト値に初期化されます。ローカル変数の場合、使用する前に初期化する必要があります
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
}
}
ローカル変数はデフォルト値を取得しません。それらの初期値は、何らかの方法で値を割り当てることなく未定義です。ローカル変数を使用するには、初期化する必要があります。
クラスレベル(メンバーとして、つまりフィールドとして)とメソッドレベルで変数を宣言する場合、大きな違いがあります。
クラスレベルでフィールドを宣言すると、タイプに応じてデフォルト値が取得されます。メソッドレベルまたはブロック({}内の任意のコードを意味する)で変数を宣言する場合、値を取得せず、何らかの方法で開始値、つまり割り当てられた値を取得するまで未定義のままにします。
すべてのメンバー変数はヒープにロードする必要があるため、クラスのインスタンスを作成するときにデフォルト値で初期化する必要があります。ローカル変数の場合、それらはヒープにロードされず、Java 7の前に使用されるまでスタックに格納されるため、明示的に初期化する必要があります。
Javaでは、デフォルトの初期化はローカル変数には適用できないクラスメンバーのインスタンス変数にのみ適用できます。