java代码块的执行顺序是什么

Java代码块执行顺序为:父类静态代码块→子类静态代码块→父类实例代码块→父类构造方法→子类实例代码块→子类构造方法;静态优先于实例,父类优先于子类,代码块在对应构造方法前执行。

Java代码块的执行顺序主要涉及静态代码块、实例代码块、构造方法以及变量初始化。理解它们的执行顺序对掌握对象创建过程和类加载机制非常重要。

1. 静态代码块(static block)

静态代码块在类第一次被加载时执行,且只执行一次。它用于初始化静态变量或执行仅需运行一次的操作。

特点:

  • 随着类的加载而执行
  • 一个类中可以有多个静态代码块,按书写顺序执行
  • 优先于所有实例相关的内容执行

2. 实例代码块(instance initializer block)

实例代码块在每次创建对象时执行,位于类中但不在任何方法或构造器内,用{}表示。

执行时机:

  • 在调用构造方法之前执行
  • 每次new对象时都会执行一次
  • 如果有多个实例代码块,按出现顺序执行

3. 构造方法(constructor)

构造方法在实例代码块执行完后立即调用,用于完成对象的初始化。

注意点:

  • 如果没写构造方法,编译器会提供默认无参构造
  • 子类构造中会隐式或显式调用父类构造

4. 综合执行顺序规则

当创建一个对象时,整体执行顺序如下:

  1. 父类静态成员和静态代码块(按定义顺序)
  2. 子类静态成员和静态代码块
  3. 父类实例代码块
  4. 父类构造方法
  5. 子类实例代码块
  6. 子类构造方法

举个例子:

static class Parent {
    static { System.out.println("父类静态代码块"); }
    { System.out.println("父类实例代码块"); }
    Parent() { System.out.println("父类构造方法"); }
}

static class Child extends Parent {
    static { System.out.println("子类静态代码块"); }
    { System.out.println("子类实例代码块"); }
    Child() { System.out.println("子类构造方法"); }
}

执行new Child()输出为:

父类静态代码块
子类静态代码


父类实例代码块
父类构造方法
子类实例代码块
子类构造方法

基本上就这些。记住:静态先于实例,父类先于子类,代码块在构造方法前。不复杂但容易忽略细节。