Java / 基礎 / クラス / 内部クラス

Java / 基礎 / クラス / 内部クラス

基本

このように、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 変数で固定する

よく使う場合はこれでいいかも。this キーワードの that 変数で固定化してクロージャに持ち込む Javascript の定番手法を Java でやってみた。

class Hoge{
    private Hoge that = this;
    class Piyo{
        public void fuga(){
            //ここで that が親の this の参照として使える
        }
    }
}

外部クラス 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のフレームワークがこんなことやってた

Tags

java/basic/class/inner_class.txt · 最終更新: 2020-12-18 13:00 by ore