一个类具有另一个类的实例的JVM初始化顺序是什么

标准输出

假设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()构造是否会完成正确的构造吗?

谢谢。

斯蒂芬·C

我的意思是,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节)。

等等。

在你的例子,这意味着类将在顺序进行初始化KooSooHooFoo和正在执行的new Foo()表达式中的main方法将触发此。

如果不同类的静态初始化之间存在循环依赖关系,事情会变得有些复杂(令人讨厌),但是JLS也涵盖了这种边缘情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么可以使用具有来自另一个类的私有集访问权限的集合初始化程序?

来自分类Dev

如何将一个类的实例方法与另一个实例化?

来自分类Dev

在另一个类构造函数中初始化一个类对象

来自分类Dev

另一个类中的C ++类初始化,出现错误

来自分类Dev

将Ruby对象的实例变量作为映射传递给另一个类的初始化程序

来自分类Dev

在另一个结构中初始化一个结构的正确方法是什么?

来自分类Dev

另一个初始化静态c ++类成员

来自分类Dev

当只有一个特定类的所有实例之间共享一个类变量的副本时,为什么要“重新初始化类变量”

来自分类Dev

另一个类中的参数化对象初始化

来自分类Dev

在另一个类中初始化改造类

来自分类Dev

在另一个实例化一个类的首选方法是什么?

来自分类Dev

如何使用从另一个类获得的值刷新/重新初始化一个类?

来自分类Dev

如何通过另一个类更新/更改一个类的初始化参数?

来自分类Dev

如何将Ruby类实例变量初始化为另一个类的新实例?

来自分类Dev

在另一个类中初始化一个指针

来自分类Dev

用参数初始化另一个类构造函数中的对象

来自分类Dev

初始化变量后在另一个类中构造对象

来自分类Dev

无法初始化向量来保存使用其构造函数初始化的另一个类

来自分类Dev

用另一个类的模板参数实例化一个模板类

来自分类Dev

另一个类的c ++私有对象:初始化并使用它调用该类中的函数

来自分类Dev

另一个类中的参数化对象初始化

来自分类Dev

调用另一个类初始化程序时如何处理错误?

来自分类Dev

Java:在初始化块中初始化对象时从另一个类调用对象的方法

来自分类Dev

为什么我可以在运行时通过 ClassName.__init__(self) 初始化另一个类来扩展一个类

来自分类Dev

如何初始化包含来自另一个类的实例的列表?

来自分类Dev

在另一个类构造中初始化它时找不到类

来自分类Dev

Python:如何从一个类到另一个类获取未初始化的属性

来自分类Dev

如何从另一个类访问实例化?

来自分类Dev

如何在 C# 中使用来自另一个类的初始化实例对象?

Related 相关文章

  1. 1

    为什么可以使用具有来自另一个类的私有集访问权限的集合初始化程序?

  2. 2

    如何将一个类的实例方法与另一个实例化?

  3. 3

    在另一个类构造函数中初始化一个类对象

  4. 4

    另一个类中的C ++类初始化,出现错误

  5. 5

    将Ruby对象的实例变量作为映射传递给另一个类的初始化程序

  6. 6

    在另一个结构中初始化一个结构的正确方法是什么?

  7. 7

    另一个初始化静态c ++类成员

  8. 8

    当只有一个特定类的所有实例之间共享一个类变量的副本时,为什么要“重新初始化类变量”

  9. 9

    另一个类中的参数化对象初始化

  10. 10

    在另一个类中初始化改造类

  11. 11

    在另一个实例化一个类的首选方法是什么?

  12. 12

    如何使用从另一个类获得的值刷新/重新初始化一个类?

  13. 13

    如何通过另一个类更新/更改一个类的初始化参数?

  14. 14

    如何将Ruby类实例变量初始化为另一个类的新实例?

  15. 15

    在另一个类中初始化一个指针

  16. 16

    用参数初始化另一个类构造函数中的对象

  17. 17

    初始化变量后在另一个类中构造对象

  18. 18

    无法初始化向量来保存使用其构造函数初始化的另一个类

  19. 19

    用另一个类的模板参数实例化一个模板类

  20. 20

    另一个类的c ++私有对象:初始化并使用它调用该类中的函数

  21. 21

    另一个类中的参数化对象初始化

  22. 22

    调用另一个类初始化程序时如何处理错误?

  23. 23

    Java:在初始化块中初始化对象时从另一个类调用对象的方法

  24. 24

    为什么我可以在运行时通过 ClassName.__init__(self) 初始化另一个类来扩展一个类

  25. 25

    如何初始化包含来自另一个类的实例的列表?

  26. 26

    在另一个类构造中初始化它时找不到类

  27. 27

    Python:如何从一个类到另一个类获取未初始化的属性

  28. 28

    如何从另一个类访问实例化?

  29. 29

    如何在 C# 中使用来自另一个类的初始化实例对象?

热门标签

归档