内部クラス2


メンバクラス

前回のネストトップレベルクラスは、スコープ内で宣言されるクラスというだけで
その機能は内部クラスというより、トップクラスでした

今回はメンバクラスと呼ばれる内部クラスの取り扱いを説明します
メンバクラスは、普段Javaプログラマが「内部クラス」と呼ぶものでもあります
インナークラスと呼んだりもします

ネストトップレベルクラスと違うのはインスタンスが必要である点です
ネストトップレベルクラスはstaticなクラスでした
これは、thisを持たないクラスであり、インスタンスを生成する必要はありません

そのため、インスタンスを持たないstaticなmain()メソッドから生成することができたのです
しかし、メンバクラスはインスタンスを宣言しなければならいのです

さらに、メンバクラスのメンバにはstaticを宣言できません
staticを宣言したい場合は、ネストトップレベルクラスにする必要があります
class test {
        public static void main(String args[]) {
                top obj = new top();
                top.Kitty rena = obj.getKitty();
                rena.write();
        }
}

class top {
        Kitty getKitty() {
                Kitty obj = new Kitty();
                return obj;
        }
        class Kitty {
                void write() {
                        System.out.println("Kitty on your lap");
                }
        }
}
ネストトップレベルクラスでは、内部クラスから外側のメンバを直接参照することはできませんでした
しかし、メンバクラスの場合はトップクラスの一部であると考えられるので
内部クラスからトップクラスのメンバにアクセスすることが出きるのです

言いかえれば、「内部クラスのオブジェクトは外側のクラスのインスタンスに関連付けられている」
と考えることができます

これは、内部クラスが扱うインスタンスが二つあることを表します
一つは自らのクラスのオブジェクトを指すthisと
もう一つは、その外側のトップクラスをさすポインタと考えることができる
(概念の問題は、オブジェクト指向プログラムの研究者がやればよい。よくわからなければ、とりあえず使い方だけ覚えれば良いでしょう)
class test {
        public static void main(String args[]) {
                top obj = new top();
                top.Kitty rena = obj.getKitty();
                rena.write();
        }
}

class top {
        Kitty getKitty() {
                Kitty obj = new Kitty();
                return obj;
        }
        void write(String str) {
                System.out.println(str);
        }
        class Kitty {
                void write() {
                        top.this.write("Kitty on your lap");
                }
        }
}
このプログラムは、まずKitty.write()を実行する
Kitty.write()メソッドは外側のクラスのtop.write()メソッドを自らのオブジェクトで実行する
この動作は、内部クラスの特徴といえますね

メンバクラスの場合は、外部から見えるクラスでもなく
パッケージを直接構成するわけでもありません
内部クラスの主な利用法は代行イベントモデルで使用されます

これは、JDK1.1以降のGUIイベントプログラミングであり、コンソールでは扱いません
GUIプログラムについては、グラフィカルJava入門を参照してください



前のページへ戻る次のページへ