inner classを使う


inner classはクラスの中に定義されたクラスです。
限られたクラスからしか、利用されない(外側のクラスと密に結びついた)クラスを記述する目的に使われ、
GUIのイベントを処理する際によく使われます。

メンバ変数やメソッドと同じく、外側クラスのメンバとして記述されるメンバーインナークラスと
メソッドのコードブロックの中に記述される、ローカルインナークラスがあります。
ローカルインナークラスにはクラス名を持たない、匿名インナークラスを作る事が可能です。



下のサンプルコードは3つの数値を計算するプログラムで、コンストラクタに与えられた数値を2倍し、5を引いています。(bi1 * i9 -  i9)
メンバーインナークラスのサンプルです。

class ExamInnerBase  {
    int  bi1;
          @
    int  i9   = 5;
          A
    ExamInnerBase(int  i1) {
        bi1  =  i1;
    } 
    class  InnerMenber  {
         int  i9     =  2;
         int  mi1  =  bi1  *  i9  -  ExamInnerBase.this.i9;         //InnerMenber -> InnerBase  
                       @                        A
    }
}

public  class ExamInner  {
    public static  void main(String args[]) {
        ExamInnerBase  eib  =  new  ExamInnerBase(100);
        ExamInnerBase.InnerMenber  im  =   eib.new  InnerMenber();
                                                           B
        System.out.println(im.mi1);
        System.out.println( new ExamInnerBase(10).new InnerMenber().mi1);
                                                B
    }
}

<実行結果>
コンソール画面に
195
15

と表示されます。

@ 変数 bi1 変数bi1は外側クラスのメンバー変数です。インナークラスは外側クラスのメンバ変数を利用出来ますし、
外側クラスのメソッドも利用可能です。
A 変数 i9 変数i9は外側クラスのメンバー変数とインナークラスにも同名の変数があります。その場合、インナークラスから
外側クラスの変数を指定するために、クラス名.this.変数名と記述します。
インナークラスでDialog-boxを表示する時に、外側のクラスへの参照を渡したい時などに使う事があります。
(外側クラスがFrameクラスのサブクラスの場合など。)
Bインスタンス化 インスタンスを2つ作成しています。1つは外側クラスのインスタンスを作成し、その参照からインナークラスを
インスタンス化、もう1つはインスタンスへの参照名を付けずにインスタンス化しています。