2015-11-08 13 views
1
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(); 
    } 
} 

输出:非静态块何时在java中运行?

parent 
non static block 
idk 

我期待的输出为

non static block 
parent 
idk 

为什么没有非静态块运行第一?

+0

创建对象后,任何java程序中的第一次调用是class的Constructer。 Constructer将会调用它的超级Constructer。 –

回答

1

每当构建类的对象时,都会运行非静态初始化块。

您可以将这些块视为您的所有类构造函数之间共享的代码片段 - 就像调用方法的初始化函数在所有构造函数之间共享一样。

为什么did not nonstatic block run first ?? ??

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

0

只需添加一件事就可以回答@dasblinkenlight。这被称为initializing instance member

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

0

一旦你为任何类创建了objet,它的第一个调用就是在那里调用Constructer。在构造函数内部,它会调用this()或super()。如果存在任何超类,constructer将使用super()调用其超类构造函数。因此,在您的示例中,jvm会调用第一个超类构造器,并在其中执行任何代码。另外,如果将非静态块置于超类中,该类将在当前类静态块之前调用。

呼叫序列 - >静块(如果存在的话) - >中的所有非静态块 - >建筑工 - >所有定义的方法()

非静止象素块每次运行时的一个目的你的课程正在创建。