2017-01-30 57 views
-2
public class SampleClass 
{ 
    int a = 10;  // loaded into memory for every object creation 
    int b = 11;  // loaded into memory for every object creation 
    ExtraClass extraClass = new ExtraClass();  // loaded into memory for every object creation 
    static int c; // loaded when class is loaded into memory 

    { 
     // IIB 
     System.out.println(a); 
     System.out.println(b); 
     System.out.println(extraClass);   
    } 

    public SampleClass() 
    { 
     super(); 
     // call to IIB 
     System.out.println("==============="); 
     System.out.println(a); 
     System.out.println(b); 
     System.out.println(extraClass);    
    } 

    public static void main(String[] args) 
    { 
     SampleClass obj = new SampleClass(); 
    } 
} 

class ExtraClass 
{ 

} 

我知道ab只有在創建對象的時候才加載到SampleClass。但是我正在檢查我的代碼的哪一部分被加載到內存中?我沒有從我的輸出中得出任何結論。代碼非靜態變量的哪部分被加載到內存中?

10 
11 
[email protected] 
=============== 
10 
11 
[email protected] 
+3

適用[JLS中的一部分(http://docs.oracle.com/javase/specs/jls/se8/html/jls-12。 html#jls-12.5) – RealSkeptic

回答

1

實例初始化(在{...}位)被內聯到構造,在super()之間(或this(),如果該被代替使用)和構造的身體的其餘部分。

此外構件變量初始化(例如int b = 11)等價於一個實例初始化:

int b; 
{ 
    b = 11; 
} 

所以它們被聯到構造也一樣,在同一個地方。如果你有多個實例初始化塊,它們按照它們出現的順序被內聯(並因此被執行)。

所以,你的班級看起來像下面這樣。按照通過,並希望您應該明白輸出:

public class SampleClass 
{ 
    int a; 
    int b; 
    ExtraClass extraClass; 
    static int c; 

    public SampleClass() 
    { 
     super(); 

     // Variable initializers. 
     this.a = 10; 
     this.b = 11; 
     this.extraClass = new ExtraClass(); 

     // Explicit instance initializer. 
     { 
      // IIB 
      System.out.println(a); 
      System.out.println(b); 
      System.out.println(extraClass);   
     } 

     // call to IIB 
     System.out.println("==============="); 
     System.out.println(a); 
     System.out.println(b); 
     System.out.println(extraClass);    
    } 

    public static void main(String[] args) 
    { 
     SampleClass obj = new SampleClass(); 
    } 
} 
+0

所以你說當執行達到內部實例初始化塊時加載非靜態變量 –

+0

我在說初始化塊被內聯到構造函數中。嘗試用'javap'反編譯你的類,你會看到這個。 –