Javaではメソッド内で使用するローカル変数を初期化(値を代入)せずに出力(System.out.println)しようとするとコンパイルエラーになり実行できません。メソッド内(mainなど)で宣言される変数はJavaが自動的に初期値を設定してくません。Javaで自動的に初期値が代入される場合とされない場合の違いをまとめます。
メソッド内で初期値を代入しない場合コンパイルエラーになる(Javaで自動的に初期化されない)
package javaSample;
public class samlpeCode {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
byte byteNum;
short shortNum;
int intNum;
long longNum;
float floatNum;
double doubleNum;
char letter;
String letters;
boolean isBoolean;
System.out.println(isBoolean);
}
}メソッド内で宣言する場合(出力したい場合は初期値の代入必須)
public class SampleCode {
public static void main(String[] args) {
// 変数の宣言と初期化
byte byteNum = 0;
short shortNum = 0;
int intNum = 0;
long longNum = 0L;
float floatNum = 0.0f;
double doubleNum = 0.0d;
char letter = '\u0000';
String letters = null;
boolean isBoolean = false; // 値を代入する
// 初期化していれば出力できる
System.out.println(isBoolean);
}
}
- ローカル変数(メソッド内):自動で初期化されない。必ず代入が必要
- フィールド(メソッド外、クラス直下):インスタンス化(またはstatic定義)された際に、Javaによって各変数型のデフォルト値(0やfalse, 0L, nullなど)で初期化されます。
クラス直下、メソッド外(クラスとメソッドの間)で宣言する
package javaSample.a;
public class sampleCode {
// クラス直下(メソッド外)で宣言する
// staticメソッドから呼ぶために static を付ける
static byte byteNum;
static short shortNum;
static int intNum;
static long longNum;
static float floatNum;
static double doubleNum;
static char letter;
static String letters;
static boolean isBoolean;
public static void main(String[] args) {
// メソッド外で宣言されたフィールドは自動的に初期化されるため、
// 明示的に代入しなくてもコンパイルエラーにならず出力できる
System.out.println("byte: " + byteNum); // 0
System.out.println("int: " + intNum); // 0
System.out.println("boolean: " + isBoolean); // false
System.out.println("String: " + letters); // null
}
}
- デフォルト値の適用: クラス直下の変数(フィールド)には、Javaが以下の値を自動的に割り当てます。
- 整数型 (
byte,short,int,long):0 - 浮動小数点型 (
float,double):0.0 - 文字型 (
char):'\u0000'(空文字のようなもの) - 論理型 (
boolean):false - 参照型 (
Stringなど):null
- 整数型 (
staticの役割:mainメソッドはstaticメソッドであるため、同じクラス内の変数を直接参照するには、変数側にもstaticが付いている必要があります。
この書き換えにより、明示的に isBoolean = false; と書かなくても、実行時に false と表示されるようになります。