JAVA インナークラス・ローカルクラス


ローカルクラスとは
外部クラスのメソッド内でクラス定義する
クラスをローカルクラスという。
一般的にはメソッドの中で局所的に定義されたクラスのことをいう。
ローカルクラスは内部クラスの一種なので、static なフィールド変数やメソッドを定義することはできない。

  • ローカルクラスの特徴_________________________________
  • finalとabstract以外の修飾は行えない(必要がない)。
  • 外部クラスのメンバーにはアクセス可能。
  • 自分を取り囲むメソッド内のローカル変数については finalが付いたものにのみアクセス可能
    _________________________________________________________

「自分を取り囲むメソッド内のローカル変数については
finalが付いたものにのみアクセス可能」はJava1.8以降は無視していい
JDK1.8では、“実質的にfinal(effectively final)”な変数にはfinalを付けなくてもよくなった。
内部クラスやラムダ式において、その外側で定義されているローカル変数を使う場合は、そのローカル変数に暗黙にfinalが付いているものと見なされる。
参考ページ→Effectively Final

▪️Test96.java ローカルクラス 例①

//*ローカルクラス例
public class Test96 {
    int outerMember;
    final int outerMember2 = 80;
    int outerMember3 = 500;

    void outerMethod() {
        int a = 10;
        final int b = 20;
        // ローカル変数はfinalのみ使える↓×
        // static int m = 19;
        // 外部クラスのメソッド内でクラス定義するクラスを
        // ローカルクラスという
        // ローカルクラスの修飾子はfinalとabstractのみ使える
        // ローカルクラス↓
        class LocalClass {
            // staticなフィールド変数やメソッドを定義できない
            // static int i = 100;NG
            final int i2 = 120;
            // abstract int i3 = 130;
            // System.out.println(a);
            // System.out.println(b);

            public void innerMethod() {
                outerMember = 2;
                System.out.println("innerMethodです");
                System.out.println(outerMember);
                System.out.println(a);
                System.out.println(b);
                System.out.println(outerMember2);
                System.out.println(outerMember3);
            }
        }
        // innerMethod();では使えない
        // 同じメソッド内ですぐに利用
        LocalClass lc = new LocalClass();
        lc.innerMethod();
    }

    public static void main(String[] args) {
        Test96 t = new Test96();
        t.outerMethod();
    }
}

▪️Test96.java ローカルクラス 例① 実行結果
innerMethodです
2
10
20
80
500

▪️Test97.java ローカルクラス 例②

//ローカルクラスTest96のコピー

public class Test97 {
    int outerMember;
    final int outerMember2 = 80;
    int outerMember3 = 500;

    void outerMethod() {
        int a = 10;
        final int b = 20;

        class LocalClass {
            final int i2 = 120;
            // System.out.println(b);

            public void innerMethod() {
                outerMember = 2;
                System.out.println("innerMethodです");
                System.out.println(a);
                System.out.println(b);
                System.out.println(outerMember2);
                System.out.println(outerMember3);
            }
        }
        LocalClass lc = new LocalClass();
        lc.innerMethod();

    }

    public static void main(String[] args) {
        Test97 t = new Test97();
        t.outerMethod();
    }
}

▪️Test97.java ローカルクラス 例②実行結果
innerMethodです
2
10
20
80
500

▪️Test98.java ローカルクラス 例③

public class Test98 {
    // 自分を取り囲むメソッド内のローカル変数についてはfinalが付いた
    // ものにのみアクセス可能
    public static void main(String[] args) {
        final int a = 10;
        // Java1.8以降ではfinalをつけなくても良くなった
        // 自動的にfinalになってしまう
        int b = 20;
        final String moji = "あ";
        String moji2 = "い";

        class LocalClass {
            void printA() {
                System.out.println(a);
                System.out.println(moji);
            }
        }

        LocalClass lc = new LocalClass();

        // new LocalClass().printA();
    }
}

▪️Test98.java ローカルクラス 例③実行結果

▪️Test97.java ローカルクラス 例③

//ローカルクラスTest96のコピー

public class Test97 {
    int outerMember;
    final int outerMember2 = 80;
    int outerMember3 = 500;

    void outerMethod() {
        int a = 10;
        final int b = 20;

        class LocalClass {
            final int i2 = 120;
            // System.out.println(b);

            public void innerMethod() {
                outerMember = 2;
                System.out.println("innerMethodです");
                System.out.println(a);
                System.out.println(b);
                System.out.println(outerMember2);
                System.out.println(outerMember3);
            }
        }
        // 方法①と②どっちでもいい
        LocalClass lc = new LocalClass();
        lc.innerMethod();// 方法①
        new LocalClass().innerMethod();// 方法②

    }

    public static void main(String[] args) {
        Test97 t = new Test97();
        t.outerMethod();
    }
}

▪️Test97.java ローカルクラス 例③ 実行結果
innerMethodです
10
20
80
500
innerMethodです
10
20
80
500