构造函数的私有范围

Eug*_*neP 0 java

鉴于此代码段,你能解释为什么它会被炒掉吗?

问题是类构造函数被标记为私有,所以它不应该阻止我们用new运算符调用它吗?

public class Alpha {
 protected Alpha() {}
}
class SubAlpha extends Alpha {
 private SubAlpha() {System.out.println("ok");}
 public static void main(String args[]) {
  new SubAlpha();
 }
}
Run Code Online (Sandbox Code Playgroud)

这一切都有效,因为静态方法是类的一部分,它可以看到所有私有字段和方法,对吧?在这个"新"初始化之外永远不会工作?

T.J*_*der 5

private你问题中唯一的构造函数是SubAlphaSubAlpha自己调用的.没有问题,类可以调用自己的私有方法.该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
    }
}
Run Code Online (Sandbox Code Playgroud)

例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()
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这是特定于构造函数的,因为范围始终是特定于成员的.如果一个类具有不同的与不同的签名和较少限制的范围的构造,然后使用它(包括子类)一类可以使用其它构造的签名.(在子类的情况下,需要显式调用super(args);.)