【问题标题】:Cyclic class initialization循环类初始化
【发布时间】:2017-11-13 00:10:18
【问题描述】:

在java中,一个类是在创建类的对象之前加载的。在整个程序期间,一个类只加载一次。 发生这种情况时,将初始化静态并执行静态块。 这可以是循环的;在一个类完全初始化之前,我在类本​​身中创建了一个类的对象。 例如:

public class MyTestClass{

public static MyTestClass myTest= new MyTestClass();

}  


public class Beginner{

public static void main(String[] args){
System.out.println(MyTestClass.myTest==null);
}
}

当我第一次在 main() 中调用 MyTestClass.myTest 时; MyTestClass 将处于加载过程中,我尝试在加载时创建 MyTestClass 的对象;那不应该创建一个循环类加载,这可以是无限的吗? 这在 java 中是如何处理的?

【问题讨论】:

  • 该代码无法编译。请在您的问题中发布真实代码。
  • 你的意思是public class Beginner {而不是public void Beginner {
  • 我认为他是这个意思:-)

标签: java class static initialization loading


【解决方案1】:

事件的顺序是这样的:

  1. 类已加载并验证,所有静态成员设置为 null 或 0
  2. 类的静态初始化器和块被执行(按词法顺序)
  3. 需要该类的代码继续进行

在你的例子中初始化器的执行包括

public static MyTestClass myTest= new MyTestClass();

这意味着main 中的代码将看到不为空的MyTestClass.myTest

您会看到MyTestClass.myTest 为空的唯一一次是在静态初始化程序中创建的MyTestClass 实例的构造函数中。

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 2011-04-02
    • 2020-12-17
    • 2016-05-29
    相关资源
    最近更新 更多