🎯

【Java】クラス解説38・ローカルクラス

2024/05/20に公開

ローカルクラス

ローカルクラスとは、内部クラスのうち、ブロック内に定義されるクラスです。主にメソッドブロック内で定義されることが多いです。
ローカルクラスは、以下の種類に分けられます。

  1. 通常クラス
  2. 列挙型
  3. レコードクラス

今回は、通常クラスについて解説します。

また、ローカルクラスにprivateprotected及びprivateを付与することはできません。

ローカルクラスをインスタンス化するコード例

public class Main {
    public static void main(String... args) {
        Fuzi fz = new Fuzi();
        fz.use();
    }
}

class Fuzi {
    // メソッド
    void use() {
        // メソッドブロック内にローカルクラス Sakura を定義
        class Sakura {
            public void print() {
                System.out.println("サクラ");
            }
        }

        // ローカルクラスをインスタンス化
        Sakura sk = new Sakura();

        // ローカルクラスのインスタンスから print メソッドを呼び出し
        sk.print();
    }
}

出力結果

サクラ

外側のクラスのprivateなインスタンス変数にローカルクラスからアクセスするコード例

public class Main {
    public static void main(String... args) {
        Fuzi fz = new Fuzi();
        fz.use();
    }
}

class Fuzi {
    // private なインスタンス変数
    private String name = "サクラ";
    
    void use() {
        // ローカルクラス
        class Sakura {
            public void print() {
                // 外側のクラスの private なインスタンス変数にアクセス
                System.out.println(name);
            }
        }

        Sakura sk = new Sakura();
        sk.print();
    }
}

出力結果

サクラ

外側のクラスのprivateなメソッドにローカルクラスからアクセスするコード例

public class Main {
    public static void main(String... args) {
        Fuzi fz = new Fuzi();
        fz.use();
    }
}

class Fuzi {
    // private なインスタンス変数
    private String name = "サクラ";
    
    // private なメソッド
    private void print() {
        System.out.println(name);
    }
    
    void use() {
        // ローカルクラス
        class Sakura {
            public void printName() {
                // 外側のクラスの private なメソッドにアクセス
                print();
            }
        }

        Sakura sk = new Sakura();
        // ローカルクラスのインスタンスから printName メソッドを呼び出し
        sk.printName();
    }
}

出力結果

サクラ

ローカル変数にアクセスするコード例

ローカルクラスでは、そのクラスが定義されているメソッドやブロックのfinalまたは実質的にfinalなローカル変数にのみアクセスできます。

public class Main {
    public static void main(String... args) {
        Fuzi fz = new Fuzi();
        fz.use();
    }
}

class Fuzi {
    // final なローカル変数 と 実質的に final なローカル変数 を仮引数として受ける
    private void print(String tempName1, String tempName2) {
        System.out.println(tempName1 + " と " + tempName2);
    }
    
    void use() {
        // final なローカル変数
        final String finalName = "フジ";
        // 実質的に final なローカル変数
        String name = "サクラ";
        
        // ローカルクラス
        class Sakura {
            public void printName() {
                // final なローカル変数 と 実質的に final なローカル変数 を実引数として渡す
                print(finalName, name);
            }
        }

        Sakura sk = new Sakura();
        sk.printName();
    }
}

出力結果

フジ と サクラ

Discussion