动手写代码:java虚拟机类加载器的静态变量初始化的解析过程

写在前面

动手写下代码,通过编译,执行后从结果反推理论的过程,是最好的思维理解方式。

看图说话

java虚拟机的类加载过程

在这里插入图片描述
我们主要理解以下两个个过程:

  • 准备:为类的变量分配内存,并将其初始化为默认值。
  • 初始化:使用new关键字实例化对象的时候会触发初始化过程:为静态变量赋值

代码解析

/**
 * JVM--类的加载过程
 *
 * @author zhuhuix
 * @date 2020-05-15
 */
public class ClassLoader {
    public static ClassLoader instance = new ClassLoader();
    private int a;
    private static int b = 1;

    public ClassLoader() {
        a++;
        System.out.println("a:"+a+"," +"b:"+b++);
    }

    public static void main(String[] args) {
        ClassLoader c1 = new ClassLoader();
        ClassLoader c2 = new ClassLoader();

        System.out.println(instance.hashCode());
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
    }

}

-准备:instance对象初化始值为null,a初始化值为0,b初始化值为0
在这里插入图片描述

  • 初始化:以下三个new关键字实例化对象时都会触发初始化过程
    在这里插入图片描述
instance对象的初始化
  • instance静态对象在准备阶段内存分配初始化值为null
  • 通过new关键字实例化instance对象,并触发构造方法
  • 由于这时候静态变量b还没有完成初始化,即b的值仍然为初始化值0,所以构造方法中输出的b值为初始化值0
  • 构造方法执行完成后,初始化过程才能对静态变量完成赋值,即b=1
    在这里插入图片描述
c1,c2对象的构造
  • 通过new关键字实例化c1对象,并触发构造方法
  • 由于这时候静态变量b已完成初始化,即b的值已赋值为1,所以构造方法中输出的b值为1
  • c1对象构造方法执行完成后,静态变量b++变为了b=2
  • 再通过new关键字实例化c2对象,并触发构造方法
  • 由于这时候静态变量b已变为2,所以构造方法中输出的b值为2
  • c2对象构造方法执行完成后,静态变量b++变为了3
    在这里插入图片描述
结果输出

在这里插入图片描述

写在后面

通过对每个技术概念的理解与动手实践,能检验对概念的理解与认知。文章中的样例代码,都是自己手把手写的且通过调试运行,贵在真实。

原创文章 57 获赞 8 访问量 5064

猜你喜欢

转载自blog.csdn.net/jpgzhu/article/details/106158033