ローカルクラス

外部クラスのメソッド内でクラス定義するクラスをローカルクラスといいます。
有効範囲は宣言したメソッド内だけです。

また、ローカルクラスはメンバークラスと異なりstatic修飾子とアクセス修飾子を用いることができません。

ローカルクラスで用いることのできるクラス修飾子はfinalとabstractだけです。

また、extendsやimplementsを用いた継承や実装も可能です。

ローカルクラスのオブジェクトの生成はその宣言をしたメソッド内で行わなければいけません。
つまり他のクラスやメソッド内でオブジェクトの生成はできません。

変数へのアクセス

メンバークラス同様にローカルクラスも外部クラスのメンバーにアクセス可能ですが
ローカルクラスもアクセスには制限があります。
以下にまとめてみました。

つまり上の図で説明しますと、ローカルクラスから外部クラスのメンバーにはアクセスできますが、
クラスを宣言しているメソッド内の変数にはfinal変数にしかアクセスできません。
つまり変数a と c にはアクセスできますが bにはアクセスできないのです。
では、このことを実際にサンプルプログラムで確認したいと思います

サンプルプログラム(Sample80.java)

class Sample80{
int a;
    void method(){
    //メソッド内の変数をfinalで定義しました
      final int b = 20;

      class Inner80{
         void Innermethod(){
    a = 20;
    int c = b;

    System.out.println("これはローカルクラス内です");
    System.out.println("a = " + a);
    System.out.println("c = " + c);
    }
 }
   //内部クラスのオブジェクト生成

   Inner80 in = new Inner80();
    in.Innermethod();

 }

   public static void main(String args[]){

   //外部クラスのオブジェクト生成

  Sample80 obj = new Sample80();
   obj.method();
    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行します。

まずは、正常にコンパイル実行ができるサンプルです。
次のサンプルプログラムはコンパイルエラーになります。

サンプルプログラム(Sample80_1.java)

class Sample80_1{ 
 int a;
    void method(){
      int b = 20;
      class Inner80_1{
         void Innermethod(){
    a = 20;
    int c = b;
    System.out.println("これはローカルクラス内です");
    System.out.println("a = " + a);
    System.out.println("c = " + c);
    }
 }

   //内部クラスのオブジェクト生成

   Inner80_1 in = new Inner80_1();
    in.Innermethod();

 }


   public static void main(String args[]){

   //外部クラスのオブジェクト生成

  Sample80_1 obj = new Sample80_1();
   obj.method();
} }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行します。

今度はこのようなコンパイルエラーが出ました。
上記2つのサンプルプログラムの違いは外部クラスのメソッドで定義されている変数bがfinalにしているかどうかの違いだけです。
最初に説明した通りローカルクラスの場合はそのローカルクラスの宣言をしているメソッド内の変数はfinal変数にだけしかアクセスできません。

また、ローカルクラスの場合は必ずそのメソッド内でオブジェクトの作成をしなければなりません。

ページのトップへ戻る