登录
首页 >  文章 >  java教程

Java类加载:静态代码块VS类初始化,到底谁先来?

时间:2025-03-08 09:01:12 464浏览 收藏

本文探讨Java类加载机制中静态语句和类加载的执行顺序。 许多开发者疑惑在实例化对象前,是先加载类还是先执行静态语句。 答案是:Java虚拟机(JVM)会优先加载类A的字节码文件,完成加载、链接等步骤后,才会在初始化阶段执行静态语句`f()`。 文章详细解释了类加载的三个阶段(加载、链接、初始化),并阐述了静态语句在初始化阶段才被初始化(并非立即执行),以及实例化对象时的初始化顺序,帮助读者深入理解Java类加载的机制。

Java类加载:静态语句和类加载哪个先发生?

Java类加载机制:类加载优先于静态语句初始化

关于Java类加载的顺序,一个常见的问题是:在执行以下代码时,是先加载类A,还是先执行静态语句f()

class A {
    public static void f() {}
}
A a = new A();

答案是:先加载类,再初始化静态语句

类加载过程详解

Java的类加载过程包含三个主要阶段:加载、链接和初始化。 其中,“加载”阶段排在最前。静态语句的初始化则发生在“初始化”阶段,因此在类加载之后。

详细步骤:

  1. 加载: JVM首先加载类A的字节码文件。
  2. 链接: 链接阶段包括验证、准备和解析三个步骤,确保类的正确性。
  3. 初始化: 在这个阶段,JVM才开始执行静态语句块和静态变量的赋值。A.f()方法的代码在此时被初始化,但并不被执行,除非显式调用。
  4. 实例化: A a = new A(); 这行代码创建A类的实例。此时,除了静态成员外,还会初始化非静态变量、非静态代码块以及构造函数。

实例化对象的初始化顺序

当实例化对象a时,初始化顺序如下:

  1. 父类静态变量和静态代码块(如果有父类)
  2. 本类静态变量和静态代码块
  3. 父类非静态变量和非静态代码块(如果有父类)
  4. 本类非静态变量和非静态代码块
  5. 父类构造函数(如果有父类)
  6. 本类构造函数

更深入的类加载机制细节,可以参考深入理解Java类加载流程 这篇文章。

终于介绍完啦!小伙伴们,这篇关于《Java类加载:静态代码块VS类初始化,到底谁先来?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>