menu
書いてる野郎
orebike@gmail.com
このように、class の内部にもう一つ class を作ることができる。
public class Outer { private Inner inner; class Inner{ private String v; public Inner(String v){ this.v = v; } } public void showInner() { this.inner = new Inner("hogehoge"); System.out.println(this.inner.v); } }
結構驚きな動きをするので注意が必要である
外側ということは内部クラスが記述されているクラスのこと。
内部クラスというのは扱いとしてはその外部のクラスの「インスタンス」の一部ということになっている。 なので外部のクラスのインスタンスに対してはその可視性がちょっと変わった挙動を示す。
内部クラスのインスタンスに対しては外部クラスのインスタンスはまったく自身のフィールドやメソッドと同じように扱うことができるようになっている。
例えば、内部クラスが private 宣言しているメソッドやフィールドに対して外部クラスのインスタンスはそれを全部無視してアクセスし放題になる。
結構考えて作らないとこの仕様はヤバイと思う。
この内部クラスはクラスではなく、そのインスタンスに所属するものらしく、内部クラスというよりもインスタンスメソッドの一部という側面がある
なので使うにはこのようにインスタンスの new メソッド的なものをキックすることで呼び出すことができる。
(new Hoge()).new Piyo();
よく使う場合はこれでいいかも。this キーワードの that 変数で固定化してクロージャに持ち込む Javascript の定番手法を Java でやってみた。
class Hoge{ private Hoge that = this; class Piyo{ public void fuga(){ //ここで that が親の this の参照として使える } } }
class Hoge{ class Piyo{ public void fuga(){ //ここでは Hoge.this が外部クラスのインスタンスを指す } } }
こういうやつ
public class Hoge{ public static class Piyo{ public static final FUGA = "ふが"; } }
このように内部にアクセスできる
String fuga = Hoge.Piyo.FUGA
の関連項目を内部に持っておけるとまとめて管理できるので便利だな。Androidのフレームワークがこんなことやってた