Javaの変数のスコープとは?使える範囲をメソッドとブロックで理解する

最終更新日

Schoo Java入門 初級【2026年版】

本記事は、Schooの「Java入門 初級【2026年版】」第6回「メソッド」を学ぶ前後に、Javaの変数のスコープを整理したい方向けのステップアップ学習記事です。

ただし、Schooを受講していない方でも、メソッド、引数、ローカル変数の基本を学んだあとに読み進められる内容にしています。

Schoo コースページ:Java入門 初級【2026年版】

スコープとは、変数を使える範囲のことです。Javaでは、変数をどこで宣言したかによって、その変数を使える場所が決まります。

スコープは変数を使える範囲

次の例では、calculateDiscount メソッドの中で discount を宣言しています。この変数は、calculateDiscount メソッドの中では使えますが、別のメソッドからは直接使えません。

public static int calculateDiscount(int total) {
    int discount = 0;
    return discount;
}

public static void printResult() {
    System.out.println(discount); // エラー
}

printResult メソッドの中には discount が宣言されていないため、Javaはその変数を見つけられません。メソッドが違えば、同じクラスの中に書いていても、ローカル変数をそのまま共有できるわけではありません。

図解:メソッドの中で宣言した変数は、そのメソッドの中だけ
メソッドごとのスコープ
public class OrderService {
  public static int calculateDiscount(int total) {
    int discount = 0;
    return discount;
  }
  public static void printResult() {
    System.out.println(discount);
  }
}
青い範囲
discount を宣言した calculateDiscount メソッドの中です。この中では discount を使えます。
黄色い範囲
別のメソッドです。ここでは discount は宣言されていないため、直接使えません。
スコープは、変数を使える範囲です。メソッド内で宣言した変数は、基本的にそのメソッド内だけで使えます。

ブロックの中で宣言した変数は外で使えない

iffor{ } の中で宣言した変数は、そのブロックの中だけで使えます。

public static void printJudge(int score) {
    if (score >= 80) {
        String result = "合格";
        System.out.println(result);
    }

    System.out.println(result); // エラー
}

resultif の中で宣言されています。そのため、if} を出たあとでは使えません。

図解:ifやforの { } の中で宣言した変数は、そのブロックの中だけ
ブロックのスコープ
public static void printJudge(int score) {
  if (score >= 80) {
    String result = “合格”;
    System.out.println(result);
  }
  System.out.println(result);
}
resultif{ } の中で宣言されています。そのため、} を出たあとでは使えません。
{ } で囲まれた範囲をブロックと呼びます。ブロックの中で宣言した変数は、そのブロックの外からは見えません。

外でも使いたい値は外側で宣言する

if の中で決めた値を、if の後でも使いたい場合は、変数を if の外側で宣言します。

public static void printJudge(int score) {
    String result;

    if (score >= 80) {
        result = "合格";
    } else {
        result = "再提出";
    }

    System.out.println(result);
}

この例では、resultif より外側で宣言しています。そのため、if の中で値を入れたあと、最後の System.out.println(result); でも使えます。

図解:外でも使いたい変数は、外側で宣言してから中で値を入れる
外側に宣言する例
public static void printJudge(int score) {
  String result;
  if (score >= 80) {
    result = “合格”;
  } else {
    result = “再提出”;
  }
  System.out.println(result);
}
resultif より外側で宣言しているため、if の後でも使えます。
変数をどこで宣言するかによって、その変数を使える範囲が変わります。

for文の変数にもスコープがある

for 文で宣言したカウンタ変数も、基本的には for 文の中だけで使います。

for (int i = 0; i < 3; i++) {
    System.out.println(i);
}

System.out.println(i); // エラー

int i = 0for 文の中で宣言されています。そのため、for 文が終わったあとに i を使うことはできません。

引数、ローカル変数、フィールドの使える範囲

メソッドの引数は、そのメソッドの中で使えます。ローカル変数は、宣言したメソッドやブロックの中で使えます。フィールドは、オブジェクトが持つ値なので、同じオブジェクトのメソッドから参照できます。

public class Student {
    String name; // フィールド

    public void printMessage(int score) { // score は引数
        String result = "点数:" + score; // result はローカル変数
        System.out.println(name + "さんの" + result);
    }
}

namescoreresult はすべて変数ですが、使える範囲が違います。コードを読むときは、「この変数はどこで宣言されたか」を見ると、使える範囲を判断しやすくなります。

確認問題

  1. calculateDiscount メソッドの中で宣言した discount は、別のメソッドから直接使えますか。
  2. if{ } の中で宣言した result を、if の外で使うとどうなりますか。
  3. if の中で決めた値を if の後でも使いたい場合、変数はどこで宣言するとよいですか。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

あわせて読みたい関連記事

まとめ

スコープは、変数を使える範囲のことです。メソッドの中で宣言した変数はそのメソッドの中だけ、iffor のブロック内で宣言した変数はそのブロックの中だけで使えます。変数をどこで宣言するかを意識すると、エラーの原因を見つけやすくなり、読みやすいコードを書きやすくなります。

シェアする