假设JVM首次加载了以下Foo
类,并且该类刚刚传递给了Linking步骤(在解析过程中)。
public static void main(...) {
new Foo();
}
public class Foo {
private static int a = 4;
private static Hoo hoo = new Hoo();
Foo (){
Log.i("Test", ">> Test foo's created!");
}
}
public class Hoo {
private static int b = 4;
private static Soo soo = new Soo();
Hoo (){
Log.i("Test", ">> Test hoo's created!");
}
}
public class Soo {
private static int b = 4;
private static Koo soo = new Koo();
Soo (){
Log.i("Test", ">> Test soo's created!");
}
}
...
现在我的问题是这个。我们知道在完成子类构造之前,系统会递归地调用基类/超级类构造函数。上面的代码中是否存在类似的逻辑?我的意思是JVMFoo
在完成Hoo()
和Soo()
构造后是否会完成正确的构造吗?
谢谢。
我的意思是,JVM在完成Hoo()和Soo()构造之后是否会立即完成Foo的构造?
基本上...是的。
根据JLS 12.4.1:
类或接口类型T将在以下任何一种首次出现之前立即初始化:
T是一个类,并创建T的实例。
调用由T声明的静态方法。
分配由T声明的静态字段。
使用由T声明的静态字段,并且该字段不是常量变量(第4.12.4节)。
T是顶级类(第7.6节),并执行词法嵌套在T中的断言(第14.10节)(第8.1.3节)。
等等。
在你的例子,这意味着类将在顺序进行初始化Koo
,Soo
,Hoo
,Foo
和正在执行的new Foo()
表达式中的main
方法将触发此。
如果不同类的静态初始化之间存在循环依赖关系,事情会变得有些复杂(令人讨厌),但是JLS也涵盖了这种边缘情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句