构造函数的私有范围

时间:2010-11-22 11:03:00

标签: 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();
 }
}

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

2 个答案:

答案 0 :(得分: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
    }
}

示例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。