什么时候非静态块在java中运行?

时间:2015-11-08 04:34:36

标签: java inheritance output non-static

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

为什么没有非静态块首先运行?

3 个答案:

答案 0 :(得分:1)

每次构造类的对象时,都会运行非静态初始化程序块。

您可以将这些块视为在所有类构造函数之间共享的代码片段 - 与调用方法的初始化器在所有构造函数之间共享的方式相同。

  

为什么非静止块首先运行?

非静态块在类的构造函数的代码之前运行, 但基类构造函数的代码之后。这就是为什么你看到基类的构造函数打印的non static block和构造函数打印的parent之间的idk

答案 1 :(得分:0)

添加一件事来回答@dasblinkenlight。这称为initializing instance member

  

Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。

答案 2 :(得分:0)

为任何类创建objet后,它的第一个调用是在那里调用Constructer。在构造函数内部,它将调用this()或super()。如果存在任何超类,则constructer将使用super()调用其超类构造函数。所以在你的例子中,jvm调用第一个超类构造函数,如果里面有任何代码,它就会执行。此外,如果将非静态块放在将在当前类静态块之前调用的超类中。

通话顺序 - >静态块(如果存在) - >所有非静态块 - > Constructer - >所有已定义的方法()

每次创建类的对象时都会运行非静态块。