因此,让我们假设以下类定义:
public class A {
private B b;
public A() {
b = new B();
}
}
public class B {
private C c;
public B() {
c = new C();
}
}
public class C {
public C() {
}
}
public class X {
private A a;
public X() {
}
}
现在假设正在执行以下 main:
public static final void main (String[] argv) {
X x = new X();
}
这里的一个实例X
是在内存堆中创建的,并且对该对象的引用存储在x
变量中。
由于在类构造期间没有为变量分配任何值a
,因此不会创建 A 的实例。作为创建的实例的一部分,该a
变量仍然占用内存中的空间X
(换句话说,它仍然需要足够的空间来存储引用),但在这种情况下a
被分配了null
值(来自Java Language Specification § 4.12.5 )
对于所有引用类型 ( §4.3 ),默认值为 null。
现在让我们修改X
类如下
public class X {
private A a;
public X() {
a = new A();
}
}
main()
如果我们用这个修改后的版本再次执行该方法X
,那么作为构造过程的一部分,X
将导致创建一个实例,A
这将导致创建一个实例,B
这反过来又会导致一个类的实例被创建C
。创建的。所有这些实例都将占用内存堆中的空间,并且对这些对象的引用将存储在它们各自的变量中。