天天看點

反射(分析類初始化)

什麼時候會發生類初始化:

1)new的時候

2)使用反射的時候

3)當初始化一個類,如果其父類沒有被初始化,則先會初始化它的父類

測試:

1 package reflection;
 2 
 3 
 4 import org.w3c.dom.ls.LSOutput;
 5 
 6 import java.nio.file.FileSystemAlreadyExistsException;
 7 
 8 // 測試類聲明時候會初始化
 9 public class Test06 {
10     static {
11         System.out.println("Main類被加載");
12     }
13     public static void main(String[] args) {
14         Son son = new Son();
15     }
16     
17 }
18 
19 class Father {
20     static  int b = 2;
21     static {
22         System.out.println("父類被加載");
23     }
24 }
25 
26 class Son extends Father {
27     static {
28         System.out.println("子類被加載");
29         m = 300;
30     }
31 
32     static int m = 100;
33     static final int M = 1;
34      

結果:

Main類被加載

父類被加載

子類被加載

1      

結果:

Main類被加載

父類被加載

子類被加載

不會發生類初始化情況:

1)子類去調用父類的靜态變量,不會導緻子類初始化

1      

結果:

Main類被加載

父類被加載

2

2)通過數組定義類引用,不會觸發此類的初始化

1    Son[] sons = new      

結果:

Main類被加載

3)引用常量不會觸發此類的初始化(常量在連結階段就存入調用類的常量池中了)

1