class的裝載
在講class的初始化之前,我們來講解下class的裝載順序。
以下摘自《Thinking in Java 4》
由于Java 中的一切東西都是對象,所以許多活動
變得更加簡單,這個問題便是其中的一例。正如下一章會講到的那樣,每個對象的代碼都存在于獨立的文件中。除非真的需要代碼,否則那個文件是不會載入的。通常,我們可認為除非那個類的一個對象構造完畢,否則代碼不會真的載入。由于static 方法存在一些細微的歧義,所以也能認為“類代碼在首次使用的時候載入”。
首次使用的地方也是static 初始化發生的地方。裝載的時候,所有static 對象和static 代碼塊都會按照本來的順序初始化(亦即它們在類定義代碼里寫入的順序)。當然,static 數據只會初始化一次。
簡要的說就是,在類有繼承關系時,類加載器上溯造型,進行相關類的加載工作。
比如:
1
2
|
Class B extends Class A 當我們 new B()時,類加載器自動加載A的代碼 |
class的初始化順序
通常是以下這樣的初始化順序:
(static對象和static代碼塊,依據他們的順序進行初始化)>成員變量>構造函數
測試代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
public class ClassInit { /** * @Title: main * @Description: 類初始化順序測試 * @param: @param args * @return: void * @throws */ public static void main(String[] args) { // TODO Auto-generated method stub new B(); } } class A { static { System.out.println( "A的static代碼塊..." ); } public String s1 = prtString( "A的成員變量..." ); public static String s2 = prtString( "A的static變量..." ); public A(){ System.out.println( "A的構造函數..." ); } public static String prtString(String str) { System.out.println(str); return null ; } } class B extends A{ public String ss1 = prtString( "B的成員變量..." ); public static String ss2 = prtString( "B的static變量..." ); public B(){ System.out.println( "B的構造函數..." ); } private static A a = new A(); static { System.out.println( "B的static代碼塊..." ); } { System.out.println( "代碼塊..." ); } } |
測試結果
A的static代碼塊...
A的static變量...
B的static變量...
A的成員變量...
A的構造函數...
B的static代碼塊...
A的成員變量...
A的構造函數...
B的成員變量...
代碼塊...
B的構造函數...
總結
以上就是Java中class的初始化順序的全部內容,希望對大家使用Java能有所幫助。
原文鏈接:http://www.jianshu.com/p/73901f972852