在上一讲中我们了解了 JVM一个类的加载过程 :
JVM一个类的加载过程_super码王的博客-其中,初始化阶段是我们作为程序员最关心的阶段,我们下面就来仔细剖析一下其中的缘由。
类的初始化阶段,java虚拟机才真正开始执行类中编写的java代码;
进行准备阶段时,变量已经赋过一次系统要求的初始零值,而在初始化阶段,才真正初始化类变量和其他资源;
代码演示
package com.wust.yq;
public class Hello {
//静态常量 == 准备阶段就赋予自己该有的值
public static final String staticConstantField = "静态常量";
//静态变量 == 准备阶段赋予零值(int = 0 引用 = null),初始化阶段赋予自己该有的值
public static String staticField = "静态变量";
//实例变量 == 创建对象的时候赋值
public String field = "变量";
//静态初始化块 == 初始化阶段执行
static {
System.out.println(staticConstantField);
System.out.println(staticField);
System.out.println("静态初始化块");
}
//初始化块 == 创建对象的时候执行
{
System.out.println(field);
System.out.println("初始化块");
}
//构造器 == 创建对象的时候执行
public Hello() {
System.out.println("构造器");
}
// -XX:+TraceClassLoading 监控类的加载
public static void main(String[] args) {
//这句话决定了是否初始化对象,决定了 实例变量 、初始化块 和 构造器是否执行
// new Hello();
}
}
演示结果
未创建 hello 对象:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN5ITN2MDZjRGMlVmYklDNyYzX4UTOzEDM0AzLcRDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)