30

これは質問というよりはパズルです。私は次のコードを持っています:

public class PrivateBaseConstructor {
    public static class BaseClass {
        private BaseClass() {
        }

    }

    public static class DerivedClass extends BaseClass {
        public DerivedClass() {
            super(); // 1*
        }
    }
}

ここではsuper();、基本クラスのコンストラクターが。であっても、at1*の呼び出しが許可されていますprivate。クラスを同じパッケージ内の個別のクラスとして作成する場合:

BClass.java
public class BClass {
    private BClass() {

    }
}

DClass.java
public class DClass extends BClass {
    public DClass() {
        super(); // 2*
    }

基本クラスのコンストラクターが表示されないため、コンパイラーは2*でエラーを正しく出します。

両方のクラスが1つのクラス内で静的に宣言されている場合、最初のシナリオでコンパイラがエラーをスローしないのはなぜですか?

4

3 に答える 3

34

メンバーまたはコンストラクターがプライベートとして宣言されている場合、アクセスは、メンバーまたはコンストラクターの宣言を囲むトップレベルクラス(§7.6)の本体内で発生する場合にのみ許可されます。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1

于 2012-09-22T08:48:34.840 に答える
4

ネストされたクラスはお互いのメンバーを見ることができるからです。これは静的宣言とは何の関係もありません。ネストされた内部クラス(静的ではない)のみを使用したコードの次の例を参照してください。

public class PrivateBaseConstructor {
    public class BaseClass {
        private BaseClass() {}
    }

    public class DerivedClass extends BaseClass {
        public DerivedClass() {
            super(); // 1*
        }
    }

    public static void main(String[] args)
    {
       new PrivateBaseConstructor(). new DerivedClass();
    }
}

ネストされたクラスの詳細については、http://docs.oracle.com/javase/tutorial/java/javaOO/nested.htmlを参照してください。

于 2012-09-22T08:47:31.877 に答える
1

クラス内で宣言されたものはすべて、内部クラスを含むそのプライベートメンバーにアクセスできるためです。ただし、クラスでPMDを実行する場合は、コンストラクターの可視性を非プライベートに変更することをお勧めします。

于 2012-09-22T08:45:41.030 に答える