java - 如果类 X 中的静态初始化程序调用 Y 中的方法,但 Y 的静态初始化程序调用 X 中的方法来设置其静态值,该怎么办?

标签 java static-initialization

这个问题在JAVA PROGRAMMING LANAGUAGE书中提出并解释了。但是我不清楚解释。

有人可以解释得更清楚吗?

书中的解释是::

在编译期间无法可靠地检测到这种循环静态初始化,因为 编译 X 时可能不会编写 Y 的代码。如果发生循环,X 的静态初始化器将被 仅执行到调用 Y 的方法的点。当 Y 依次调用 X 方法时, 方法运行时,其余静态初始值设定项尚未执行。 X 中没有的任何静态字段 它们执行的初始化程序仍将具有默认值(false、'/u0000'、零或 null,具体取决于 根据他们的类型)。

最佳答案

很简单:如果一个线程已经在初始化类 X,但由于其他原因需要初始化类 X(例如,因为类 Y 使用其中的某些内容),那么它会跳过它。所有静态变量都有默认值。

有关所发生情况的准确描述,请参阅 Java Language Specification, section 12.4.2 。特别是:

If the Class object for C indicates that initialization is in progress for C by the current thread, then this must be a recursive request for initialization. Release LC and complete normally.

关于java - 如果类 X 中的静态初始化程序调用 Y 中的方法,但 Y 的静态初始化程序调用 X 中的方法来设置其静态值,该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971407/

相关文章:

c++ - 匿名命名空间中的静态结构

c++ - 确保最多设置一次静态成员 (C++)

Java:使用静态初始化 block 将类注册到全局静态注册表

java - 如何创建包含 3 个条件的 if 语句? ( java )

java - onSave()(对于使用 Hibernate/Spring Data Repositories 保存的任何实体)

java - 在运行时确定 String 中 Java 表达式的返回类型

java - 我如何打破这个循环?

java - 从 Java 执行时 shell 命令执行失败

java - 如何在配置中将系统属性注入(inject)到静态bean中?

c++ - "construct on first use"习语在任何情况下都会失败吗?