メンバークラスとは、
クラス内の変数やメソッドと同様にクラスをメンバーとして宣言できる。
static付きメンバークラスと非staticメンバークラスは、全く別物。

メンバーとは「フィールド」「メソッド」「(メンバークラスとしての)インナークラス」。
メンバーの中にあるインナークラスはメンバークラス

メンバークラス宣言に関してはstaticを付けるか付けないかで利用法に大きな違いが現れる点に特徴がある。


staticメンバークラス

staticメンバークラスは外部クラスやそのインスタンスとの関係が比較的薄く、
「インナークラスとしてではなく通常の別クラスとして宣言した場合」
に近い感覚で利用できる」

  • staticメンバークラスとは、_________________________________
    通常の別クラスとstaticメンバークラスの違い
    ・基本的に「外部クラス名.メンバークラス名」で利用する。
    ・外部クラスのメンバーにアクセス出来るが、staticなものに限られる。
    _________________________________________________________

・基本的に「外部クラス名.メンバークラス名」で利用する。→
Outer.Innner ic = new Outer.Inner();


staticなしメンバークラス

staticなしメンバークラス(インナークラス)は、
外部クラスから生み出される個々のインスタンスと強い結び付きを持ったクラス定義。
非staticなインナークラスは、
外部クラスのメンバの1つとして定義されているインナークラスで、
static指定のないもののこと。
メンバークラスのインスタンスは、
必ずある外部クラスのインスタンスと結び付く形で生み出される。

  • staticなしメンバークラスとは_________________________________
    ・基本的に「外部クラス名.メンバークラス名」で利用する。
    ・結び付いている外部インスタンスの非staticメンバーにもアクセス出来る。 _________________________________________________________

staticなしメンバークラスのインスタンス生成には、次に示す特殊な文法を使う。

  • staticなしメンバークラスのインスタンス化_________________________________
    ・外部クラスのインスタンス変数名.new メンバークラスコンストラクタ呼び出し
    ex)
        Outer o = new Outer();//まず外部インスタンスを生成
        Outer.Inner = o.new Inner();//oと繋がるInnerインスタンスを生成

▪️Test93.java staticメンバークラスの利用例

//▪staticメンバークラスの利用例

//外部クラス
class Outer {
    int outerField;
    static int a;

    // staticなメンバークラス
    static class Inner {
        void innerMethod() {
            // staticな外部クラスメンバのみ利用可
            a = 10;
        }
    }

    // 外部クラスの中にあるメソッド
    void outerMethod() {
        // 外部クラスからはInnerで利用可
        Inner ic = new Inner();
    }
}

// 無関係なクラス
class Test93 {
    public static void main(String[] args) {
        // 無関係なクラスからstaticなメンバークラスにアクセスするにはOuter.Innerで利用
        Outer.Inner ic = new Outer.Inner();
    }
}

インナークラス(内部クラス)

インナークラスとは
ネストされた(=入れ子になった)クラスで、static宣言されていないもの
スクリーンショット 2016-01-14 14.10.55.png
スクリーンショット 2016-01-15 11.45.22.png

▪️Test94.java 非staticメンバークラス(インナークラス)の利用例①

//*非staticメンバークラス(インナークラス)の利用例
class Outer {
    static int outerField;
    int b;

    class Inner {
        void innerMethod() {
            outerField = 10;
            b = 5;
        }
    }

    void outerMethod() {
        Inner ic = new Inner();
    }

}

class Test94 {
    public static void main(String[] args) {
        Outer o = new Outer();
        Outer.Inner in = o.new Inner();
    }
}

▪️Test95.java 非staticメンバークラス(インナークラス)の利用例②

//*非staticメンバークラス(インナークラス)の利用例
class OuterClass {
    int outerField;
    int c;

    //インナークラス
    class InnerClass {
        void method2() {
            c = 13;
        }

    }

    void method() {
        InnerClass ic = new InnerClass();
    }

    InnerClass ic3 = new InnerClass();
}

class Test95 {
    public static void main(String[] args) {
        // 全く無関係なクラスからは
        // InnerClass ic2 = new InnerClass();では
        // InnerClassのインスタンス生成できない
        OuterClass oc = new OuterClass();
        // 非staticメンバークラスのインスタンス化
        OuterClass.InnerClass oi = oc.new InnerClass();
    }
}

まとめ

staticのインナークラスはインナークラスではなく、メンバーという扱いになる

Nested Class