Java构造函数的默认访问修饰符

nfc*_*-uk 24 java constructor access-modifiers

任何人都可以解释默认访问修饰符对于显式无参数构造函数(以及其他构造函数)的作用吗?

Ian*_*rts 49

构造函数与此方面的方法相同 - 如果您不提供显式public,private或protected,则构造函数将获得默认的"package private"可见性.它可以从同一个类中调用,也可以从同一个包中的任何其他类调用,但不能从不同包中的子类调用(因此,如果一个类只有包可见的构造函数,那么任何子类必须在同一个包中).

私有构造函数阻止任何其他类实例化此类,但您可以在类中调用其自己的私有构造函数的公共静态工厂方法.这是单身人士之类的常见模式.


Sta*_*wed 33

JLS 8.8.9默认构造函数

如果类不包含构造函数声明,则会自动提供不带参数的默认构造函数:

如果该类被声明为public,则默认构造函数被隐式赋予访问修饰符public;
如果该类被声明为protected,则默认构造函数被隐式赋予访问修饰符protected;
如果该类被声明为private,则默认构造函数被隐式赋予访问修饰符private; 否则,
默认构造函数具有无访问修饰符隐含的默认访问权限.

  • OP特别询问"一个明确的无参数构造函数",而不是默认构造函数. (2认同)

Kum*_*tra 5

-没有明确定义访问修饰符时,A constructor 将具有类型的访问控制。所以这个构造函数将有一个Package Level Access。在该包中定义为具有此默认构造函数的类的类将能够访问它,并且扩展包含默认构造函数的此类的类将能够通过继承访问它。default

-如果构造制成private,那么只有这个类中的代码可以访问此。

单例示例

public class Test {

  private static Test uniqueInstance = new Test();

  private Test(){}

  public static Test getInstance(){

    return uniqueInstance;

 }


}
Run Code Online (Sandbox Code Playgroud)

-即使类中的非静态 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();

    }

}
Run Code Online (Sandbox Code Playgroud)