初始化块的行为

Pra*_*gla 8 java constructor initialization

我有我无法理解的代码,它是如何产生输出的.以下代码 -

码:

class Bird {
  { System.out.print("b1 "); }
  public Bird() { System.out.print("b2 "); }
}
class Raptor extends Bird {
  static { System.out.print("r1 "); }
  public Raptor() { System.out.print("r2 "); }
  { System.out.print("r3 "); }
  static { System.out.print("r4 "); }
}
class Hawk extends Raptor {
  public static void main(String[] args) {
    System.out.print("pre ");
    new Hawk();
    System.out.println("hawk ");
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

r1 r4 pre b1 b2 r3 r2 hawk

问题:

我对此代码的具体问题是 -

  1. Hawk类初始化时,它会导致Raptor类进行实例化,因此静态代码块首先运行.但是,在打印之前,静态代码应该是非静态代码pre.不是吗?
  2. 那些非静态初始化块似乎实际上就像构造函数一样.那么,这些可以用作常规编程的构造函数吗?

Mar*_*nik 7

在打印之前,静态代码应该是非静态代码.不是吗?

  1. 运行Hawk.main会触发所有三个类的初始化.这是静态初始化器运行的时候;
  2. pre 印刷;
  3. new Hawk() 触发所有三个类的实例初始值设定项的执行.

这些可以用作常规编程的构造函数吗?

它们最终与构造函数中的代码一起编译成<init>方法.所以是的,它们与构造函数代码类似.关键的区别在于,无论运行哪个构造函数,它们都会运行,并在构造函数体之前运行.