Java对象,引用变量和垃圾收集堆

时间:2011-06-27 22:22:38

标签: java

我知道你可以创建2个对象引用变量,例如:

Book b;
Book c;

然后创建2个对象并使引用变量指向它们:

b = new Book();
c = new Book();

所以现在垃圾收集堆中还有2个对象。

如果您将b引用变量分配给c,即:

c = b;

GCH中的1个对象现在有资格进行垃圾回收,因此基本上有1个对象。


但如果您更改了b的内容,例如:

,该怎么办?
b.setAuthor("New Writer");

这是否意味着如果您使用引用变量c

c.getAuthor();

它会得到"New Writer",因为b和c都指向同一个对象?

这看起来很奇怪,因为直觉上我会认为,如果你做x = y,那么当你在转让之后改变一些事情时,y应该仍然与x不同。

6 个答案:

答案 0 :(得分:3)

  

这是否意味着如果你使用了   引用变量c如下:

     

c.getAuthor();

     

因为两者都会得到“新作家”   b和c指向同一个对象?

是的,它确实如此,至少对于任何对象(与primitive types相对)。最简单的方法可能是编写一个示例程序,看看它是如何工作的。

Primitive types(int,float,boolean等)工作明显,例如您在x = y示例中描述的。

答案 1 :(得分:2)

要扩展其他响应,请将“c = b”视为简单地为“b”已经引用的对象创建别名或替代名称。实际上,这就是你每次声明或分配任何变量时所做的事情。 “new Book()”会在内存中创建一些对象,但“Book b =”会在程序中为其命名,允许您访问它。

答案 2 :(得分:2)

处理Java时要记住的规则:

  1. 变量不是对象。变量包含对象(或null) - 特定的对象可以同时存储在零个或多个变量中。这不会创建新对象,请参阅#3。

  2. 变异对象会改变 对象。

  3. 分配(或传递)对象不会制作副本/克隆/重复。

  4. 虽然与“原始值”和实现细节存在差异,但原始值可以被视为上述规则下的对象:所有原始值都是不可变的和,如果他们被想象为单身(例如只有一个0),则等式(==)是身份相等(因此副本是难以区分的)。我尽量避免使用“引用”一词:一个对象本身就是

    希望这些规则和说明能回答你的问题: - )

    快乐的编码。

答案 3 :(得分:1)

由于c现在是b的引用副本,对b的任何更改都将应用于c(除非它们是基元,在这种情况下传递值而不是地址)

这是对它的迂回描述

http://www.javaranch.com/campfire/StoryPassBy.jsp

答案 4 :(得分:0)

这是参考变量的全部要点。 b.SetAuthor(...)实际上是[whatever b points to].SetAuthor(...)的简写,在这种情况下,b指向的内容与c指向的内容相同。 “真实”对象位于其他位置,而bc都是达到它的方式。在具有显式指针的语言中更为明显。

答案 5 :(得分:0)

将b和c视为指向不同Book对象的框。现在当c = b完成时,c框现在指向b指向的任何东西。所以b和c都引用完全相同的对象。更确切地说,当c = b完成时,c现在是b的别名。赋值意味着c得到b的值。对象在Java中存储为引用,因此c将只获取存储在b中的引用,该引用将引用正在引用的Book对象。

希望这有帮助。