代码中的哪些部分非静态变量被加载到内存中?

时间:2017-01-30 10:12:33

标签: java

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
{

}

我知道只有在将对象创建为a时才会加载bSampleClass。但我正在检查我的代码的哪一部分被加载到内存中?我的输出中没有得出任何结论。

10
11
com.stack.ExtraClass@19821f
===============
10
11
com.stack.ExtraClass@19821f

1 个答案:

答案 0 :(得分: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();
    }
}