{
public static void main(String []agrs)
{
Son son = new Son();
}
}
class Super
{
public Super()
{
System.out.print("A\t");
}
{
System.out.print("B\t");
}
static
{
System.out.print("C\t");
}
}
class Son extends Super
{
public Son()
{
System.out.print("D\t");
}
{
System.out.print("E\t");
}
static
{
System.out.print("F\t");
}
}
靜態的東西是屬於類的,非靜態的東西是屬於實例的。
靜態的先執行,然後纔是非靜態的。
在上例中,還要考慮繼承的問題。
首先是父類靜態 --> C
然後是子類靜態 --> F
非靜態區塊可以看作是構造函數中執行完父類構造函數後的第一部分。(構造函數第一行有一個默認的super()調用,就是調用父類構造函數)。
這個時候執行父類構造函數:
父類非靜態區塊 --> B
父類構造函數塊 --> A
然後是子類構造函數:
子類非靜態區塊 --> E
子類構造函數塊 --> D
總結一下就是:
C F B A E D
值得注意的是,靜態的東西只會執行一次,就是在類加載的時候。
如果我們在上例中修改main函數爲:
Java code
public static void main(String[] agrs) { Son son = new Son(); Son son2 = new Son();}
這個時候的執行結果爲:
C F B A E D B A E D
可以看到第二次創建Son實例的時候,靜態的東西不會再次執行。
引用原址:http://d-y-zh.iteye.com/blog/607027