gpt4 book ai didi

java - 带有代码的java中对象和引用之间的区别?

转载 作者:搜寻专家 更新时间:2023-11-01 03:57:26 27 4
gpt4 key购买 nike

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 是一个包含String namegettersetter 的简单类。

在第一个System.out.println *vo4.getName()* 打印:Sourav ok.It's fine.

但是在第二个 System.out.println *vo4.getName()* 打印:Abhishek.

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

最佳答案

I have kept a copy of vo1 object in vo4 object not a reference.

不,您已将变量 vo1vo4 指向相同 对象,如下所示:

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

Let's follow the code through:

VO vo1 = new VO();

给我们:

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

Then:

VO vo2 = new VO();

现在我们有:

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

Then:

VO vo3;

...它只是用 null 创建了 vo3(不指向任何对象)。

然后:

VO vo4 = new VO();

所以我们有:

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

Now:

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

给我们:

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

Here's where things get interesting:

vo3 = vo1;
vo4 = vo1;

vo3 指向 vo1 指向的同一对象,并将 vo4 指向该对象,释放 对象 vo4 曾经指向(它有资格进行垃圾回收)。给我们:

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

Now

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

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

然后

 vo1.setName("Abhishek.");

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

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

...因此 vo1vo3vo4 上的 getName() 将为您提供“阿比谢克。”

关于java - 带有代码的java中对象和引用之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17610088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com