类中的私有构造函数用法

如果有私有构造函数,JVM是否会插入对超级构造函数的调用?

我指的是私有构造函数中的super()调用。

 class Alpha { static String s=""; protected Alpha(){ s+="alpha"; } } class SubAlpha extends Alpha{ private SubAlpha(){ s+="sub"; } } class SubSubAlpha extends Alpha{ private SubSubAlpha(){ s+="subsubAlpha"; } public static void main(String[] args){ new SubSubAlpha(); System.out.print(s); } } 

在这里,我没有得到任何编译错误。 在SubSubAlpha类中有私有构造函数。 该编译器是否插入了super()调用,如果是这样, SubAlpha类中会发生什么。 即使有私人建设者。 如果没有访问,inheritance树如何继续到顶部。

是。 如果没有显式superthis构造函数调用,则私有构造函数具有隐式super()调用。 在这方面,它与其他构造者没有什么不同。 当然,为了编译,超类必须有一个从类可见的无参数构造函数。

但是,如果构造函数是private ,则无法从子类…或从类本身以外的任何其他代码调用它。

如果有私有构造函数,JVM是否会调用超级构造函数?

始终调用超级构造函数。 (你不能实例化一个类,也不能同时实例化超类。)

如果您没有自己明确地执行此操作,则无论构造函数是私有还是公共,都会为您插入隐式调用。


挑剔:它实际上不是插入它的JVM,而是Java编译器:

 public class Test { private Test() { } } 

编译成

 private Test(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return 

您没有收到编译时错误的原因是您的类层次结构不是您认为的那样。 我想你的意思是:

 class SubSubAlpha extends Alpha { 

是这样的:

 class SubSubAlpha extends SubAlpha { 

…此时您确实会遇到编译时错误。

(换句话说,是的,总是会调用超级构造函数。)

这是Java Programmer的SourceBook中的一个很好的例子。 由于构造函数在调用时打印,因此您将立即看到调用的顺序。 它来自Thinking in Java。

 //: Cartoon.java // Constructor calls during inheritance class Art { Art() { System.out.println("Art constructor"); } } class Drawing extends Art { Drawing() { System.out.println("Drawing constructor"); } } public class Cartoon extends Drawing { Cartoon() { System.out.println("Cartoon constructor"); } public static void main(String[] args) { Cartoon x = new Cartoon(); } } ///:~ 

此程序的输出显示自动调用:

艺术构造函数
绘图构造函数
卡通构造函数

Ya,你可以使用super()来使用超类中的函数和属性。 它和普通的java一样