posts - 13,  comments - 3,  trackbacks - 0

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

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

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

          加載ClassA --> 調用ClassA的靜態初始化代碼塊 --> 調用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的代碼,也就無法檢查是否存在靜態初始化代碼塊循環問題。事實上,上述程序在java中是能夠編譯通過的。

          其次,運行時的結果。當程序運行到第3行時,JVM加載ClassA類,此時,會執行ClassA類中的靜態初始化代碼塊。當程序執行到第12行時,調用ClassB的print方法,此時,程序跳轉到18行。

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

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

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


          網站導航:
           

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

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 嘉荫县| 怀远县| 青神县| 五华县| 正安县| 亚东县| 武隆县| 宣恩县| 克什克腾旗| 手游| 通江县| 大冶市| 冀州市| 波密县| 滕州市| 墨玉县| 十堰市| 左贡县| 卢湾区| 噶尔县| 灵石县| 南昌县| 河池市| 日土县| 北京市| 东乡| 涞水县| 平定县| 武川县| 滦平县| 合作市| 彰化市| 凤翔县| 东源县| 丽水市| 牡丹江市| 新闻| 芒康县| 瑞金市| 涿鹿县| 邵阳市|