3

クラスがプライベートの場合、コンストラクターもプライベートにする必要がありますか?

4

5 に答える 5

4

いいえ、そのような制限はありません。JLS §8.8.3を参照してください。コンストラクタ修飾子

ネストされたクラスのみを宣言できることに注意してprivateください。JLS は、そのようなクラスのコンストラクターが有効なアクセス修飾子を使用することを許可します。

于 2013-03-13T09:16:24.480 に答える
3

ネストされたクラスを意味する場合、答えはノーです。内部クラスを非公開にすると、外部クラス内でのみ使用できるようになります。

編集:アクセス修飾子に関係なく、外部クラスは内部クラスの内部に完全にアクセスできるようです。これは私の上記の推論を無効にしますが、とにかく、そのような制限はありません. しかし不思議なことに、内部クラスが である場合、アクセス修飾子に関係なくprivate、そのコンストラクターは基本的 privateに であることがわかります。他の誰もそれを呼び出すことができないからです。

于 2013-03-13T09:16:56.287 に答える
0

プライベートである必要はありません。しかし、それはできます。例:

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

于 2013-03-13T09:34:32.177 に答える