谁能解释一下显式无参数构造函数(和其他构造函数)的默认访问修饰符是什么?
发布于 2012-11-24 21:03:33
在这方面,构造函数和方法是一样的--如果你没有给出一个显式的public,private或者protected,那么构造函数就会得到默认的"package private“可见性。它可以从同一个类中调用,也可以从同一个包中的任何其他类调用,但不能从不同包中的子类调用(因此,如果一个类只有包可见的构造函数,那么任何子类都必须在同一个包中)。
私有构造函数可防止任何其他类实例化此构造函数,但您可以在调用其自己的私有构造函数的类中使用公共静态工厂方法。这是像单例这样的东西的常见模式。
发布于 2012-11-24 20:55:27
JLS 8.8.9默认构造函数
如果类不包含构造函数声明,则自动提供不带参数的默认构造函数:
如果类被声明为public,则默认构造函数被隐式地赋予访问修饰符public;
如果类被声明为protected,则默认构造函数被隐式地赋予访问修饰符protected;
如果类声明为private,则默认构造函数被隐式赋予访问修饰符private;否则,
默认构造函数具有无访问修饰符所隐含的默认访问权限。
发布于 2012-11-24 22:03:18
-当没有访问修饰符被显式定义为时,constructor
将具有类型为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();
}
}
https://stackoverflow.com/questions/13541386
复制相似问题