私有构造函数在类中的用法

sat*_*esh 5 java

如果有私有构造函数,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);   
    }
}
Run Code Online (Sandbox Code Playgroud)

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

aio*_*obe 8

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

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

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


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

public class Test {
    private Test() {
    }
}
Run Code Online (Sandbox Code Playgroud)

编译成

private Test();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 4

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

但是,如果构造函数是private,则不能从子类调用它......或从类本身之外的任何其他代码调用它。