1

想象一组分层的类,其中类 A 有一个字段 Class B,而类 B 有一个类 C 的字段。这些字段在每个类的构造函数中设置。

现在,如果我创建一个 X 类的对象实例,其中包含 A 类的字段“a”,其中“a”从未设置,并且保持为空:

如果有的话,对象“a”会发生什么类特定的“动作”?它会从自己的领域调用任何东西吗?B级或C级有反应吗?我想可能存在内存分配或类似情况,但我完全不确定。我问的原因是为了更好地理解数据流和应用程序中的操作顺序。

我试图找到这个问题的答案已经有一段时间了,但我似乎找不到正确的提问方式,因为这个问题与关于如何在 Java 中定义对象的基本问题有点太接近了。

4

2 回答 2

1

因此,让我们假设以下类定义:

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。创建的。所有这些实例都将占用内存堆中的空间,并且对这些对象的引用将存储在它们各自的变量中。

于 2013-10-31T10:23:32.417 回答
0

与其将引用类型变量视为持有“指针”,我认为将它们视为持有对象标识符更有帮助。如果X是类类型的变量Thing,则X保存足以识别Thing或从中派生的类,或足以说明它没有的信息。尽管许多 Java 实现中的引用类型变量持有某种类型的指针,但并不要求它们这样做。想要访问超过 4 gigs 内存而不必使用 64 位对象引用的 Java 实现可以将所有对象大小四舍五入到下一个 16 字节的倍数,然后让每个非零对象引用存储一个缩放的偏移量到堆(因此位于堆开始上方 32016 字节的对象将存储数字“2001”[十进制]作为参考)。尽管 Java 没有说明与引用关联的位模式是什么意思,但它确实指定的一件事是初始化数组槽和对象字段的位模式永远不会识别任何对象。

于 2013-11-05T18:16:32.347 回答