posts - 13,  comments - 3,  trackbacks - 0

          在啃《The Java Programming Language 4th Edition》時看到的一個小知識點。先描述一下問題。

          一個類中,靜態(tài)初始代碼塊中的代碼會在類加載時自動運行。考慮下面這種情況:

          ClassA定義了靜態(tài)初始代碼塊,其中調(diào)用了ClassB的一個方法m(靜態(tài)非靜態(tài)均可)。而在ClassB的m方法中,又使用了ClassA類的信息。則,當虛擬機在沒有ClassB類的情況下,加載ClassA類時,會遇到這樣一條線索:

          加載ClassA --> 調(diào)用ClassA的靜態(tài)初始化代碼塊 --> 調(diào)用ClassB的m方法 --> 加載ClassB --> 使用ClassA的信息

          注意這條線索的一頭一尾,我們要在對ClassA還沒完成加載時,使用ClassA的信息!

          示例代碼:

           1public class TestStaticInit{
           2 public static void main(String args[]){
           3  ClassA a= new ClassA();
           4 }

           5}

           6
           7class ClassA{
           8 static int a1;
           9 static int a2;
          10 static{
          11  a1 = 10;
          12  ClassB.print();
          13  a2 = 30;
          14 }

          15}

          16
          17class ClassB{
          18 public static void print(){
          19  System.out.println(ClassA.a1);
          20  System.out.println(ClassA.a2);
          21 }

          22}

          23
          24

           

          首先,編譯器無法解決這個問題,因為在編譯ClassA類時,無法找到ClassB的代碼,也就無法檢查是否存在靜態(tài)初始化代碼塊循環(huán)問題。事實上,上述程序在java中是能夠編譯通過的。

          其次,運行時的結(jié)果。當程序運行到第3行時,JVM加載ClassA類,此時,會執(zhí)行ClassA類中的靜態(tài)初始化代碼塊。當程序執(zhí)行到第12行時,調(diào)用ClassB的print方法,此時,程序跳轉(zhuǎn)到18行。

          關(guān)鍵在這兒:此時的print方法需要調(diào)用ClassA的信息,并打印其靜態(tài)屬性。而ClassA的信息正在加載過程中。此時,JVM采用的策略是:在print方法中使用ClassA不完整的信息。在print方法中ClassA的信息,是在第12行對ClassB.print方法之前的信息。此時ClassA.a1已經(jīng)被賦值為10,而ClassA.a2還未被賦值,它的值為默認值。因此,最后打印出的是10、0。

          posted on 2009-01-05 23:48 Antony Lee 閱讀(424) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           

          <2009年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 漯河市| 耿马| 盖州市| 云梦县| 固镇县| 梅河口市| 南充市| 吉木乃县| 三门县| 怀宁县| 建瓯市| 高州市| 赫章县| 商洛市| 原平市| 韶关市| 若尔盖县| 磐石市| 清徐县| 江达县| 友谊县| 汉源县| 镇江市| 东光县| 山东| 潼南县| 静安区| 临洮县| 康平县| 华蓥市| 新晃| 定南县| 灵山县| 南和县| 镇江市| 巴东县| 犍为县| 昌宁县| 昭觉县| 泾源县| 苏尼特右旗|