java 初始化塊
初始化塊:
靜態初始化塊;非靜態初始化塊
執行順序:
所有的靜態初始化塊都優先執行,其次才是非靜態的初始化塊和建構函式,它們的執行順序是:
1父類的靜態初始化塊
2子類的靜態初始化塊
3父類的初始化塊
4父類的建構函式
5子類的初始化塊
6子類的建構函式
每個類的靜態初始化塊都只在第一次例項化該類物件時執行一次
說明:
靜態初始化塊的優先順序最高,也就是最先執行,並且僅在類第一次被載入時執行;
非靜態初始化塊和建構函式後執行,並且在每次生成物件時執行一次;
非靜態初始化塊的程式碼會在類建構函式之前執行。因此若要使用,應當養成把初始化塊寫在建構函式之前的習慣,便於除錯;
靜態初始化塊既可以用於初始化靜態成員變數,也可以執行初始化程式碼;
非靜態初始化塊可以針對多個過載建構函式進行程式碼複用
例子
1 class A {
2 static {
3 System.out.println("Static init A.");
4 }
5
6 {
7 System.out.println("Instance init A.");
8 }
9
10 A() {
11 System.out.println("Constructor A.");
12 }
13 }
14
15 class B extends A {
16 static {
17 System.out.println("Static init B.");
18 }
19
20 {
21 System.out.println("Instance init B.");
22 }
23
24 B() {
25 System.out.println("Constructor B.");
26 }
27 }
28
29 class C extends B {
30
31 static {
32 System.out.println("Static init C.");
33 }
34
35 {
36 System.out.println("Instance init C.");
37 }
38
39 C() {
40 System.out.println("Constructor C.");
41 }
42 }
43
44 public class Main {
45
46 static {
47 System.out.println("Static init Main.");
48 }
49
50 {
51 System.out.println("Instance init Main.");
52 }
53
54 public Main() {
55 System.out.println("Constructor Main.");
56 }
57
58 public static void main(String[] args) {
59 C c = new C();
60 B b = new B();
61 }
62 }
結果:
(C c = new C())
Static init Main. --main函式再Main類中呼叫,先初始化Main類
Static init A. --父父類static塊 ((靜態初始化塊的優先順序最高,也就是最先執行,並且僅在類第一次被載入時執行;)
Static init B. --父類static塊
Static init C. --子類static塊
Instance init A. --父父類非static塊
Constructor A. --父父類建構函式
Instance init B. --父類非static塊
Constructor B. --父類建構函式
Instance init C. --子類非static塊
Constructor C. --子類建構函式
(B b = new B())
Instance init A. --父類非static塊 (靜態初始化塊的優先順序最高,也就是最先執行,並且僅在類第一次被載入時執行;非靜態初始化塊和建構函式後執行,並且在每次生成物件時執行一次;)
Constructor A. --父類建構函式
Instance init B. --子類非static塊
Constructor B. --子類建構函式