public class Sample {
int i1;
void test(){
int i2;
System.out.println(i1);
System.out.println(i2);
}
public static void main(String[] args){
Sample sample = new Sample();
sample.test();
}
}
実行結果はどうなると思いますか?
この問題が、初期化の大きなポイントです。
(答えは最後)
まず、初期化とは1回目の代入をすること。です。
メモリ関連の話をすると、もう少し深くなるのでしょうが、
OCJ-Pではその程度の理解でも十分です。
覚えておくべきことは、初期化の意味ではなくて、
Javaでは『自動で初期化しといてくれる。』
ということ。
ただし!
言語規定 4.5.3 変数の種類 の中にある、
局所変数(メソッド内で宣言した変数。ローカル変数ともいう)はしてくれない。
局所変数は、自動で初期化してくれないので、
必ず自分で初期化する必要があるのです。
ですので、初期化していないまま、
その変数を参照しようとするコードを書くと、
コンパイルエラーが発生するわけです。
つまり、問題の答えは、
System.out.println(i2);
の箇所でコンパイルエラーが発生する。
です。
一行上のSystem.out.println(i1);
では、0と表示されます。
これは、i1はメンバフィールドなので、
Java側で自動的に初期化してくれるから。
int 型の場合、0を自動的に代入してくれるんです。
何を代入しといてくれるかは、
言語規定の4.5.5 変数の初期値 を見て下さい。