我知道你可以创建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
不同。
答案 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时要记住的规则:
变量不是对象。变量包含对象(或null
) - 特定的对象可以同时存储在零个或多个变量中。这不会创建新对象,请参阅#3。
变异对象会改变 对象。
分配(或传递)对象不会制作副本/克隆/重复。
虽然与“原始值”和实现细节存在差异,但原始值可以被视为上述规则下的对象:所有原始值都是不可变的和,如果他们被想象为单身(例如只有一个0),则等式(==
)是身份相等(因此副本是难以区分的)。我尽量避免使用“引用”一词:一个对象本身就是 。
希望这些规则和说明能回答你的问题: - )
快乐的编码。
答案 3 :(得分:1)
由于c现在是b的引用副本,对b的任何更改都将应用于c(除非它们是基元,在这种情况下传递值而不是地址)
这是对它的迂回描述
答案 4 :(得分:0)
这是参考变量的全部要点。 b.SetAuthor(...)
实际上是[whatever b points to].SetAuthor(...)
的简写,在这种情况下,b
指向的内容与c
指向的内容相同。 “真实”对象位于其他位置,而b
和c
都是达到它的方式。在具有显式指针的语言中更为明显。
答案 5 :(得分:0)
将b和c视为指向不同Book对象的框。现在当c = b
完成时,c框现在指向b指向的任何东西。所以b和c都引用完全相同的对象。更确切地说,当c = b
完成时,c现在是b的别名。赋值意味着c得到b的值。对象在Java中存储为引用,因此c将只获取存储在b中的引用,该引用将引用正在引用的Book对象。
希望这有帮助。