1. 概要

Javaでは、他のプログラミング言語と同様に、各変数にスコープがあります。 これは、変数を使用でき、有効なプログラムのセグメントです。

このチュートリアルでは、Javaで使用可能なスコープを紹介し、それらの違いについて説明します。

2. クラススコープ

private アクセス修飾子を使用してクラスのブラケット( {} )内で宣言されているが、メソッドの外で宣言されている各変数には、クラススコープがあります。 その結果、これらの変数はクラス内のどこでも使用できますが、クラス外では使用できません

public class ClassScopeExample {
    private Integer amount = 0;
    public void exampleMethod() {
        amount++;
    }
    public void anotherExampleMethod() {
        Integer anotherAmount = amount + 4;
    }
}

ClassScopeExample には、クラスのメソッド内でアクセスできるクラス変数amountがあることがわかります。

private を使用しない場合は、パッケージ全体からアクセスできます。 詳細については、アクセス修飾子の記事を確認してください。

3. メソッドスコープ

変数がメソッド内で宣言されている場合、その変数にはメソッドスコープがあり、同じメソッド内でのみ有効になります:

public class MethodScopeExample {
    public void methodA() {
        Integer area = 2;
    }
    public void methodB() {
        // compiler error, area cannot be resolved to a variable
        area = area + 2;
    }
}

methodA で、areaというメソッド変数を作成しました。 そのため、methodA内でareaを使用することはできますが、それ以外の場所では使用できません。

4. ループスコープ

ループ内で変数を宣言すると、その変数はループスコープを持ち、はループ内でのみ使用可能になります:

public class LoopScopeExample {
    List<String> listOfNames = Arrays.asList("Joe", "Susan", "Pattrick");
    public void iterationOfNames() {
        String allNames = "";
        for (String name : listOfNames) {
            allNames = allNames + " " + name;
        }
        // compiler error, name cannot be resolved to a variable
        String lastNameUsed = name;
    }
}

メソッドiterationOfNamesnameというメソッド変数があることがわかります。 この変数はループ内でのみ使用でき、ループ外では無効です。

5. ブラケットスコープ

角かっこ {} )を使用して、どこにでも追加のスコープを定義できます。

public class BracketScopeExample {    
    public void mathOperationExample() {
        Integer sum = 0;
        {
            Integer number = 2;
            sum = sum + number;
        }
        // compiler error, number cannot be solved as a variable
        number++;
    }
}

変数numberは、角かっこ内でのみ有効です。

6. スコープと可変シャドウイング

クラス変数があり、同じ名前のメソッド変数を宣言したいとします。

public class NestedScopesExample {
    String title = "Baeldung";
    public void printTitle() {
        System.out.println(title);
        String title = "John Doe";
        System.out.println(title);
    }
}

title を初めて印刷するときは、「Baeldung」が印刷されます。 その後、同じ名前のメソッド変数を宣言し、それに値「JohnDoe」を割り当てます。

titleメソッド変数は、class変数titleに再度アクセスする可能性をオーバーライドします。 そのため、2回目は「JohnDoeと表示されます。

紛らわしいですよね? これは可変シャドウイングと呼ばれます良い習慣ではありません。 this.titleのようなtitleクラス変数にアクセスするには、プレフィックスthisを使用することをお勧めします。

7. 結論

Javaに存在するさまざまなスコープを学びました。

いつものように、コードはGitHubで入手できます。