クラスの中には、通常、メンバ変数、メンバ関数等を定義しますが、
クラスの中に別のクラスを定義する事もできます。
このようなクラスを内部クラス(インナークラス)と言います。
そのクラスの中でしか使わないクラスを
内部クラスとして定義するのが一般的な使い方です。
次の例は、内部クラスの例ですが、
内部クラスの機能を紹介した例です。
このような使い方が適しているワケではありません。
内部クラスの記述例
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メンバへはアクセス不可。
となっていますので、注意して下さい。