/** 内部に子供のクラスの定義を持つクラス */
public class Father {
/** 子供のクラスの定義 */
class Child {
public String name;
public int age;
}
/** 上で定義した子供のクラスの配列 */
private Child children[];
}
上の例ではクラスFather の中にさらにクラスChild が定義されています。
このような階層関係は多重になってもかまいません。
innerクラスの内部にさらに innerクラスを定義することもできるわけです。
innerクラスを用いると、
専用の部品の記述が手軽にできるなどプログラミングの柔軟度が高まります。
innerクラスは必要になったその場所で、 その場限りの利用をするというケースが多いでしょう。 そのため、クラス定義とオブジェクトの生成を同時に行えるようになっています。 また、その時にクラスの名前を付けるのを省略してしまうことすらあります。
/** 内部に子供のクラスの定義を持つクラス */
public class Mother {
/** 最初に呼び出されるメソッド */
public static void main( String argv[] ) {
/* Objectクラスをスーパークラスとする新しいクラスの定義と
そのオブジェクトの生成を同時に行う。クラス名は省略 */
Object child
= new Object(){
public String name="";
public int age=0;
};
}
}
上のソースをコンパイルすると、
innerクラスのバイトコードのファイル名はどうなるのでしょうか?
この場合はクラス名が存在しないので、
本来クラス名が入るべきところは適当な数字を使って区別します。
上の例では Mother.class の他に
Mother$1.class という名前のバイトコードが生成されます。