类 静态代码块 代码块 构造的执行顺序
流程解释
-
程序启动:Java 程序开始运行。
-
类加载:当程序需要使用某个类时,JVM 会将该类的字节码文件加载到内存中。
-
静态代码块执行:在类加载时,静态代码块会被执行,且仅执行一次。它主要用于对静态变量进行初始化等操作。
-
调用静态方法 / 创建对象:程序可以选择调用类的静态方法,或者创建类的实例对象。
-
是否创建对象:判断程序是要创建对象还是调用静态方法。
- 是:如果要创建对象,会先执行实例代码块,然后执行构造方法。
- 否:如果只是调用静态方法,则执行静态方法的逻辑。
-
对象创建完成,可进行操作:对象创建完成后,就可以使用对象的方法和属性进行相应的操作。
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("子类对象创建完成,可以进行操作。");
}
}
执行顺序:
-
加载父类,执行父类静态代码块。
-
加载子类,执行子类静态代码块。
-
创建子类对象时,先执行父类实例代码块,再执行父类构造方法。
-
接着执行子类实例代码块,最后执行子类构造方法。
这个顺序体现了 Java 中类和对象初始化的完整生命周期。