3

我正在阅读这本关于数据结构的书,它涵盖了 Java 中的内存管理和孤立对象。教科书是这样说的:

例如,考虑左图中的三个赋值语句。在第三个赋值语句之后,不仅ab引用了同一个 Date 对象(2011 年 1 月 1 日),而且不再引用创建并用于初始化 b的 Date 对象。对该对象的唯一引用在变量b中,并且该引用被赋值覆盖,因此无法再次引用该对象。这样的对象被称为孤儿。

代码:

Date a=new Date(12, 31, 1999);
Date b=new Date(1, 1, 2011);
b=a;

这种说法是真的吗?a 的引用(对象的内存位置不Date(12, 31, 1999)应该是 b 的引用吗?这似乎是一个巨大的错误,但甚至有一张图片显示 12, 31, 1999 的内存块是孤立对象。

图片:http: //imageshack.us/f/818/3tkx.jpg/

4

6 回答 6

7

在java中,你总是将右边的东西分配给对左边的引用。

所以你的陈述是这样说的:

  1. 将新Date对象分配Date(12, 31, 1999)给变量a
  2. 将新Date对象分配Date(91, 1, 2011)给变量b
  3. 将 variable 的引用分配a给 variable b

因此,如果我按照以下步骤操作,它看起来像这样:

  1. a-> Date(12, 31, 1999)

  2. a-> Date(12, 31, 1999) b-> Date(1, 1, 2011)

  3. a-> Date(12, 31, 1999) b-> Date(12, 31, 1999)

请注意,在此分配之后,Date(1, 1, 2011)不再引用原始对象,因为您无法从应用程序中访问它。它的原始引用变量b被覆盖,现在对象Date(12, 31, 1999)a和引用bDate(91, 1, 2011)孤立的并准备好被垃圾收集。

想象一下,就好像你拿着一把剑和一把斧头。首先你拿起一把剑。然后你拿起斧头。之后你放下剑并用双手拖动你手中的斧头。之后,您不再握住掉落的剑(它丢失了)。

编辑:如果您告诉本书的作者,他将不胜感激,这是一个错误。

于 2013-08-05T09:56:53.503 回答
2

b=a语句丢弃 的当前值b,并且由于没有其他对称为 b 的日期对象的引用,是的,b 日期是孤立的。

于 2013-08-05T09:53:27.470 回答
2

是的,

(2011 年 1 月 1 日)

在文中是错误的。这很可能是编辑错误。除此之外,其他一切都是正确的。b 被 a 的内容覆盖,即 Date(12, 31, 1999)。因此,这两个变量都指向 Date(12, 31, 1999) 并且 Date(1, 1, 2011) 是孤立的并且可以被垃圾收集。

也许你应该检查你的书的勘误表。:-)

于 2013-08-05T09:57:16.940 回答
2

可以说a是指存储在内存位置的 Date 对象123。按照相同的逻辑,可以说b是指存储在内存位置的 Date 对象546。(新对象新位置)。

现在当你做b = a. b指的是Object @ 123. 546不再可访问,并且可以随时被 GC'ed。

于 2013-08-05T09:58:40.940 回答
2

你是对的,孤立对象是 指向的对象b,即Date(1, 1, 2011)。如果图片显示不是这样,那肯定是错误的。

a --> 31.12.1999     b --> 1.1.2011

                 |
                \ /

a --> 31.12.1999 <-- b     1.1.2011 (orphaned!)
于 2013-08-05T09:56:34.410 回答
1

句子是的(解释很好,但他混淆了对象)

  • 创建的对象new Date(12, 31, 1999)被引用两次,分别是ab
  • 创建的对象在赋值new Date(91, 1, 2011)后没有被其他人引用b=a,所以会从内存中删除
于 2013-08-05T09:53:37.217 回答