简单讲讲类的加载机制
理论
首先得说类的加载机制。从java文件从到内存里面经历了几个过程。
-
加载
Java文件首先编译成class文件(字节码文件),通过io的方式读入文件。这个加载过程需要程序第一次使用的时候才会加载。如main方法,new对象等等。并且同时会生成一个Java.lang.Class的对象,作为方法区这个类的各种数据访问入口。
-
验证
检验字节码文件是否合法。
-
准备
给静态变量设置默认值,静态常量直接进行赋值。
-
解析
将符号引用改为直接引用。如静态方法main会直接替换成内存所在的指针或者句柄等。这就是静态链接。动态链接是在程序的运行过程中将符号引用才替换成直接引用。
-
初始化
根据程序员通过程序制定的主观计划去初始化类变量和其他资源。
编译器收集的顺序是由语句在源文件中出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,而定义在它之后的变量,在前面的静态语句块可以赋值,但不能访问。
private static String a = "默认值"; static { a="新字符串"; System.out.println(a); }
这个打印是可以使用的。
但是如下这部分代码就会发现编译器会提示error向前调用。Illegal forward reference
static {
a="新字符串";
System.out.println(a);
}
private static String a = "默认值";
image-20210522105528552
初始化方法执行的顺序,虚拟机会保证在子类的初始化方法执行之前,父类的初始化方法已经执行完毕,因此在虚拟机中第一个被执行的类初始化方法一定是java.lang.Object。
网友评论