以上、 Java の基本データ型とそのリテラルについて見てきました。変数宣言と値の代入についてまとめておきます。
変数を定義するには、次の二つを宣言する必要があります:
つまり、基本データ型に従う変数を定義したら、そのデータ型の値を変数に代入しておかないと使えません。
//基本的な変数の定義方法 int i1; //1.基本データ型宣言 i1 = 100; //2.変数 i1 の初期化 //簡略化された変数の定義方法 int i2 = 100;
整数は int 型、浮動小数点数は double 型が良く用いられます。目的に応じて使い分けましょう。
変数には具体的な値が代入されていないと使えません。上の例では、変数 i1 と i2 に 100 が初期値として代入されています。
変数は定義した範囲内でしか利用できず、さらに、定義した階層で初期化しないとコンパイルエラーとなり使えません。この範囲の事をスコープと呼びます。
範囲の境界は {} です。{ から } までをブロックと呼びますが、ブロックの中に別のブロックが入る事が良くあります。今までのソースコードにも現れていますね?
{
// 外側のブロック
{
// 内側のブロック
}
}
最初に正しい例を示します。
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>
ブロック外で定義された変数を内側のブロック内で初期化した例です。
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>