写在前面
动手写下代码,通过编译,执行后从结果反推理论的过程,是最好的思维理解方式。
看图说话
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
结果输出
写在后面
通过对每个技术概念的理解与动手实践,能检验对概念的理解与认知。文章中的样例代码,都是自己手把手写的且通过调试运行,贵在真实。