[英]Creating new object with constructor
以下代码在编译和运行时给出的输出为“ alpha subsub”。 SubSubAlpha();
构造函数应将“ subsub”添加到变量s
,这应该是输出。
输出为何是“ alpha subsub”?
class Alpha {
static String s = " ";
protected Alpha() {
s += "alpha ";
}
}
public class SubSubAlpha extends Alpha {
private SubSubAlpha() {
s += "subsub ";
}
public static void main(String[] args) {
new SubSubAlpha();
System.out.println(s);
// This prints as " alpha subsub".
//Shouldn't this one be printed as " subsub"
//Who made the call to Alpha(); ?
}
}
这是因为在创建对象时,将调用parent的构造函数,并将其转到Object类。 您的Alpha内部扩展了Object类。 因此,首先调用SubSubAlpha构造函数,该构造函数调用Alpha构造函数,而Alpha构造函数又调用Object构造函数,执行过程从Object到Alpha,最后是SubSubAlpha
有关信息
构造函数调用层次结构是先调用parent的构造函数,然后再调用child的构造函数。 但是,如果您调用方法,则会在子类中对其进行搜索。 如果在子类中未找到,则在父类中搜索该方法。
参考
构造函数调用的顺序
当调用子类的构造函数时,第一条指令是对超类构造函数的调用。
因此,当您创建SubSubAlpha
对象时, Alpha
构造函数将alpha添加到s
属性,然后SubSubAlpha
构造将添加subsub
让我稍微重写一下您的构造函数, 结果字节码没有变化 :
private SubSubAlpha() { super(); s += "subsub "; }
现在应该立即清除执行的内容和执行顺序。
如果存在类的层次结构,则子类的构造函数(在这种情况下为SubSubAlpha
)始终(首先)调用超类的构造函数(在本例中为Alpha
。
所以实际上是:
private SubSubAlpha() {
super();
s += "subsub ";
}
因此,这使得:
s += "alpha ";
s += "subsub ";
使字符串“ alpha subsub”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.