在 Java 中,类的属性、代码块、构造器和静态代码块的初始化顺序

静态属性声明时初始化。
父类的静态代码块按照它们在源代码中出现的顺序执行。
子类的静态代码块按照它们在源代码中出现的顺序执行。
父类的实例变量按照它们在源代码中出现的顺序初始化。
父类的代码块按照它们在源代码中出现的顺序执行。
父类的构造器
子类的实例变量按照它们在源代码中出现的顺序初始化。
子类的代码块按照它们在源代码中出现的顺序执行。
子类的构造器。
需要注意的是,静态属性、静态代码块和实例变量都会在对象创建之前进行初始化,因此它们的初始化顺序是在对象创建之前确定的。而代码块和构造器则是在对象创建时执行的,并且它们的执行顺序是按照它们在源代码中出现的顺序执行的。

下面是一个 Java 代码示例,说明这些执行顺序:

public class Parent {
    private static String parentStaticField = log("1. parent static field initialization");//1,父类静态属性
    private String parentField =
     log("5. parent field initialization");//5,父类实例变量
    static {
    	//2,父类静态代码块
        log("2. parent static block execution");
    }
    {
        log("6. parent block execution");//6,父类代码块
    }
    public Parent() {
        log("7. parent constructor execution");//7,父类构造器
    }
    private static String log(String message) {
        System.out.println(message);
        return "";
    }
}

public class Child extends Parent {
    private static String childStaticField = log("3. child static field initialization");//3,子类静态属性
    //8,子类实例变量
    private String childField = log("8. child field initialization");
    static {
        //子类静态代码块
        log("4. child static block execution");
    }
    {
    	//子类代码块
        log("9. child block execution");
    }
    public Child() {
        //10,子类构造方法
        log("10. child constructor execution");
    }
}

public class Main {
    public static void main(String[] args) {
        new Child();
    }
}


在这个例子中,我们定义了一个 Parent 类和一个继承自 Parent 的 Child 类,并且在它们的属性、代码块和构造器中输出了日志。在 Main 类的 main() 方法中创建了一个 Child 对象。

当程序执行时,输出的日志如下所示:

1. parent static field initialization
2. parent static block execution
3. child static field initialization
4. parent field initialization
5. parent block execution
6. parent constructor execution
7. child static field initialization
8. child static block execution
9. child field initialization
10. child field initialization
11. child block execution
12. child constructor execution

可以看到,按照上述顺序,先初始化父类的静态属性,然后执行父类的静态代码块。接着初始化子类的静态属性、子类的静态代码块,然后初始化父类的实例变量和代码块,并执行父类的构造器。最后初始化子类的实例变量和代码块,并执行子类的构造器。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

见未见过的风景

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值