Pra*_*mar 65 java constructor initialization
任何人都可以解释以下程序的输出吗?我认为构造函数在实例变量之前被初始化.所以我期待输出为"XZYY".
class X {
Y b = new Y();
X() {
System.out.print("X");
}
}
class Y {
Y() {
System.out.print("Y");
}
}
public class Z extends X {
Y y = new Y();
Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
Run Code Online (Sandbox Code Playgroud)
use*_*421 95
正确的初始化顺序是:
请参阅Java虚拟机规范的第2.17.5-6节.
Aru*_*hny 57
如果你看一下类文件的反编译版本
class X {
Y b;
X() {
b = new Y();
System.out.print("X");
}
}
class Y {
Y() {
System.out.print("Y");
}
}
public class Z extends X {
Y y;
Z() {
y = new Y();
System.out.print("Z");
}
public static void main(String args[]) {
new Z();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以发现实例变量y在构造函数中移动,因此执行顺序如下所示
ZXX构造函数new Y().new Y()Y使用构造函数语句初始化所有实例变量.
当您调用构造函数时,实例变量初始值设定项在构造函数主体之前运行。您认为以下程序的输出是什么?
public class Tester {
private Tester internalInstance = new Tester();
public Tester() throws Exception {
throw new Exception("Boom");
}
public static void main(String[] args) {
try {
Tester b = new Tester();
System.out.println("Eye-Opener!");
} catch (Exception ex) {
System.out.println("Exception catched");
}
}
}
Run Code Online (Sandbox Code Playgroud)
main 方法调用 Tester 构造函数,该构造函数抛出异常。您可能期望 catch 子句捕获此异常并打印Exception catched。但是,如果您尝试运行它,您会发现它没有执行任何此类操作,并且会抛出一个StackOverflowError.