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名称的简单类,包含gettersetter

在第一个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对象的副本而不是引用。

不,你已经将变量vo1vo4指向同一个对象,如下所示:

  + ----- +
 |  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."); 

…更改vo1vo3vo4都指向的对象:

  + ----- +
 |  vo1 | ---- \
 + ----- + \
              \
 + ----- + \ + ---------------- +
 |  vo3 | -------------> |  (对象)|
 + ----- + / |  name = Abishek |
              / + ---------------- +
 + ----- + /
 |  vo4 | ---- /
 + ----- +

 + ----- + + ---------------- +
 |  vo2 | -------------> |  (对象)|
 + ----- + |  name = Anil |
                      + ---------------- + 

…所以对vo1vo3vo4 getName()会给你“ vo4 ”。

因为vo1和vo4都指的是同一个对象。

下面的赋值使vo4引用由vo1引用的对象。

 vo4 = vo1; 

因此,通过任何引用(无论是vo1还是vo4)对引用对象所做的任何更改都将反映到同一对象。

因此,如果你改变说vo4.setName(“xyz”),它将改变由vo4引用的对象,但实际上vo1也指的是同一个对象。 因此,在为一个对象分配的一个存储器位置进行改变,该对象由许多参考(在这种情况下为vo1和vo4)进行参考。

您正在为vo1vo4分配相同的对象引用。

 vo4 = vo1; 

现在两个引用变量都指向同一个对象。

在此处输入图像描述

Object是一个实体,它将为其中定义的字段存储实际值。对象将使用new关键字在内存中创建,引用将返回到引用变量。引用变量不是对象。 因此在您的示例中, new VO()将在堆内存上创建对象, VO1将引用它。

当你做vo4 = vo1; 你只vo1通过vo1来复制vo1vo4你会做一个指针分配,所以它们都分配到内存中的相同位置,如果vo1改变它也会影响vo4 ,就像你看到的结果一样

除了基本数据类型之外,java中的所有内容都是指针。 创建vo4 ,将其设置为等于vo1 。 现在vo4指向vo4

当你做vo4 = vo1 ,它意味着参考变量vo4指的是由vo1引用的对象。 所以vo1vo4都会引用相同的对象

阅读本教程的第一部分。 你不需要直到最后,因为它是关于垃圾收集,但它详细解释了如何为对象分配参考,以及它们是如何被分类的。

http://www.thejavageek.com/2013/06/22/how-do-objects-become-eligible-for-garbage-collection/

我必须准备以下图片:如你所见,vo1,Vo3,Vo4指向同一个物体

在此处输入图像描述