java中的对象和引用之间的区别与代码?
public class TestVO { public static void main(String[] args) { VO vo1 = new VO(); VO vo2 = new VO(); VO vo3; VO vo4 = new VO(); vo1.setName("Sourav"); vo2.setName("Anil"); vo3 = vo1; vo4 = vo1; System.out.println(" " + vo4.getName()); vo1.setName("Abhishek."); System.out.println(vo1.getName() + " " + vo2.getName() + " " + vo3.getName() + " " + vo4.getName()); } }
–OUTPUT是:—
Sourav Abhishek. Anil Abhishek. Abhishek.
VO是一个包含String名称的简单类,包含getter和setter 。
在第一个System.out.println * vo4.getName() * print: Sourav ok.It没关系。
但在第二个System.out.println * vo4.getName() *打印: Abhishek。
我的问题是为什么第二次印刷是Abhishek。 。 我在vo4对象中保留了vo1对象的副本而不是引用。 这意味着它创造了一个新的记忆。 vo1和vo4是不同的。那么为什么vo4.getName在第二次更改。 我正在设置vo1对象但是vo4会自动更改。 为什么会这样?
我在vo4对象中保留了vo1对象的副本而不是引用。
不,你已经将变量vo1
和vo4
指向同一个对象,如下所示:
+ ----- + | vo1 | -------- \ + ----- + \ + ---------------- + ---> | (对象)| + ----- + / | name = Abishek | | vo4 | -------- / + ---------------- + + ----- +
让我们按照代码通过:
VO vo1 = new VO();
给我们:
+ ----- + + ---------------- + | vo1 | -------------> | (对象)| + ----- + | name = null | + ---------------- +
然后:
VO vo2 = new VO();
现在我们有:
+ ----- + + ---------------- + | vo1 | -------------> | (对象)| + ----- + | name = null | + ---------------- + + ----- + + ---------------- + | vo2 | -------------> | (对象)| + ----- + | name = null | + ---------------- +
然后:
VO vo3;
…只创建带有null
vo3
(不指向任何对象)。
然后:
VO vo4 = new VO();
所以我们有:
+ ----- + + ---------------- + | vo1 | -------------> | (对象)| + ----- + | name = null | + ---------------- + + ----- + + ---------------- + | vo2 | -------------> | (对象)| + ----- + | name = null | + ---------------- + + ----- + | vo3 | (一片空白) + ----- + + ----- + + ---------------- + | vo4 | -------------> | (对象)| + ----- + | name = null | + ---------------- +
现在:
vo1.setName("Sourav"); vo2.setName("Anil");
给我们:
+ ----- + + ---------------- + | vo1 | -------------> | (对象)| + ----- + | name = Sourav | ***改变在这里*** + ---------------- + + ----- + + ---------------- + | vo2 | -------------> | (对象)| + ----- + | name = Anil | *** 和这里 *** + ---------------- + + ----- + | vo3 | (一片空白) + ----- + + ----- + + ---------------- + | vo4 | -------------> | (对象)| + ----- + | name = null | + ---------------- +
事情变得有趣:
vo3 = vo1; vo4 = vo1;
这指向同一对象vo1
指向的vo1
,并指向该对象的vo4
, 释放用于指向的对象vo4
(其有资格进行垃圾收集)。 给我们:
+ ----- + | vo1 | ---- \ + ----- + \ \ + ----- + \ + ---------------- + | vo3 | -------------> | (对象)| + ----- + / | name = Sourav | / + ---------------- + + ----- + / | vo4 | ---- / + ----- + + ----- + + ---------------- + | vo2 | -------------> | (对象)| + ----- + | name = Anil | + ---------------- +
现在
System.out.println(" " + vo4.getName());
……按照你的期望给我们“Sourav”。
然后
vo1.setName("Abhishek.");
…更改vo1
, vo3
和vo4
都指向的对象:
+ ----- + | vo1 | ---- \ + ----- + \ \ + ----- + \ + ---------------- + | vo3 | -------------> | (对象)| + ----- + / | name = Abishek | / + ---------------- + + ----- + / | vo4 | ---- / + ----- + + ----- + + ---------------- + | vo2 | -------------> | (对象)| + ----- + | name = Anil | + ---------------- +
…所以对vo1
, vo3
或vo4
getName()
会给你“ vo4
”。
因为vo1和vo4都指的是同一个对象。
下面的赋值使vo4引用由vo1引用的对象。
vo4 = vo1;
因此,通过任何引用(无论是vo1还是vo4)对引用对象所做的任何更改都将反映到同一对象。
因此,如果你改变说vo4.setName(“xyz”),它将改变由vo4引用的对象,但实际上vo1也指的是同一个对象。 因此,在为一个对象分配的一个存储器位置进行改变,该对象由许多参考(在这种情况下为vo1和vo4)进行参考。
您正在为vo1
和vo4
分配相同的对象引用。
vo4 = vo1;
现在两个引用变量都指向同一个对象。
Object是一个实体,它将为其中定义的字段存储实际值。对象将使用new
关键字在内存中创建,引用将返回到引用变量。引用变量不是对象。 因此在您的示例中, new VO()
将在堆内存上创建对象, VO1
将引用它。
当你做vo4 = vo1;
你只vo1
通过vo1
来复制vo1
, vo4
你会做一个指针分配,所以它们都分配到内存中的相同位置,如果vo1
改变它也会影响vo4
,就像你看到的结果一样
除了基本数据类型之外,java中的所有内容都是指针。 创建vo4
,将其设置为等于vo1
。 现在vo4
指向vo4
。
当你做vo4 = vo1
,它意味着参考变量vo4
指的是由vo1
引用的对象。 所以vo1
和vo4
都会引用相同的对象
阅读本教程的第一部分。 你不需要直到最后,因为它是关于垃圾收集,但它详细解释了如何为对象分配参考,以及它们是如何被分类的。
http://www.thejavageek.com/2013/06/22/how-do-objects-become-eligible-for-garbage-collection/
我必须准备以下图片:如你所见,vo1,Vo3,Vo4指向同一个物体