如果有私有构造函数,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类中发生了什么。甚至还有私有构造函数。如果没有被访问,继承树如何继续到顶部。
发布于 2011-03-19 15:50:42
是。如果没有显式的super()或this构造函数调用,则私有构造函数具有隐式super调用。在这方面,它与其他构造函数没有什么不同。当然,要进行编译,超类必须有一个从类中可见的无参数构造函数。
但是,如果构造函数为private,则不能从子类中调用它...或者来自除类本身之外的任何其他代码。
发布于 2011-03-19 15:49:34
如果有私有构造函数,
会插入对超级构造函数的调用吗?
是
超级构造函数将始终被调用。(如果不同时实例化超类,则不能实例化一个类。)
如果您不自己显式地执行此操作,则将为您插入一个隐式调用,而不管构造函数是私有的还是公共的。
挑剔的是:实际上并不是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."<init>":()V
4: return发布于 2011-03-19 16:25:08
您没有收到编译时错误的原因是您的类层次结构并不是您认为的那样。我想你是这个意思:
class SubSubAlpha extends Alpha {要做到这点:
class SubSubAlpha extends SubAlpha {..。在这一点上,您确实会得到一个编译时错误。
(换句话说,是的,总是有一个对超级构造函数的调用。)
https://stackoverflow.com/questions/5360851
复制相似问题