クラスがプライベートの場合、コンストラクターもプライベートにする必要がありますか?
5 に答える
いいえ、そのような制限はありません。JLS §8.8.3を参照してください。コンストラクタ修飾子。
ネストされたクラスのみを宣言できることに注意してprivate
ください。JLS は、そのようなクラスのコンストラクターが有効なアクセス修飾子を使用することを許可します。
ネストされたクラスを意味する場合、答えはノーです。内部クラスを非公開にすると、外部クラス内でのみ使用できるようになります。
編集:アクセス修飾子に関係なく、外部クラスは内部クラスの内部に完全にアクセスできるようです。これは私の上記の推論を無効にしますが、とにかく、そのような制限はありません. しかし不思議なことに、内部クラスが である場合、アクセス修飾子に関係なくprivate
、そのコンストラクターは基本的 private
に であることがわかります。他の誰もそれを呼び出すことができないからです。
プライベートである必要はありません。しかし、それはできます。例:
public class Outer {
// inner class with private constructor
private class Inner {
private Inner() {
super();
}
}
// this works even though the constructor is private.
// We are in the scope of an instance of Outer
Inner i = new Inner();
// let's try from a static method
// we are not in the scope of an instance of Outer
public static void main(String[] args) {
// this will NOT work, "need to have Inner instance"
Inner inner1 = new Inner();
// this WILL work
Inner inner2 = new Outer().new Inner();
}
}
// scope of another class
class Other {
// this will NOT work, "Inner not known"
Inner inner = new Outer().new Inner();
}
プライベート内部クラスでprivate
またはコンストラクターを使用しても違いはありません。public
その理由は、内部クラスのインスタンスが外部クラスのインスタンスの一部であるためです。この写真はそれをすべて言います:
内部クラスについて話していることに注意してください。ネストされたクラスが であった場合static
、正式な用語はstatic ネストされたクラスであり、内部クラスとは異なります。public static ネストされたクラスは、呼び出すだけで外部クラス インスタンスなしでアクセスできますnew Outer.Inner()
。内部クラスとネストされたクラスの詳細については、こちらを参照してください。http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html