V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Newyorkcity
V2EX  ›  问与答

请问 Java 中编译和类加载是互相交织的还是有严格先编译后类加载的顺序的?

  •  
  •   Newyorkcity · 2020-03-20 13:17:57 +08:00 · 484 次点击
    这是一个创建于 1999 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在《深入理解 JVM 虚拟机(第二版)》的第七章有这么一段话

    遇到newgetstaticputstaticinvokestatic这 4 条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这 4 条指令的最常见的 Java 代码场景是:使用 new 关键字实例化对象的时候、读取或设置一个类的静态字段**(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)**的时候,以及调用一个类的静态方法的时候。

    其中 『被 final 修饰、已在编译期把结果放入常量池的静态字段除外』让我觉得有些困惑。

    之后 7.3.5 初始化阶段 又提到:

    接口中不能使用静态语句块,但仍然有变量初始化的赋值操作。因此接口与类一样都会生成<clinit>()方法。

    可是接口中变量初始化,必然是public static final的,而final变量的处理是编译期的工作,怎么又让类加载器的初始化阶段有所参与呢。。所以如何理解编译和编译期,类加载三者的关系啊?

    谢谢

    目前尚无回复
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2450 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:55 · PVG 23:55 · LAX 08:55 · JFK 11:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.