说到类的加载和类的初始化,想必大家都会很迷茫,总是搞不清楚他俩的区别,下面就来说一说他俩的区别:
类的加载包括类的初始化,类的加载后使用前的最后一个阶段。
类的加载:代表jvm将java文件编译成class文件后,以二进制流的方式存放到运行时数据的方法区中,并在java的堆中创建一个java.lang.Class对象,用来指向存放在方法堆中的数据结构。
这里给大家推荐一篇java类加载的很好的文章:https://www.cnblogs.com/ityouknow/p/5603287.html
类的初始化:类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中验证、准备、解析3个部分统称为连接。类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。
类加载有三种方式:
1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载
在执行类的时候,静态变量会优先类的构造函数执行。
例如:
加载测试类
package frist;
public class ParentClass {
static int num = 0;
String name = "qqqqqq";
static String name2 = "wwwwwwwwwww";
static ParentClass parentClass = new ParentClass();
ParentClass(){
System.out.println("这里是构造函数*************");
}
{
System.out.println("name1:" + name);
System.out.println("这里是块1============");
}
static {
num += 1;
System.out.println("name2:" + name2);
System.out.println("这里是静态初始化块*************" + num);
}
}
测试类:
package frist;
public class TestClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
ParentClass pa = new ParentClass();
}
}
输出结果:
name1:qqqqqq
这里是块1============
这里是构造函数*************
name2:wwwwwwwwwww
这里是静态初始化块*************1
name1:qqqqqq
这里是块1============
这里是构造函数*************
执行顺序:静态对象parentClass执行初始化---》静态对象parentClass的静态块---》静态对象parentClass的构造方法---》最开始被调用的类的静态块---》最开始被调用的类的构造方法
这是因为静态对象的执行级别是一样的,因此会从最靠上的静态对象开始执行,而且每个静态方法只会在类生命的时候初始化一次。