変数と初期化

以上、 Java の基本データ型とそのリテラルについて見てきました。変数宣言と値の代入についてまとめておきます。

変数定義

変数を定義するには、次の二つを宣言する必要があります:

  1. 変数の値として可能な基本データ型
  2. その変数の初期値

つまり、基本データ型に従う変数を定義したら、そのデータ型の値を変数に代入しておかないと使えません。

//基本的な変数の定義方法
	int i1; 	//1.基本データ型宣言
	i1 = 100;	//2.変数 i1 の初期化
//簡略化された変数の定義方法
	int i2 = 100;

整数は int 型、浮動小数点数は double 型が良く用いられます。目的に応じて使い分けましょう。

変数の初期化

変数には具体的な値が代入されていないと使えません。上の例では、変数 i1i2100 が初期値として代入されています。

変数は定義した範囲内でしか利用できず、さらに、定義した階層で初期化しないとコンパイルエラーとなり使えません。この範囲の事をスコープと呼びます。

範囲の境界は {} です。{ から } までをブロックと呼びますが、ブロックの中に別のブロックが入る事が良くあります。今までのソースコードにも現れていますね?

{
	// 外側のブロック
	{
		// 内側のブロック
	}
}

正しい例

最初に正しい例を示します。

ScopeDemo1.java:

class ScopeDemo1 {
	public static void main(String[] args) {
		int i = 0;
		for (int j = 0; j < 10; j++) {
			i = i + j;
			System.out.println(j);
		}
		System.out.println(i);
	}
}

for ブロックは、繰り返しを表すブロックです。上の例では、変数 j が0~9までの間、ブロック内を繰り返します。詳しくは 「for ブロック」の項で説明します。

C:\Java>javac ScopeDemo1.java
C:\Java>java ScopeDemo1
0
1
2
3
4
5
6
7
8
9
45
C:\Java>

悪い例

単純な悪い例です。

class ScopeDemo2 {
	public static void main(String[] args) {
		int i = 0;
		for (int j = 0; j < 10; j++) {
			i = i + j;
		}
		System.out.println(j + ", " +  i);
	}
}

for ブロック内で定義/初期化された変数 j が、ブロックの外で参照されています。制御がブロックから抜けた時点で j はメモリ上からドロップされて失われていますので、これは誤りであり、コンパイルを通りません。

C:\Java>javac ScopeDemo2.java
ScopeDemo2.java:7: シンボルを解釈処理できません。
シンボル: 変数 j
位置    : ScopeDemo2 の クラス
                System.out.println(j + ", " +  i);
                                   ^
エラー 1 個
C:\Java>

悪い例その2

ブロック外で定義された変数を内側のブロック内で初期化した例です。

class ScopeDemo3 {
	public static void main(String[] args) {
		int i, j;
		i = 10;
		if (i < 100) {
			j = 5;
			i = i + j;
		}
		System.out.println(j + ", " +  i);
	}
}

if ブロックは、条件分岐をあらわすブロックです。上の例では、変数 i が100未満だったらブロック内を実行します。詳しくは「if ブロック」の項で説明します。

C:\Java>javac ScopeDemo3.java
ScopeDemo3.java:9: 変数 j は初期化されていない可能性があります。
                System.out.println(j + ", " +  i);
                                   ^
エラー 1 個
C:\Java>

正しい例

「悪い例その2」に似ているけれども正しい例です。

class ScopeDemo4 {
	public static void main(String[] args) {
		int i, j;
		i = 10;
		if (i < 100) {
			j = 5;
			i = i + j;
			System.out.println(j + ", " +  i);
		}
		// System.out.println(j + ", " +  i);
	}
}

「悪い例その2」の System.out.println() をブロック内に移動させたものです。ブロック内で初期化した変数をブロック内から参照しているのでコンパイルを通り正しく動作します。しかし、紛らわしいのでお勧めはしません。変数の定義と初期化は同じブロック内で行い、そのブロック内だけで使うと言うことが基本です。

C:\Java>javac ScopeDemo4.java
C:\Java>java ScopeDemo4
5, 15
C:\Java>


Copyright © 2001-2002 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu