鉴于此代码段,你能解释一下为什么会这样吗?
问题是类构造函数被标记为私有,所以不应该阻止我们用new运算符调用它吗?
public class Alpha {
protected Alpha() {}
}
class SubAlpha extends Alpha {
private SubAlpha() {System.out.println("ok");}
public static void main(String args[]) {
new SubAlpha();
}
}
这一切都有效,因为静态方法是类的一部分,它可以看到所有私有字段和方法,对吧?在这个“新”初始化之外永远不会工作?
答案 0 :(得分:5)
您问题中唯一的 private
构造函数是SubAlpha
,SubAlpha
本身正在调用。没有问题,类可以调用自己的私有方法。 Alpha
构造函数为protected
,因此SubAlpha
可以访问它。
修改:重新编辑:是的,确切地说。 单独的类(无论是否为子类)无法访问SubAlpha
的私有构造函数,无法成功构造new SubAlpha()
。
示例1:
public class Beta
{
public static final void main(String[] args)
{
new SubAlpha();
// ^--- Fails with a "SubAlpha() has private access in SubAlpha"
// compilation error
}
}
示例2:
public class SubSubAlpha extends SubAlpha
{
private subsubAlpha()
{
// ^== Fails with a "SubAlpha() has private access in SubAlpha"
// compilation error because of the implicit call to super()
}
}
当然,这是特定于构造函数的,因为范围始终是特定于成员的。如果一个类具有不同的构造函数,并且具有不同的签名和较少限制的作用域,则使用它的类(包括子类)可以使用该其他构造函数签名。 (在子类的情况下,需要显式调用super(args);
。)
答案 1 :(得分:1)
代码工作,因为main方法也在同一个类中。您可能无法从其他类初始化SubAplha。