2-4埋め込みクラスのメンバークラス
メンバークラス
静的メンバークラスです.staticキーを削除すると、メンバークラスになります.
次の例では、4つの「メンバー・クラス」を定義します.
外部クラスのインスタンス関数と同様に、メンバークラスにはpublic/private/default権限があります.
1つのメンバー・クラス・インスタンスは必ず外部クラス・インスタンスに属し、メンバー・クラスは外部クラスのいずれかのインスタンス・フィールドとインスタンス関数にアクセスできます.
--制約:
静的メンバークラスは外部クラスと重複できません
メンバークラスでstaticフィールド、メソッド、クラスを定義できません.メンバークラスインスタンスは必ず外部クラスインスタンスに関連付けられるため、このstatic定義は完全に外部クラスに移動できます.
メンバークラスはインタフェースではありません.メンバークラスは外部クラスインスタンスによってインスタンス化されなければならないため、インタフェースはインスタンス化されません.
--使用時:
クラスが外部に共通インタフェースを提供するのに便利です.たとえば、次のようになります.
メンバクラスメカニズムがなければAbstractListを未知のクラスに暴露して使用するしかない.このような実現は「公共的」ではない.
静的メンバークラスです.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を未知のクラスに暴露して使用するしかない.このような実現は「公共的」ではない.