・ innerクラス

クラスのメンバーとして、 その内部にクラスまたはインターフェイスの定義を行うこともできます。 このようなクラスを innerクラスと呼びます。


/** 内部に innerクラスの定義を持つクラス */
public class Father {

   /** innerクラスの定義 */
     class Child {
            public String name;
            public int age;
     }   

   /** 上で定義した innerクラスの配列 */
     private Child children[];
}

innerクラスも独立したバイトコードとして生成されます。 ただし、どのクラスの内部で定義されたものなのかがファイル名に反映されます。 クラスの階層関係は "$" を区切り文字として表されます。 上の例では Father.class の他に Father$Child.class という名前の バイトコードが生成されることになります。 innerクラスの階層関係は多重になってもかまいません。 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 という名前のバイトコードが生成されます。