java中的对象和引用之间的区别与代码?

A B*_*sak 3 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

--OUTPUT是:---

Sourav

Abhishek.  Anil Abhishek. Abhishek.
Run Code Online (Sandbox Code Playgroud)

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会自动更改.为什么会这样?

T.J*_*der 24

我在vo4对象中保留了vo1对象的副本而不是引用.

不,你所指的变量vo1,并vo4同一个对象,就像这样:

+-----+
| vo1 |--------\
+-----+         \    +----------------+
                 --->| (object)       |
+-----+         /    | name = Abishek |
| vo4 |--------/     +----------------+
+-----+

让我们按照代码通过:

VO vo1 = new VO();
Run Code Online (Sandbox Code Playgroud)

给我们:

+-----+              +----------------+
| vo1 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+

然后:

VO vo2 = new VO();
Run Code Online (Sandbox Code Playgroud)

现在我们有:

+-----+              +----------------+
| vo1 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+

然后:

VO vo3;
Run Code Online (Sandbox Code Playgroud)

......这仅仅是创建vo3具有null(在任何物体没有指向).

然后:

VO vo4 = new VO();
Run Code Online (Sandbox Code Playgroud)

所以我们有:

+-----+              +----------------+
| vo1 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+
+-----+
| vo3 | (is null)
+-----+

+-----+              +----------------+
| vo4 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+

现在:

vo1.setName("Sourav");
vo2.setName("Anil");
Run Code Online (Sandbox Code Playgroud)

给我们:

+-----+              +----------------+
| vo1 |------------->| (object)       |
+-----+              | name = Sourav  |     *** change is here ***
                     +----------------+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = Anil    |     *** and here ***
                     +----------------+
+-----+
| vo3 | (is null)
+-----+

+-----+              +----------------+
| vo4 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+

事情变得有趣:

vo3 = vo1;
vo4 = vo1;
Run Code Online (Sandbox Code Playgroud)

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

+-----+
| vo1 |----\
+-----+     \
             \
+-----+       \      +----------------+
| vo3 |------------->| (object)       |
+-----+       /      | name = Sourav  |
             /       +----------------+
+-----+     /
| vo4 |----/
+-----+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = Anil    |
                     +----------------+

现在

System.out.println(" " + vo4.getName());
Run Code Online (Sandbox Code Playgroud)

......按照你的期望给我们"Sourav".

然后

 vo1.setName("Abhishek.");
Run Code Online (Sandbox Code Playgroud)

......改变了对象vo1,vo3vo4都指向:

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

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = Anil    |
                     +----------------+

...等getName()vo1,vo3vo4会给你"Abishek."

  • 漂亮的ascii艺术! (6认同)
  • @ABasak:如果以上(或任何其他答案)*回答*您的问题,Stack Overflow的工作方式,您可以通过点击旁边的复选标记"接受"答案.更多:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work (2认同)

zer*_*ool 6

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

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

vo4 = vo1;
Run Code Online (Sandbox Code Playgroud)

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

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