Java中的类加载时间

Rol*_*all 5 java static

您好stackoverflow成员,这是一个与"类加载时间"的实际含义相关的小问题.

例如,以下代码:

public class Sequence {
    Sequence() {
        System.out.print("c ");
    }
    {
        System.out.print("y ");
    }
    public static void main(String[] args) {
        System.out.println("Indeed");
        new Sequence().go();
    }
    void go() {
        System.out.print("g ");
    }
    static { System.out.println("x "); }
} 
Run Code Online (Sandbox Code Playgroud)

它会打印出第一个"x",它是静态的,因此静态初始化块总是在"类加载时"加载.我明白了,但你确切知道这个加载时间到了吗?我认为当第一个类通过创建第一个对象在main方法中被调用时,但是在这种情况下,结果应该通过首先打印出"Indeed"而不同.任何人都可以帮我澄清这个疑问吗?我已经检查了其他帖子一般性地谈论这个论点,但我认为更清楚(至少对我来说)在确切的时候,在上面报告的代码中,"类加载时间"发生了.

提前致谢.

jlo*_*rdo 4

你的问题的答案在JLS章节12.4.1当初始化发生时

\n\n
\n

类或接口类型T将在第一次出现以下任一情况之前立即初始化:\n

\n\n
    \n
  • TT是一个类并创建了一个实例。
  • \n
  • TT是一个类,并且调用由声明的静态方法。
  • \n
  • 由 声明的静态字段T被赋值。
  • \n
  • 使用由 声明的静态字段T,并且该字段不是常量变量 (\xc2\xa74.12.4)。
  • \n
  • T是顶级类 (\xc2\xa77.6),并且T执行词法嵌套在 (\xc2\xa78.1.3) 中的断言语句 (\xc2\xa714.10)。
  • \n
\n
\n\n

我建议您开始阅读 JLS 第 12.4 章上面的几行内容。类和接口的初始化

\n\n

从第 12 章执行开始,它准确地描述了何时需要加载类。加载后将进行初始化。

\n