MENU

【Java】変数を初期化しなくてもいいときって?

こんにちは、くまごろーです。
昨日Java Silverを受験してきたのですが、めでたく合格しました。
で、最後までよくわからないままになってしまったテーマが何個かあるんです。
今ほっといたら多分ずっとわからないままなので、それについて記事でまとめようと思います。



1 変数の初期化

int a;

上記のように宣言した変数に

a = 3;

何らかの値を代入することで、変数は初期化される。

これをやらずに、下記の様に変数を参照すると

int x;
int y = 3;
  if(y == 3){
    x = ++y;
  }
  System.out.println(x);
}

参照した瞬間にコンパイルエラーになります。

でも変数の中には、初期化しなくてもエラーにならないケースもあるらしい・・・どんな時だろうか?
まとめてみました。
 

 
2 変数を初期化しなきゃいけないとき

(1)ローカル変数のとき
 ローカル変数は自動的に初期化されないので、自分で初期化しなければならない。
※ ただし、配列だけは自動で初期化される。

(2)クラス変数・インスタンス変数を「final」で定数化した時
finalで修飾された変数は定数として扱われ、一度設定した値は変更することが出来ない。この場合も、初期化しないとコンパイルエラーになる。
 
 
 
3 変数を初期化しなくてもいいとき

〇 クラス変数・インスタンス変数のとき
変数がクラス変数、またはインスタンス変数の時は、明示的に初期化しないと、既定の値が初期値として入る。つまり、初期化するためのコードを書かなくてもコンパイルは通る。

既定の値は型に応じて、以下の様に設定されている。
 

種類 デフォルト値
整数 int/short/byte/long 0
浮動小数点数 float/double 0.0
文字 char \u0000
真偽値 boolean false
参照型 String/配列/クラス等 null




4 初期化の方法色々

変数を初期化する方法ですが、調べてみると結構たくさんありました。
 
(1)変数宣言時に初期化
一番基本的なやり方です。
<例>

int a = 4;


(2)コンストラクタで初期化(インスタンス変数)
インスタンス変数の場合、宣言だけしておいてインスタンス化された時にコンストラクタで初期化するという方法をとることができる。

Class Sample{
  int a;
  String b;
  Sample(int a, String b){
    this.a = a;
    this.b = b;
  }
} 


(3)初期化子・static初期化子を用いて初期化(クラス変数・インスタンス変数)
初期化子を用いて初期化する方法もあります。初期化子には、以下の2種類があります。

・ 初期化子
 → 全てのコンストラクタで共通する前処理を実行するために記述。コンストラクタが実行される前に実行される。
・ static初期化子
 → クラス変数を初期化するための何らかの処理を記述するときに用いる。クラスのロード時に実行されるのでstatic 変数のみにアクセスできる。
 
<初期化子>

Class Sample{
  int a;
  String b;
  {
    a = 3;
    b = 4;
  }
} 


<static初期化子>

Class Sample{
  static int a;
  String b;
  static{
    a = 3;
  }
} 

 
 
 
5 参考
 
https://edu.clipper.co.jp/pg-3-36.html
Java の変数の初期化 - Java のクラスとオブジェクト - Java の基本 - Java 入門
明示的に初期化しなくても自動的にデフォルト値が入るのはどんなときか - Qiita