
Java类加载机制:类加载优先于静态语句初始化
关于Java类加载的顺序,一个常见的问题是:在执行以下代码时,是先加载类A,还是先执行静态语句f()?
class A {
public static void f() {}
}
A a = new A();
答案是:先加载类,再初始化静态语句。
类加载过程详解
立即学习“Java免费学习笔记(深入)”;
Java的类加载过程包含三个主要阶段:加载、链接和初始化。 其中,“加载”阶段排在最前。静态语句的初始化则发生在“初始化”阶段,因此在类加载之后。
九州易通科技开发的核心产品易通企业网站系统(CmsEasy3.0)是充分按照SEO最佳标准来开发,营销实用性非常强企业建站系统。灵活的静态化控制,可以自定义字段,自定义模板,自定义表单,自定义URL,交叉绑定分类,地区,专题等多元化定制大大增加了企业网站的各种需求空间。强大的模板自定义可以轻松打造出个性的栏目封面,文章列表,图片列表,下载列表,分类列表,地区列表等等。主体功能列表如下:支持生成ht
详细步骤:
-
加载: JVM首先加载类
A的字节码文件。 - 链接: 链接阶段包括验证、准备和解析三个步骤,确保类的正确性。
-
初始化: 在这个阶段,JVM才开始执行静态语句块和静态变量的赋值。
A.f()方法的代码在此时被初始化,但并不被执行,除非显式调用。 -
实例化:
A a = new A();这行代码创建A类的实例。此时,除了静态成员外,还会初始化非静态变量、非静态代码块以及构造函数。
实例化对象的初始化顺序
当实例化对象a时,初始化顺序如下:
- 父类静态变量和静态代码块(如果有父类)
- 本类静态变量和静态代码块
- 父类非静态变量和非静态代码块(如果有父类)
- 本类非静态变量和非静态代码块
- 父类构造函数(如果有父类)
- 本类构造函数
更深入的类加载机制细节,可以参考深入理解Java类加载流程 这篇文章。









