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一个对象的时候【对象初始化】

初始化顺序

  1. 静态代码块和静态赋值语句【按照你写的顺序执行】

  2. 父类先于子类

  3. 动态代码块和对象初始赋值语句

  4. 构造器
    示例

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

使用

具体业务逻辑

销毁

也就是说的垃圾回收啦

posted @ 2024-07-21 15:09  MagicWang0907  阅读(8)  评论(0)    收藏  举报