0

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

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

书中的解释是::

在编译期间无法可靠地检测到这种循环静态初始化,因为在编译 X 时可能不会编写 Y 的代码。如果发生循环,则 X 的静态初始化程序将仅执行到调用 Y 的方法的位置。当 Y 反过来调用 X 方法时,该方法将与尚未执行的其余静态初始化程序一起运行。X 中任何未执行初始化程序的静态字段仍将具有其默认值(false、'/u0000'、零或 null,具体取决于它们的类型)。

4

1 回答 1

1

很简单:如果一个线程已经在初始化一个类X,当它因为另一个原因需要初始化类X时(例如,因为类Y使用了它的某些东西),那么它就会跳过它。所有静态变量都有其默认值。

有关正在发生的事情的准确描述,请参阅Java 语言规范,第 12.4.2 节。尤其:

如果 C 的 Class 对象指示当前线程正在对 C 进行初始化,那么这一定是对初始化的递归请求。释放LC并正常完成。

于 2012-12-20T11:41:55.767 回答