有人可以解释显式无参数构造函数(和其他构造函数)的默认访问修饰符是什么?
答案 0 :(得分:46)
构造函数与此方面的方法相同 - 如果您不提供显式public,private或protected,则构造函数将获得默认的“package private”可见性。它可以在同一个类中或从同一个包中的任何其他类调用,但不能从另一个包中的子类调用(因此,如果一个类只有包可见的构造函数,那么任何子类必须在同一个包中)。 / p>
私有构造函数阻止任何其他类实例化此类,但您可以在类中调用自己的私有构造函数的公共静态工厂方法。这是像单身人士这样的常见模式。
答案 1 :(得分:28)
JLS 8.8.9默认构造函数
如果某个类不包含构造函数声明,则会自动提供不带参数的默认构造函数:
如果该类被声明为public,则默认构造函数被隐式赋予访问修饰符public;
如果该类被声明为protected,则默认构造函数被隐式赋予访问修饰符protected;
如果该类被声明为private,则默认构造函数被隐式赋予访问修饰符private;否则,
默认构造函数具有默认访问权限隐含的默认访问权限。
答案 2 :(得分:4)
- 当没有访问修饰符时,constructor
将具有default
类型的访问控制定义明确。因此,此构造函数将具有包级别访问。使用此默认构造函数在该包中定义的类将能够访问它,并且扩展包含默认构造函数的类的类将能够通过继承访问它。
- 如果构造函数是private
,那么只有该类中的代码才能访问此内容。
单例示例
public class Test {
private static Test uniqueInstance = new Test();
private Test(){}
public static Test getInstance(){
return uniqueInstance;
}
}
- 即使在课程中非静态 inner classes
,也可以访问其私人会员,反之亦然。 < / p>
<强>例如强>
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();
}
}
答案 3 :(得分:1)
根据您是为常规类还是枚举编写构造函数,它会有所不同:
对于课程,答案由JLS §6.6.1提供:
声明没有访问修饰符的类成员或构造函数隐式具有包访问权限。
对于枚举,答案由JLS §8.9.2提供:
在枚举声明中,没有访问修饰符的构造函数声明是私有。
(Enum构造函数总是私有的,以防止其他类实例化更多的枚举常量。)