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
时才会加载b
和SampleClass
。但我正在检查我的代码的哪一部分被加载到内存中?我的输出中没有得出任何结论。
10
11
com.stack.ExtraClass@19821f
===============
10
11
com.stack.ExtraClass@19821f
答案 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();
}
}