【Java】 変数初期化のまとめ

f:id:nowa0402:20210606100753p:plain
 こんにちは。のわです。
今回は、Javaの変数初期化についてまとめます。




◇変数初期化の前提
 変数は大きく分けて3つです。
  ・クラス変数
  ・インスタンス変数
  ・ローカル変数

 この3つのうち、クラス変数・インスタンス変数は
『変数の初期化を自動的に行う』ようになっています。

 残りのローカル変数は
『変数の初期化は明示的に行う』必要があります。

public class Main {
    
    public static int a; //クラス変数
    public int b; //インスタンス変数
    
	public static void main(String[] args) {
	    int c = 0; //初期化を明示したローカル変数
	    int d; //初期化していないローカル変数
	    System.out.println(a); 
           System.out.println(new Main().b); 
	    System.out.println(c); 
	    System.out.println(d); 
	}
}

上記コードを実行すると以下のような結果になります。
 ・a(クラス変数) → 自動初期化される。int型のため、「0」が出力される
 ・b(インスタンス変数) → aと同じ。
 ・c(ローカル変数) → 初期化を「0」と明示している。「0」が出力される
 ・d(ローカル変数) → 初期化せず出力している。コンパイルエラー。

 このようにローカル変数については
初期化を行っていない変数を使用するとコンパイルエラーとなります。



◇自動初期化の値
 前項でクラス変数とインスタンス変数は『初期化が自動的に行われる』ことを記述しました。
この初期化ですが、『どの型を使うか』で値が決まります。

代表的なものを並べます。

public class Main {
    
    public static int a;
    public static String b;
    public static boolean c;
    public static double d;
    
	public static void main(String[] args) {
        System.out.println(a); //0
        System.out.println(b); //null
        System.out.println(c); //false
        System.out.println(d); //0.0

	}
}

上記のように、どの型を使っているかで初期値が決まります。
 ・int, short, long → 0
 ・String → null
 ・boolean → false
 ・double, float → 0



◇ローカル変数の初期化
 ローカル変数の初期化は2パターンあります。
  ・宣言時
  ・宣言後

public class Main {

	public static void main(String[] args) {
        int a = 0; //宣言時に初期化する
        
        int b;
        b = 1; //宣言後に初期化する
        
	}
}

 ここで注意したいポイントがあります。
それは、『ローカル変数をどのタイミングで初期化するか』です。

以下のコードを見てください。

public class Main {

	public static void main(String[] args) {
        int a = 0; 
        int b;
        
        if(a == 0) {
            b = 1;
        }
        
        System.out.println(b); //結果は...?

	}
}

 このコードでは、変数bの初期化をif文内で行っています。
一見すると出力結果は「1」になりそうです。

 しかし、このコードの結果は「コンパイルエラー」になります。
if文内で初期化を行った場合、変数bの初期化は『if文内』のみで有効となります。
このブロック内でのみ、有効な処理の考えを『スコープ』と呼びます。


コードの出力をif文内におさめると「1」と出力されます。

public class Main {

	public static void main(String[] args) {
        int a = 0; 
        int b;
        
        if(a == 0) {
            b = 1;
        System.out.println(b); // 1
        }

	}
}


今回は、変数初期化についてまとめました。

 まとめです
  ・インスタンス変数とクラス変数は初期化は自動的にデフォルト値で設定される
  ・ローカル変数の初期化は明示的に設定する必要がある。
  ・ローカル変数の初期化時はスコープ内か注意する。

最後まで読んでいただきありがとうございました!