谁能解释显式无参数构造函数(和其他构造函数)的默认访问修饰符是什么?
4 回答
在这方面,构造函数与方法相同——如果你没有给出明确的 public、private 或 protected,那么构造函数将获得默认的“包私有”可见性。它可以从同一个类或同一个包中的任何其他类调用,但不能从不同包中的子类调用(因此,如果一个类只有包可见的构造函数,那么任何子类都必须在同一个包中)。
私有构造函数可防止任何其他类实例化这个类,但您可以在类中拥有一个公共静态工厂方法,该方法调用其自己的私有构造函数。这是单例之类的常见模式。
JLS 8.8.9 默认构造函数
如果一个类不包含构造函数声明,则自动提供一个不带参数的默认构造函数:
如果该类被声明为public,则默认构造函数被隐式地赋予访问修饰符public;
如果该类被声明为受保护,则默认构造函数被隐式赋予访问修饰符保护;
如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符私有;否则,
默认构造函数具有没有访问修饰符隐含的默认访问权限。
-当没有明确定义访问修饰符时, Aconstructor
将具有类型的访问控制。所以这个构造函数将有一个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给出了答案:
在枚举声明中,没有访问修饰符的构造函数声明是private。
(枚举构造函数始终是私有的,以防止其他类实例化更多枚举常量。)