3
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());
    }
}

--输出是:---

Sourav

Abhishek.  Anil Abhishek. Abhishek.

VO 是一个简单的类,包含 字符串名称并包含gettersetter

在第一个System.out.println * vo4.getName() * print : Sourav好的。没关系。

但在第二个System.out.println * vo4.getName() * print : Abhishek。

我的问题是为什么第二版是Abhishek。. 我在 vo4 对象中保留了 vo1 对象的副本,而不是参考。这意味着它创造了一个新的记忆。vo1 和 vo4 是不同的。那么为什么 vo4.getName 在第二次更改。我正在设置 vo1 对象,但 vo4 会自动更改。为什么会这样??

4

8 回答 8

26

我在 vo4 对象中保留了 vo1 对象的副本,而不是参考。

不,您已将变量指向同vo1一个对象,如下所示:vo4

+-----+
| vo1 |--------\
+-----+ \ +----------------+
                 --->| (对象) |
+-----+ / | 姓名 = 阿比舍克 |
| vo4 |--------/ +----------------+
+-----+

让我们通过以下代码:

VO vo1 = new VO();

给我们:

+-----+ +----------------+
| vo1 |-------------->| (对象) |
+-----+ | 名称 = 空 |
                     +----------------+

然后:

VO vo2 = new VO();

现在我们有:

+-----+ +----------------+
| vo1 |-------------->| (对象) |
+-----+ | 名称 = 空 |
                     +----------------+

+-----+ +----------------+
| vo2 |-------------->| (对象) |
+-----+ | 名称 = 空 |
                     +----------------+

然后:

VO vo3;

...它只是vo3null(不指向任何对象)创建。

然后:

VO vo4 = new VO();

所以我们有:

+-----+ +----------------+
| vo1 |-------------->| (对象) |
+-----+ | 名称 = 空 |
                     +----------------+

+-----+ +----------------+
| vo2 |-------------->| (对象) |
+-----+ | 名称 = 空 |
                     +----------------+
+-----+
| vo3 | (一片空白)
+-----+

+-----+ +----------------+
| vo4 |------------->| (对象) |
+-----+ | 名称 = 空 |
                     +----------------+

现在:

vo1.setName("Sourav");
vo2.setName("Anil");

给我们:

+-----+ +----------------+
| vo1 |-------------->| (对象) |
+-----+ | 姓名 = 苏拉夫 | ***变化就在这里***
                     +----------------+

+-----+ +----------------+
| vo2 |-------------->| (对象) |
+-----+ | 姓名 = 阿尼尔 | *** 和这里 ***
                     +----------------+
+-----+
| vo3 | (一片空白)
+-----+

+-----+ +----------------+
| vo4 |------------->| (对象) |
+-----+ | 名称 = 空 |
                     +----------------+

这就是事情变得有趣的地方:

vo3 = vo1;
vo4 = vo1;

指向vo3同一个对象vo1,也指向vo4该对象,释放vo4用于指向的对象(这变得有资格进行垃圾收集)。给我们:

+-----+
| vo1 |----\
+-----+ \
             \
+-----+ \ +----------------+
| vo3 |------------->| (对象) |
+-----+ / | 姓名 = 苏拉夫 |
             / +----------------+
+-----+ /
| vo4 |----/
+-----+

+-----+ +----------------+
| vo2 |-------------->| (对象) |
+-----+ | 姓名 = 阿尼尔 |
                     +----------------+

现在

System.out.println(" " + vo4.getName());

...如您所料,给了我们“Sourav”。

然后

 vo1.setName("Abhishek.");

...更改vo1vo3vo4都指向的对象:

+-----+
| vo1 |----\
+-----+ \
             \
+-----+ \ +----------------+
| vo3 |------------->| (对象) |
+-----+ / | 姓名 = 阿比舍克 |
             / +----------------+
+-----+ /
| vo4 |----/
+-----+

+-----+ +----------------+
| vo2 |-------------->| (对象) |
+-----+ | 姓名 = 阿尼尔 |
                     +----------------+

...等等,,或者会给你“Abishek” getName()vo1vo3vo4

于 2013-07-12T07:54:35.457 回答
6

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

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

vo4 = vo1;

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

因此,如果您更改 vo4.setName("xyz"),它会更改 vo4 引用的对象,但实际上 vo1 也引用同一个对象。因此,在为一个对象分配的一个内存位置进行更改,该对象被许多引用(在本例中为 vo1 和 vo4)引用。

于 2013-07-12T07:54:23.800 回答
2

vo1您正在为和分配相同的对象引用vo4

vo4 = vo1;

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

在此处输入图像描述

于 2013-07-12T07:55:30.773 回答
1

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

于 2013-07-12T08:09:34.950 回答
0

当您这样做时,您只需通过引用进行vo4 = vo1;复制,换句话说,您进行指针分配,因此它们都分配到内存中的相同位置,这会导致如果更改也会影响,如您看到的结果vo1vo4vo1vo4

于 2013-07-12T07:55:55.173 回答
0

Java中除了基本数据类型之外的所有东西都是指针。创建后将vo4其设置为vo1。现在vo4指向v01

于 2013-07-12T07:55:57.883 回答
0

当你这样做时vo4 = vo1,这意味着引用变量vo4正在引用所引用的对象vo1。所以两者都vo1vo4引用同一个对象

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

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

于 2013-07-12T07:56:31.890 回答
0

我要准备下图:如你所见vo1、Vo3、Vo4指向同一个物体

在此处输入图像描述

于 2013-07-12T08:19:08.153 回答