2013-03-06 57 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