#はじめに
Javaの勉強を始めたばかりの頃、「変数は宣言時に初期化するもの」と覚えました。
int a = 3;
でも、Java Silverの勉強をして、Javaでは宣言した変数を初期化しなくてもコンパイルエラーにならないケースがあることを知りました。そして、初期化の方法は上記以外にも色々あるらしいということも・・・
勉強の一環でまとめてみました。
#変数を初期化しなければならないケース
###1 変数がローカル変数の場合
ローカル変数は自動的に初期化されないので、自分で初期化しなければならない。
※ ただし、配列だけは自動で初期化される。
###2 クラス変数・インスタンス変数を「final」で定数化した場合
「final」で修飾された変数は定数として扱われ、一度設定した値は変更することが出来ない。この場合も、初期化しないとコンパイルエラーになる。
#変数を初期化しなくてもいいケース
###変数がクラス変数・インスタンス変数の場合
変数がクラス変数、またはインスタンス変数の時は、明示的に初期化しないと、既定の値が初期値として入る。つまり、初期化するためのコードを書かなくてもコンパイルは通る。
既定の値は型に応じて、以下の様に設定されている。
種類 | 型 | デフォルト値 |
---|---|---|
整数 | int/short/byte/long | 0 |
浮動小数点数 | float/double | 0.0 |
文字 | char | \u0000 |
真偽値 | boolean | false |
参照型 | String/配列/クラス等 | null |
#初期化の方法いろいろ
変数の初期化には、意外と色んなやり方がある。
###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種類がある。
(1)初期化子
→ 全てのコンストラクタで共通する前処理を実行するために記述。コンストラクタが実行される前に実行される。
(2)static初期化子
→ クラス変数を初期化するための何らかの処理を記述するときに用いる。クラスのロード時に実行されるのでstatic 変数のみにアクセスできる。
Class Sample{
int a;
String b;
{
a = 3; //コンストラクタが実行される前に実行
b = 4;
}
Sample(){ }
}
>|java|
Class Sample{
static int a;
String b = "test";
static{
a = 3; //クラスのロード時に実行
}
}