変数の初期値とスコープ

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


変数の初期値とスコープ

変数の初期化は、以下のようなものですよね。

		int a = 1;

この例ではローカル変数 aに 1が代入されています。さて、この初期値の扱いについて、ここでは変数の種類別にまとめてみようと思います。また、変数のスコープ・有効期間についても変数の種類別にまとめてみようと思います。

変数の分類は、型に注目すると以下のどちらかに分類されます。

  • 基本型
  • 参照型

また、変数の所属に注目すると以下の 4つのどれかに分類されます。

  • ローカル変数
  • 引数
  • staticなフィールド
  • インスタンスフィールド

ここでは後者の 4つの分類を基準に、ひとつひとつ見ていこうと思います。

ローカル変数

初期値を代入しなかった場合

ローカル変数に初期値を代入しなかった場合、変数は未定義状態になりました、覚えているでしょうか。未定義状態のままの変数を利用しようとするとビルドエラーになります。

		int a;
		System.out.println("変数 aの値は " + a); // ビルドエラー

上記の例では変数 aを宣言したものの値の代入が行われていません。つまり、未定義状態のまま変数 aを利用しようとしています。したがって、ビルドエラーになります。

スコープ

ローカル変数のスコープは、その変数を宣言したところから、対応するカッコ「}」が終わるまでです。インデント 2段引きのところで宣言したローカル変数は、インデント 2段引きを終えるカッコ「}」のところまで、3段引きのところで宣言したローカル変数は 3段引きを終えるカッコ「}」のところまで、有効となります。したがって、以下の例ではビルドエラーになります。

		if(a == 1) {
			int b = 10;
		} else {
			int b = 20;
		}
		System.out.println("変数 bの値は " + b); // ビルドエラー

これは、2行目で宣言した変数 bは 3行目のカッコ「}」までしか有効ではない。また、4行目で宣言した変数 bは 5行目のカッコ「}」までしか有効ではない。そのため、6行目においては、「変数 bの存在なんて知らないよ」とビルドエラーになります。

引数

初期値を代入しなかった場合

引数とはメソッド宣言のところに記述されています。メソッドを呼ぶ側がすべての値を指定してメソッドを呼び出しますので、初期値が代入されないことは起こり得ません。もし、メソッドを呼び出す際に、値の数が型が異なったりしていたら、そもそもビルドエラーになります。

スコープ

引数のスコープは、そのメソッドの開始から終了までです。これは staticなメソッドだろうと、後述するインスタンスメソッドだろうと同じです。引数は、そのメソッドの中では自由に使用することができます。

staticなフィールド

初期値を代入しなかった場合

つい先ほど学習した staticなフィールドについては、初期値を代入しなかった場合、型に応じて以下の値が自動的に代入されます。言い換えれば、自分で値を記述しなかった場合には、以下の値が自動的に補完されるということでもあります。

  • 基本型
    • boolean型…false
    • byte型, short型, int型…0
    • long型…0L
    • char型…0
    • float型…0.0f
    • double型…0.0
  • 参照型…null

参照型についてはまだ解説していないですが、覚えてしまってください。

有効期間

staticなフィールドの有効期間は、プログラムの開始からプログラムの終了までです。つまり、いつでも使用することができます。例えば、Math.PIはいつでも使用することができます。

インスタンスフィールド

初期値を代入しなかった場合

もう少し先で解説するインスタンスフィールドについても、ここで覚えてしまいましょう。

インスタンスフィールドについては、初期値を代入しなかった場合、型に応じて以下の値が自動的に代入されます。言い換えれば、自分で値を記述しなかった場合には、以下の値が自動的に補完されるということでもあります。

  • 基本型
    • boolean型…false
    • byte型, short型, int型…0
    • long型…0L
    • char型…0
    • float型…0.0f
    • double型…0.0
  • 参照型…null

参照型についてはまだ解説していないですが、覚えてしまってください。

有効期間

インスタンスフィールドの有効期間についても覚えてしまいましょう。

インスタンスフィールドの有効期間は、そのそのインスタンスフィールドが所属するインスタンスが生成されてからガベージコレクトされるまでです。ただ、実質的にはそのインスタンスフィールドが所属するインスタンスが生成されてから、そのインスタンスが誰からも参照されなくなるまでということもできます。後者が実現すると、そのインスタンスおよびインスタンスフィールドは事実上、死に体になっています…あとは前者が成立するのをただ待つだけ、という状態になります。

これらの詳細について、またガベージコレクトについては後の章にて解説します。

最終更新: 2013/02/05 , 公開: 2013/02/05
▲top