web-dev-qa-db-ja.com

Javaコンストラクターのデフォルトのアクセス修飾子

explicit no-arg constructor(および他のコンストラクター)のデフォルトのアクセス修飾子が何であるかを説明できますか?

24
nfc-uk

この点では、コンストラクターはメソッドと同じです。明示的なpublic、private、またはprotectedを指定しない場合、コンストラクターはデフォルトの「パッケージプライベート」可視性を取得します。同じクラス内または同じパッケージ内の他のクラスから呼び出すことができますが、異なるパッケージ内のサブクラスからは呼び出せません(したがって、クラスにパッケージ可視のコンストラクターしかない場合、サブクラスは同じパッケージ内になければなりません)。

プライベートコンストラクターはotherクラスがこのインスタンスをインスタンス化することを防ぎますが、独自のプライベートコンストラクターを呼び出すクラス内にパブリックな静的ファクトリーメソッドを持つことができます。これは、シングルトンなどの一般的なパターンです。

49
Ian Roberts

JLS 8.8.9デフォルトコンストラクター

クラスにコンストラクター宣言が含まれていない場合、パラメーターを受け取らないデフォルトのコンストラクターが自動的に提供されます。

クラスがパブリックと宣言されている場合、デフォルトのコンストラクタには暗黙的にアクセス修飾子publicが与えられます。
クラスが保護されていると宣言されている場合、デフォルトのコンストラクタには暗黙的にアクセス修飾子protectedが与えられます。
クラスがprivateとして宣言されている場合、デフォルトのコンストラクターに暗黙的にアクセス修飾子privateが与えられます。さもないと、
デフォルトのコンストラクターには、アクセス修飾子なしによって暗黙のデフォルトアクセスが設定されています。

31
StackOverflowed

-constructorは、no access-modifierが定義されている場合、タイプdefaultの-​​access-controlを持ちます。 明示的に。したがって、このコンストラクタにはPackage Level Accessがあります。このデフォルトコンストラクターを持つクラスのクラスとしてそのパッケージ内で定義されているクラスはそれにアクセスできます。また、デフォルトコンストラクターを含むこのクラスを拡張するクラスは、継承を介してアクセスできます。

-constructorprivateにすると、そのクラス内のコードのみがこれにアクセスできます。

シングルトンの例

public class Test {

  private static Test uniqueInstance = new Test();

  private Test(){}

  public static Test getInstance(){

    return uniqueInstance;

 }


}

-偶数非静的inner classesクラス内のプライベートメンバーへのアクセス、およびその逆

例:

public class T {


    private T(){

        System.out.println("Hello");
    }

    class TT{

        public TT(){

            new T();
        }
    }

    public static void main(String[] args){

        T t = new T();
        T.TT i = t.new TT();

    }

}
4

通常のクラスのコンストラクターを作成するか、enumを作成するかによって異なります。

  • クラスの場合、答えは JLS§6.6.1

    アクセス修飾子なしで宣言されたクラスメンバまたはコンストラクタは、暗黙的にpackageアクセスを持ちます。

  • 列挙型の場合、答えは JLS§8.9.2 で与えられます。

    列挙型宣言では、アクセス修飾子のないコンストラクター宣言はprivateです。

    (enumコンストラクターは、他のクラスがさらに多くのenum定数をインスタンス化するのを防ぐために常にプライベートです。)

2
Boann