2017-01-30 2 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です。しかし私は自分のコードのどの部分がメモリにロードされているかをチェックしていましたか?私は自分の出力から何の結論も得られなかった。コード非static変数のどの部分をメモリにロードしますか?

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

インスタンス初期化子({...}ビット)(その代わりに使用された場合、またはthis()super()間に、コンストラクタにインラインとコンストラクタの体の残りの部分れます。

もメンバ変数初期化子(例えば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'でクラスを逆コンパイルしてみてください。これは表示されます。 –

関連する問題