Java 内部クラスについて

クラスの中には、通常、メンバ変数、メンバ関数等を定義しますが、
クラスの中に別のクラスを定義する事もできます。

このようなクラスを内部クラスインナークラスと言います。

そのクラスの中でしか使わないクラスを
内部クラスとして定義するのが一般的な使い方です。

次の例は、内部クラスの例ですが、
内部クラスの機能を紹介した例です。

このような使い方が適しているワケではありません

内部クラスの記述例

class A {

      public int data1;
      public B obj;

      public void A() {
            obj = new B();      // 内部クラスインスタンス生成
      }

      public void show_data1() {
            System.out.printf("data1 = %d\n", data1);
      }

      class B{      // 内部クラス定義

            public int data2;

            public void show_data2() {
                  System.out.printf("data2 = %d\n", data2);
            }
      }
}

public class Cmain {

      public static void main(String[] args) {
            A a = new A();
            a.data1 = 10;      // 通常のメンバ変数アクセス
            a.show_data1();    // 通常のメンバ関数呼び出し

            a.obj.data2 = 10;      // クラスAを介してクラスBにアクセス
            a.obj.show_data2();    // クラスAを介してクラスBにアクセス

//          B b = new B();      // これはエラー

   }
}

この例では、クラスAの中に内部クラスBを定義した例です。

クラスAには、クラスBのインスタンス用の変数objも用意されています。

このobjを使って内部クラスBにアクセスしています。

別のクラスからは、クラスBが見えないので、
クラスB型の変数を定義する事も
インスタンスを生成する事もできません。


上記の例は、全てのメンバをpublic指定にしました。

次は、内部クラスのメンバをprivateにしたり、

内部クラスを含むクラスのメンバをprivateにすると、
どうなるか見てみましょう。

内部クラスのメンバをprivate指定した例

class A {

      private int data1;
      public B obj;

      public void A() {
            obj = new B();      // 内部クラスインスタンス生成
      }

      public void show() {
            data1 = 5;
            obj.data2 = 10;
//          data2 = 10;         // エラー
            System.out.printf("data1 = %d\n", data1);
            System.out.printf("data2 = %d\n", obj.data2);
//          System.out.printf("data2 = %d\n", data2);      // エラー
      }

      class B{      // 内部クラス定義

            private int data2;

            public void show() {
                  data1 = 5;      // エラーにならない
                  data2 = 10;
                  System.out.printf("data1 = %d\n", data1);
                  System.out.printf("data2 = %d\n", data2);
            }
      }
}

public class Cmain {

      public static void main(String[] args) {
            A a = new A();
            a.show();
            a.obj.show();
      }
}

この例では、
クラスAとその内部クラスBのメンバ変数をprivateにした例です。

この例を見てみると、
内部クラス内から、内部クラスを含むクラスの
privateメンバにアクセスできる事が見て取れます。

これは、内部クラス特有の機能です。

逆に、内部クラスを含むクラスからは、
内部クラスのprivateメンバへはアクセス不可


となっていますので、注意して下さい。