类从加载到虚拟机到卸载,它的整个生命周期包括:装载(Loading),验证(Validation),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)。其中,验证、准备和解析部分被称为连接(Linking)。
简单的分析:
至于使用和卸载阶段阶段,这里不再过多说明,使用过程就是根据程序定义的行为执行,卸载由GC完成。
- 1:装载,通过类的全名产生对应类的二进制数据流,分析二进制数据流并转换为方法区特定的数据结构,创建对应类的java.lang.Class实例。
- 2:链接,
- 分为检测(确保被导入类型的正确性。),
- 准备(为类变量分配内存,并将其初始化为默认值),
- 解析(把类型中的符号引用转换成直接引用)三步。
- 3:初始化,把类变量(static)初始化为正确初始值。
- 类变量的初始化(有赋值操作),无论是基本数据类型还是引用数据类型,类变量的初始化都会被提取到clinit方法中。
- 常量的初始化,对于基本数据类型来说,会直接被编译器生成constant值。而对于引用数据类型常量的初始化会被提取到clinit方法中。
关于继承时的类中的变量加载顺序以及方法的调用,简单分享下:
先父类的静态变量/静态块的初始化-----------父类的实例变量的初始化----父类的构造函数(其中存在方法的调用的,这个方法会调用子类的方法,若这个方法中有变量的操作,那么变量是子类的默认值,比如调用一个tell()方法;另外有一点不同:若调用的是print(name)方法,由于这个name变量在父类中已经赋值,方法将调用的是子类的方法,但是传递的name的值是父类的name值。(这一点我自己也有点想不通,大牛看过可以赐教下!))--------子类的静态-------子类的非静态---------子类的构造函数------------
本文是阿龙参考别的文章,自己又根据自己的认知,改变了一些东西。仅供参考!