java基础之类的声明周期

49 阅读3分钟

image.png

类 静态代码块 代码块 构造的执行顺序

流程解释

  1. 程序启动:Java 程序开始运行。

  2. 类加载:当程序需要使用某个类时,JVM 会将该类的字节码文件加载到内存中。

  3. 静态代码块执行:在类加载时,静态代码块会被执行,且仅执行一次。它主要用于对静态变量进行初始化等操作。

  4. 调用静态方法 / 创建对象:程序可以选择调用类的静态方法,或者创建类的实例对象。

  5. 是否创建对象:判断程序是要创建对象还是调用静态方法。

    • :如果要创建对象,会先执行实例代码块,然后执行构造方法。
    • :如果只是调用静态方法,则执行静态方法的逻辑。
  6. 对象创建完成,可进行操作:对象创建完成后,就可以使用对象的方法和属性进行相应的操作。

class LifeCycleDemo {
    // 静态变量,用于演示静态代码块的初始化
    static int staticVariable;

    // 实例变量
    int instanceVariable;

    // 静态代码块,在类加载时执行,且只执行一次
    static {
        System.out.println("静态代码块执行,静态变量 staticVariable 初始化为 10");
        staticVariable = 10;
    }

    // 实例代码块,每次创建对象时都会执行,在构造方法之前执行
    {
        System.out.println("实例代码块执行,实例变量 instanceVariable 初始化为 20");
        instanceVariable = 20;
    }

    // 构造方法,用于创建对象时初始化对象的状态
    public LifeCycleDemo() {
        System.out.println("构造方法执行,此时实例变量 instanceVariable 的值为: " + instanceVariable);
    }

    // 静态方法,用于演示类加载后可以直接调用静态方法
    public static void staticMethod() {
        System.out.println("静态方法执行,静态变量 staticVariable 的值为: " + staticVariable);
    }
}

public class Main {
    public static void main(String[] args) {
        // 调用静态方法,触发类的加载
        LifeCycleDemo.staticMethod();

        System.out.println("开始创建第一个 LifeCycleDemo 对象");
        // 创建第一个对象
        LifeCycleDemo obj1 = new LifeCycleDemo();

        System.out.println("开始创建第二个 LifeCycleDemo 对象");
        // 创建第二个对象
// 父类
class ParentClass {
    // 父类静态变量
    static int parentStaticVariable;

    // 父类实例变量
    int parentInstanceVariable;

    // 父类静态代码块,在类加载时执行,且只执行一次
    static {
        System.out.println("父类静态代码块执行,父类静态变量 parentStaticVariable 初始化为 100");
        parentStaticVariable = 100;
    }

    // 父类实例代码块,每次创建对象时都会执行,在构造方法之前执行
    {
        System.out.println("父类实例代码块执行,父类实例变量 parentInstanceVariable 初始化为 200");
        parentInstanceVariable = 200;
    }

    // 父类构造方法,用于创建对象时初始化对象的状态
    public ParentClass() {
        System.out.println("父类构造方法执行,此时父类实例变量 parentInstanceVariable 的值为: " + parentInstanceVariable);
    }
}

// 子类,继承自 ParentClass
class ChildClass extends ParentClass {
    // 子类静态变量
    static int childStaticVariable;

    // 子类实例变量
    int childInstanceVariable;

    // 子类静态代码块,在类加载时执行,且只执行一次
    static {
        System.out.println("子类静态代码块执行,子类静态变量 childStaticVariable 初始化为 300");
        childStaticVariable = 300;
    }

    // 子类实例代码块,每次创建对象时都会执行,在构造方法之前执行
    {
        System.out.println("子类实例代码块执行,子类实例变量 childInstanceVariable 初始化为 400");
        childInstanceVariable = 400;
    }

    // 子类构造方法,用于创建对象时初始化对象的状态
    public ChildClass() {
        System.out.println("子类构造方法执行,此时子类实例变量 childInstanceVariable 的值为: " + childInstanceVariable);
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("程序开始执行,创建子类对象...");
        // 创建子类对象
        ChildClass child = new ChildClass();
        System.out.println("子类对象创建完成,可以进行操作。");
    }
}

执行顺序:

  1. 加载父类,执行父类静态代码块。

  2. 加载子类,执行子类静态代码块。

  3. 创建子类对象时,先执行父类实例代码块,再执行父类构造方法。

  4. 接着执行子类实例代码块,最后执行子类构造方法。

这个顺序体现了 Java 中类和对象初始化的完整生命周期。