次のようなデフォルトの初期化を使用するケースはありますか?
int myValue;
また
MyObject o = null;
変数をまったく初期化しない場合と比較して、プログラムの動作を変更できますか?
例を探しています。
次のようなデフォルトの初期化を使用するケースはありますか?
int myValue;
また
MyObject o = null;
変数をまったく初期化しない場合と比較して、プログラムの動作を変更できますか?
例を探しています。
ローカル変数は、使用する前に初期化する必要があります。これはコンパイラによって強制されます。
フィールドはデフォルトで、そのタイプに関連付けられたデフォルト値 (false、0、null) に初期化されます。これは、Java 言語仕様で要求されています。
したがって、それらをデフォルト値に明示的に初期化すると、ほとんどの場合、ノイズが追加されるだけです。
MyObject o = null;
以上のことはしません
MyObject o;
はい、この例のように違いがあります。少し不自然ですが、初期化が発生する時間に帰着します。
次のクラスを検討してください。
import java.lang.reflect.Field;
public class base {
protected base(int arg) throws Exception {
Field f = getClass().getDeclaredField("val");
System.out.println(f.get(this));
f.set(this, 666);
}
}
そして、それを拡張する次の 2 つのクラス。test1
明示的に 0 に設定します。
public class test1 extends base {
int val=0; // Explicitly set to 0
public test1() throws Exception {
super(0);
}
public static void main(String argv[]) throws Exception {
System.out.println(new test1().val);
}
}
test2
そのままにしておきます:
public class test2 extends base {
int val; // just leave it to be default
public test2() throws Exception {
super(0);
}
public static void main(String argv[]) throws Exception {
System.out.println(new test2().val);
}
}
これらを実行すると、次のようになります。
javac test1.java && java test1
0
0
しかし、2 番目のケースの場合:
javac test2.java && java test2
0
666
これは異なる動作をきちんと示しており、唯一の変更点は= 0
フィールドの です。
この理由は、最初のケースを分解するとわかります。
import java.io.PrintStream;
public synchronized class test1 extends base
{
int val;
public test1()
throws Exception
{
super(0);
val = 0; // Note that the the explicit '= 0' is after the super()
}
public static void main(String astring[])
throws Exception
{
System.out.println(new test1().val);
}
}
これがあなたのコードベースに違いをもたらすなら、もっと大きな心配事があります!
Java では、クラスのインスタンス フィールドと静的メンバー フィールドにデフォルト値が割り当てられます。プリミティブはデフォルトで 0 に、オブジェクトは null に、ブール値は false に設定されます。
ただし、Java では、メソッドのスコープ内で宣言されたローカル変数を使用する前に、それらに値を割り当てる必要があります。このような変数にはデフォルト値はありません。
私の理解では、そのようなケースはありません。Java 仕様では、次の規則に従って変数をデフォルトで初期化する必要があります。
数値: 0 または 0.0
ブール値: false
オブジェクト参照: null
これらの規則を念頭に置いてプログラムする限り、上記と同じ値に明示的に初期化してもプログラムの動作は変わりません。