スポンサードリンク
HOME > Java > 内部クラスについて

Java - 内部クラスについて

クラスの中には、通常、メンバ変数、メンバ関数等を定義しますが、

クラスの中に別のクラスを定義する事もできます。

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

そのクラスの中でしか使わないクラスを

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

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

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

プログラム例

ファイル名:Cmain.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にすると、どうなるか見てみましょう。

プログラム例

ファイル名:Cmain.java

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メンバへはアクセス不可


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



スポンサードリンク







HOME

言語解説編
プログラミング用語・知識

C言語

C++言語

Java

C#

Visual Basic.NET

アプリケーション編
C言語による
コンソールプログラミング




Copyright (C) プログラミングランド All Rights Reserved