class parent {
parent() {
System.out.println("parent");
}
}
public class child extends parent {
{
System.out.println("non static block");
}
child() {
super();
System.out.println("idk");
}
public static void main(String[] args) {
new child();
}
}
输出:
parent
non static block
idk
我期待输出
non static block
parent
idk
为什么没有非静态块首先运行?
答案 0 :(得分:1)
每次构造类的对象时,都会运行非静态初始化程序块。
您可以将这些块视为在所有类构造函数之间共享的代码片段 - 与调用方法的初始化器在所有构造函数之间共享的方式相同。
为什么非静止块首先运行?
非静态块在类的构造函数的代码之前运行,
但在基类构造函数的代码之后。这就是为什么你看到基类的构造函数打印的non static block
和构造函数打印的parent
之间的idk
。
答案 1 :(得分:0)
添加一件事来回答@dasblinkenlight。这称为initializing instance member。
Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。
答案 2 :(得分:0)
为任何类创建objet后,它的第一个调用是在那里调用Constructer。在构造函数内部,它将调用this()或super()。如果存在任何超类,则constructer将使用super()调用其超类构造函数。所以在你的例子中,jvm调用第一个超类构造函数,如果里面有任何代码,它就会执行。此外,如果将非静态块放在将在当前类静态块之前调用的超类中。
通话顺序 - >静态块(如果存在) - >所有非静态块 - > Constructer - >所有已定义的方法()
每次创建类的对象时都会运行非静态块。