2013-03-06 51 views
4

已阅读这个问题In what order are the different parts of a class initialized when a class is loaded in the JVM?和相关的JLS。我想更详细地知道为什么例如,具有类动物(父)和Dog类(子类)如下:静态块实例块java订购

class Animal 
{ 
static{ 
System.out.println("This is Animal's static block speaking"): 
} 
{ 
System.out.println("This is Animal's instance block speaking"); 
} 

class Dog{ 
static{ 
System.out.println("This is Dog's static block speaking"); 
} 
{ 
System.out.println("This is Dog's instance block speaking"); 
} 
public static void main (String [] args) 
{ 
Dog dog = new Dog(); 
} 
} 

好的实例化一个类的直接超类之前需要进行初始化(因此所有的静变量和块需要被执行)。 所以基本上问题是:为什么在初始化超类的静态变量和静态块后,控制下降到静态变量初始化的子类,而不是完成实例成员的初始化?

控制是这样:

superclass (Animal): static variables and static blocks 
subclass (Dog): static variables and static blocks 
superclass (Animal): instance variables and instance blocks 
sublcass (Dog):instance variables and instance blocks 

的原因是什么,为什么是这样而不是:

superclass -> static members 
superclass -> instance members 
subclass -> static members 
sublcass-> instance members 
+0

我竭力想出这个地方甚至会事(假定超不知道的子类的任何东西)的例子。 – NPE 2013-03-06 17:49:53

回答

7

为什么初始化超强的静态变量和静态块之后类,控制下降到静态变量初始化的子类,而不是完成实例成员的初始化?

因为静态初始化发生一次之前创建的任何实例。

静态对应于类,非静态对应于特定的实例。

2

这是有道理的,如果你创造更多的狗

superclass (Animal): static variables and static blocks 
subclass (Dog) : static variables and static blocks 

superclass (Animal): instance variables and instance blocks 
subclass (Dog) : instance variables and instance blocks 

superclass (Animal): instance variables and instance blocks 
subclass (Dog) : instance variables and instance blocks 

superclass (Animal): instance variables and instance blocks 
subclass (Dog) : instance variables and instance blocks