明示的な引数なしのコンストラクター(およびその他のコンストラクター)のデフォルトのアクセス修飾子が何であるかを誰かが説明できますか?
4 に答える
この点では、コンストラクターはメソッドと同じです。明示的なパブリック、プライベート、またはプロテクトを指定しない場合、コンストラクターはデフォルトの「パッケージ プライベート」可視性を取得します。同じクラス内または同じパッケージ内の他のクラスから呼び出すことができますが、別のパッケージ内のサブクラスから呼び出すことはできません (したがって、クラスにパッケージ可視コンストラクターしかない場合は、すべてのサブクラスが同じパッケージ内にある必要があります)。
プライベート コンストラクターは、他のクラスがこのクラスをインスタンス化するのを防ぎますが、独自のプライベート コンストラクターを呼び出すクラス内にパブリック静的ファクトリ メソッドを持つことができます。これは、シングルトンなどの一般的なパターンです。
JLS 8.8.9 デフォルト コンストラクタ
クラスにコンストラクター宣言が含まれていない場合、パラメーターを取らないデフォルトのコンストラクターが自動的に提供されます。
クラスが public と宣言されている場合、デフォルトのコンストラクターには暗黙的にアクセス修飾子 public が与えられます。
クラスが保護されていると宣言されている場合、デフォルトのコンストラクターには暗黙的にアクセス修飾子 protected が与えられます。
クラスが private と宣言されている場合、デフォルトのコンストラクターにはアクセス修飾子 private が暗黙的に与えられます。それ以外の場合、
既定のコンストラクターには、アクセス修飾子がないことによって暗黙的に示される既定のアクセスがあります。
-アクセス修飾子が明示的に定義されていない場合、 Aはtypeのアクセス制御constructor
を持ちます。したがって、このコンストラクターにはPackage Level Accessがあります。そのパッケージ内で、このデフォルト コンストラクターを持つクラスとして定義されているクラスは、それにアクセスできます。また、デフォルト コンストラクターを含むこのクラスを拡張するクラスも、継承を介してアクセスできます。default
-コンストラクターが作成されている場合、そのクラス内のコードprivate
のみがこれにアクセスできます。
シングルトンの例
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();
}
}
通常のクラスまたは列挙型のどちらのコンストラクターを作成しているかによって異なります。
クラスの場合、答えはJLS §6.6.1によって与えられます。
アクセス修飾子なしで宣言されたクラス メンバーまたはコンストラクターは、暗黙的にパッケージアクセスを持ちます。
列挙型の場合、答えはJLS §8.9.2によって与えられます。
enum 宣言では、アクセス修飾子のないコンストラクタ宣言はprivateです。
(列挙型コンストラクターは、他のクラスがより多くの列挙型定数をインスタンス化するのを防ぐために、常にプライベートです。)