Java类的生命周期
加载
也就是ClassLoder#loadClass ,将类的二进制文件加载到,并形成对应的class对象。二进制流的来源可以是本地的.class文件,也可以通过网络获取对应的二进制流。
连接
连接也可分为三个部分分别是
-
验证,验证字节码的信息是否满足规范
-
准备,给静态变量分配空间,并且赋上初始值。
例如
static int a = 1, 在准备阶段会被分配空间,并且赋值为int的默认值0;但是如果是static final int a = 1, 会被直接赋值为1,不会存在0的情况。 -
解析,字节码中的符号引用变成常量池的地址引用就是解析的一种。
初始化
这个地方也就是开始执行我们自己写的初始化代码了。可以通过-XX+TraceClassLoading来查看具体哪些类被加载了
初始化大致可以分为两种一种是类的,一种是对象的(对象的初始化一定会触发类的初始化)。
触发初始化的条件有:
-
访问一个类的静态变量(不包括final修饰变量,且赋值语句为常量表达式)或者静态方法的时候。【类的初始化】
-
Class.forName【类的初始化】 -
main方法执行的类【类的初始化】 -
new一个对象的时候【对象初始化】
初始化顺序
-
静态代码块和静态赋值语句【按照你写的顺序执行】
-
父类先于子类
-
动态代码块和对象初始赋值语句
-
构造器
示例
public class Test {
public static void main(String[] args) {
new Test3();
}
}
class Test2 {
static {
System.out.println("Test2 static block");
}
Test2() {
System.out.println("Test2 constructor");
}
}
class Test3 extends Test2 {
static {
System.out.println("Test3 static block");
}
{
System.out.println("Test3 block");
}
Test3() {
System.out.println("Test3 constructor");
}
}
// 最终输出
Test2 static block
Test3 static block
Test2 constructor
Test3 block
Test3 constructor
使用
具体业务逻辑
销毁
也就是说的垃圾回收啦

浙公网安备 33010602011771号