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

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

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

私有构造函数阻止任何其他类实例化此类,但您可以在类中使用一个公共静态工厂方法来调用它自己的私有构造函数。 这是像单身人士这样的事情的常见模式。

JLS 8.8.9默认构造函数

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

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

没有 显式定义access-modifier时, constructor将具有default类型的访问控制 。 所以这个构造函数将具有包级访问权限 。 在该包中定义的类与具有此默认构造函数的类的类将能够访问它,并且扩展包含默认构造函数的类的类将能够通过inheritance访问它。

如果构造函数private ,那么只有该类中代码才能访问它。

单身人士的例子

 public class Test { private static Test uniqueInstance = new Test(); private Test(){} public static Test getInstance(){ return uniqueInstance; } } 

即使是inner classes中的非静态 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给出:

    在枚举声明中,没有访问修饰符的构造函数声明是私有的

    (枚举构造函数总是私有的,以防止其他类实例化更多的枚举常量。)