2-4埋め込みクラスのメンバークラス


メンバークラス
静的メンバークラスです.staticキーを削除すると、メンバークラスになります.
次の例では、4つの「メンバー・クラス」を定義します.
public class Outer {
    private int data;

    // 1/4 - public 
    public class Inner1 {
        private int data;
        private int data1;
        public Inner1() {
            data1 = 1; data = 1;
            Outer.this.data = 1;	//  “ ”
        }
    }

    // 2/4 - default 
    class Inner2 {
        //static int j = 1;	//Compile error: can not define static filed, method, class in member class
        static final int CONSTANT = 1;	//OK, "static final" is allowed
    }

    // 3/4 - private 
    private class Inner3 {
		// 4/4 -  
        public class Inner4 { }
    }

	// --- NOTICE ---
    // Inner5 is not a member class but a static member class
    interface Inner5 { }

    private static void staticMethod() {
        //can not create a member class instance directly in outer class' static method
        //Inner1 inner1 = new Inner1();
    }

    private void instanceMethod() {
        //can create a member class instance in outer class' instance method
        Inner1 inner1 = new Inner1();
    }
}

class Test {
    public Test() {
        //Outer.Inner2 inner2 = new Outer.Inner2(); //  

        Outer outer = new Outer();
        Outer.Inner1 inner1 = outer.new Inner1();
    }
}
--機能:
外部クラスのインスタンス関数と同様に、メンバークラスにはpublic/private/default権限があります.
1つのメンバー・クラス・インスタンスは必ず外部クラス・インスタンスに属し、メンバー・クラスは外部クラスのいずれかのインスタンス・フィールドとインスタンス関数にアクセスできます.
--制約:
静的メンバークラスは外部クラスと重複できません
メンバークラスでstaticフィールド、メソッド、クラスを定義できません.メンバークラスインスタンスは必ず外部クラスインスタンスに関連付けられるため、このstatic定義は完全に外部クラスに移動できます.
メンバークラスはインタフェースではありません.メンバークラスは外部クラスインスタンスによってインスタンス化されなければならないため、インタフェースはインスタンス化されません.
--使用時:
クラスが外部に共通インタフェースを提供するのに便利です.たとえば、次のようになります.
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

	//  
	private class Itr implements Iterator<E> {
		...
	}

	//  , factory 
	public Iterator<E> iterator() {
		return new Itr();
	}
}
AbstractList内のItrがAbstractList内の任意のフィールドおよびメソッドにアクセスできるように定義されているので、AbstractListがより多くのインタフェースを外部に露出することなく、Iteratorを容易に実現することができる.
メンバクラスメカニズムがなければAbstractListを未知のクラスに暴露して使用するしかない.このような実現は「公共的」ではない.