本文主要起记录作用
借鉴链接
类生命周期
类的字节码从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。类的生命周期如下图所示:
其中,加载、验证、准备、初始化、卸载在类的生命周期的顺序是不变的,那解析呢,它在某些情况下可能在初始化之后开始。这里要强调“开始”这两个字,因为类的生命周期里都是交叉完成的,通常会在执行一个阶段的过程中开始另外一个阶段。
在链接-准备过程中 主要对静态变量赋初值 final修饰变量直接赋最终值
在初始化阶段 会顺序执行clinit() init()方法
在此对两个方法简单阐述:
clinit()方法:执行 静态变量赋值和静态代码块内操作
init()方法 :顺序执行
①成员变量初始化和代码块内操作
②构造器的执行
案例:
public class StaticTest
{
public static void main(String[] args)
{
staticFunction();
}
static StaticTest st = new StaticTest();
static
{
c=3;
System.out.println("1");
}
{
System.out.println("2");
System.out.println(c);
}
StaticTest()
{
System.out.println("3");
System.out.println("a="+a+",b="+b);
}
public static void staticFunction(){
System.out.println("4");
}
int a=110;
static int b =112;
static int c;
}
待会儿我们给出输出结果,分析一下执行过程。
- 这个类是入口方法类,所以在进入Main方法之前会进行准备阶段,b和c初始化为0,然后执行初始化()方法。
- 执行到static StaticTest st = new StaticTest(); 会触发类的实例化。
- 由于初始化()方法已经在执行了,所以直接会初始化非static代码块,先执行System.out.println(“2”);打印出2。执行System.out.println©;时,由于c只进行初始化,并没有进行赋值,所以打印出0。
- 接着执行成员变量的初始化,a=110。
- 紧接着执行构造方法,执行System.out.println(“3”);,打印出3,执行System.out.println(“a=”+a+",b="+b);,a的值为110,b是类的常量,只进行了初始化,未进行赋值为0,所以打印出a=110,b=0。
- 静态成员变量st执行完之后,进行执行静态方法,c赋值为3,打印出1。
- ()执行完毕。
- 接着执行staticFunction方法,打印出4。
最终的执行结果:
2
0
3
a=110,b=0
1
4
执行顺序: