平時有時候需要初始化某些參數,經常就直接在一個類里面加一個static,然后把需要初始化的內容寫到里面,在外邊只需要引用一下這個類就可以了,程序一直運行沒有問題,但是最近把JDK升級到1.6發現static中的參數都沒有初始化,研究了下發現在1.5及以上版本,JDK修改了編譯邏輯,如果只引用下Language.class這種,是不會運行到static里面的代碼的,必須類的構造函數被調用才會運行。測試代碼如下
1
public class Main {
2
public static Date date = null;
3
4
public static void main(String[] args) {
5
System.out.println(Language.class);
6
System.out.println("------------");
7
System.out.println("date:" + date);
8
System.out.println("------------");
9
System.out.println(Language.JAVA);
10
}
11
}
12
13
public class Language {
14
15
public final static Language[] languages;
16
public final static Language C = new Language("C");
17
public final static Language JAVA = new Language("java");
18
public final static Language FORTRAN = new Language("FORTRAN");
19
static {
20
System.out.println("in static block");
21
languages = new Language[] { C, JAVA, FORTRAN };
22
Main.date = new Date();
23
System.out.println("leave static block");
24
}
25
26
private String name;
27
28
private Language(String name) {
29
this.name = name;
30
System.out.println("create '" + name + "' language");
31
}
32
33
public String toString() {
34
return this.name;
35
}
36
37
}

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

JDK1.4下執行結果
create ‘C’ language
create ‘java’ language
create ‘FORTRAN’ language
in static block
leave static block
class Language
————
date:Mon Aug 02 16:21:42 CST 2010
————
java
JDK1.5下執行結果
class Language
————
date:null
————
create ‘C’ language
create ‘java’ language
create ‘FORTRAN’ language
in static block
leave static block
java