スコープに応じて、変数は通常、メンバー変数とローカル変数の異なるタイプに分類されます。これらの変数については、以下で詳しく説明します。
メンバー変数
Javaのメンバー変数には、グローバル変数と静的変数 (クラス変数) の 2 種類があります。定義はメソッド本体とステートメント ブロックの外側にあり、どのメソッドにも属さず、スコープはクラス全体です。
名前 | 変更 | アクセス | ライフサイクル |
---|---|---|---|
グローバル変数(インスタンス変数) | static | オブジェクト名.変数名 | インスタンス変数は、オブジェクトが参照として扱われる限り存在します。 |
静的変数(クラス変数) | static | クラス名.変数名またはオブジェクト名.変数名 | その存続期間はクラスの存続期間によって異なります。クラスは、ガベージ コレクション メカニズムによって完全に回収された場合にのみ破棄されます。 |
クラス内で 4 つの変数が宣言されていると仮定して、テスト クラスの出力によって変数の値を変更するサンプル コードを以下に記述します。
変数宣言コードは次のようになります。
public class DataClass {
String name; // メンバ変数、インスタンス変数
int age; // メンバ変数、インスタンス変数
static final String website = "IT基礎"; // メンバ変数、静的変数(クラス変数)
static String URL = "https://it-kiso.com"; // メンバ変数、静的変数(クラス変数)
}
テストクラスのコードは次のとおりです。
public class Test {
public static void main(String[] args) {
// クラスのオブジェクトを作成する
DataClass dc = new DataClass();
// オブジェクト名.変数名でインスタンス変数(グローバル変数)を呼び出す
System.out.println(dc.name);
System.out.println(dc.age);
// オブジェクト名.変数名で静的変数(クラス変数)を呼び出す
System.out.println(dc.website);
System.out.println(dc.URL);
// クラス名.変数名で静的変数(クラス変数)を呼び出す
System.out.println(DataClass.website);
System.out.println(DataClass.URL);
}
}
この例のコードの最初のセクションでは、4 つのメンバー変数が定義されており、出力結果から、name と age にはシステムのデフォルトの初期化値が表示され、Web サイトと URL には初期化された値が表示されていることがわかります。また、static Final で変更された変数には初期値を割り当てる必要があります。
ローカル変数
ローカル変数は、メソッドまたはメソッド コード ブロックで定義された変数を指し、そのスコープはそれが配置されているコード ブロックです。以下の3種類に分けられます。
- メソッド パラメータ変数 (パラメータ): メソッド全体で有効です。
- メソッド ローカル変数 (メソッド内で定義): 変数が定義された時点からメソッドの終了まで有効です。
- コード ブロック ローカル変数 (コード ブロック内で定義): この変数の定義からコード ブロックの終わりまでの期間有効です。
ローカル変数は、使用する前にプログラマによって積極的に値に初期化される必要があります。
1) メソッドのローカル変数
2 つのローカル変数を宣言し、その値を出力する実装コードは次のとおりです。
publicクラスTest2 {
public static void main(String[] args) {
int a = 7;
if (5 > 3) {
int s = 3; // int型のローカル変数を宣言
System.out.println("s=" + s);
System.out.println("a=" + a);
}
System.out.println("a=" + a);
}
}
上記の例では、2 つのローカル変数 a と s が定義されており、int 型 a のスコープは main() メソッド全体で、int 型変数 s のスコープは if ステートメントのコード ブロック内にあり、実行されます。
変数 s が if メソッドの外で呼び出された場合、変数を解決できないというエラーが報告されます。
2) メソッドパラメータ変数
メソッドのパラメータとして宣言された変数のスコープはメソッド全体です。
メソッドのパラメータ変数を宣言します。実装コードは次のとおりです。
public class Test3 {
public static void testFun(int n) {
System.out.println("n=" + n);
}
public static void main(String[] args) {
testFun(3);
}
}
上記の例では、int 型のパラメーター変数 n を含む testFun() メソッドが定義されており、そのスコープは testFun() メソッドの本体内にあります。メソッドが呼び出されるとき、パラメーター 3 が渡されるため、出力コンソールの n 値は 3 になります。
3) コードブロックローカル変数
コード ブロックのローカル変数は、try catch コード ブロックでよく使用され、例外処理パラメーター変数になります。
例外処理パラメータ変数のスコープは例外処理ブロック内にあり、この変数はメソッド パラメータ変数と同様に、例外処理パラメータを例外処理ブロックに渡します。
例外処理ステートメントを宣言します。実装コードは次のとおりです。
public class Test4 {
public static void test() {
try {
System.out.println("こんにちは!例外発生!");
} catch (Exception e) { // 例外処理ブロック、引数は Exception 型
e.printStackTrace();
}
}
public static void main(String[] args) {
test();
}
}
上記の例では、例外処理文が定義されており、例外処理ブロック catch のパラメータは Exception 型の変数 e、スコープは catch ブロック全体です。