2013-01-04 83 views
1

非公開類Out中的靜態初始化塊不運行,但運行靜態嵌套類snOut中的靜態初始化塊。如何以及爲什麼這可能?靜態初始化塊跳過

public class staticNested { 

    static{ 
     System.out.println("In staticNested"); 
    } 

    static class sn{ 

     static{ 
      System.out.println("sn in staticNested"); 
     } 

     void p(){ 
      System.out.println("In static nested class method p"); 
     } 
    } 

    public static void main(String [] args){ 
     sn n = new sn(); 
     n.p(); 

     Out.snOut no = new Out.snOut(); 
     no.p(); 
    } 
} 

class Out{ 

    static{ 
     System.out.println("In Out"); //Skips this 
     System.out.println("Here"); //Skips this 
    } 

    static class snOut{ 

     static { 
      System.out.println("In snOut in Out"); 
     } 

      private int x; 

      void p(){ 
       System.out.println("In snOut in outside Class out: " + x); 
      } 

     } 
    } 

這是輸出:

In staticNested 
sn in staticNested 
In static nested class method p 
In snOut in Out 
In snOut in outside Class out: 0 
+1

我不認爲班級'Out'會被加載。它在您訪問其靜態字段或靜態方法或加載實例時加載。 jn1kk

+0

啊。我懂了。在主要方法中創建一個新實例會使塊運行。謝謝 – Mob

+0

爲什麼'Out'不加載和'staticNested'確實是因爲main是在'staticNested'中,它可以像你期望的那樣自動加載。 – jn1kk

回答

2

作爲每JLS 8.1.3

內部類的實例我其聲明發生在靜態上下文具有沒有詞法包圍實例

在您的代碼中,您嘗試訪問類爲sn,它是靜態的,所以它不會按照規範具有任何封閉類。這就是封閉類的靜態塊沒有執行的原因。

1

其實在你的代碼中並沒有被它自己使用Out類。這是一個原因,爲什麼Java沒有初始化它,並沒有調用它的靜態部分。

UPD .:說明。您的代碼導致類Out.snOut的初始化,但這不是初始化類Out的原因。

1

你的內部類是靜態的。這意味着它們就像外部類一樣,並且它們類型的對象可以在不需要父對象的情況下進行初始化。所以這裏父對象從不被初始化,並且它們的靜態初始化塊不被執行。