这个问题在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/