情況一:沒有繼承父類時
1 class HelloA {
2
3 public HelloA() {
4 System.out.println("I'm A class");
5 }
6
7 static {
8 System.out.println("static A");
9 }
10
11 {
12 System.out.println("A");
13 }
14
15 public static void main(String[] args) {
16 new HelloA();
17 new HelloA();
18 }
19 }
輸出結果:
static A
A
I'm A class
A
I'm A class
分析:輸出順序為: 靜態代碼塊>非靜態代碼塊>構造器,同時無論New多少次class靜態代碼塊只執行一次,所以一般情況把耗內存重量級的連接或者其他放在靜態代碼塊中,訪問速度快,並且只訪問一次,節約消耗。
情況二:繼承某個父類時
class HelloA extends HelloB{
public HelloA() {
System.out.println("I'm A class");
}
static {
System.out.println("static A");
}
{
System.out.println("A");
}
public static void main(String[] args) {
new HelloA();
}
}
class HelloB {
public HelloB() {
System.out.println("I'm B class");
}
static {
System.out.println("static B");
}
{
System.out.println("B");
}
}
運行結果:
static B
static A
B
I'm B class
A
I'm A class
分析:輸出順序:父類靜態代碼塊>子類靜態代碼塊>父類非靜態代碼塊>父類構造器>子類非靜態代碼塊>子類構造器;