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名称的简单类 ,包含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会自动更改.为什么会这样?
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,vo3和vo4都指向:
+-----+
| vo1 |----\
+-----+ \
\
+-----+ \ +----------------+
| vo3 |------------->| (object) |
+-----+ / | name = Abishek |
/ +----------------+
+-----+ /
| vo4 |----/
+-----+
+-----+ +----------------+
| vo2 |------------->| (object) |
+-----+ | name = Anil |
+----------------+
...等getName()上vo1,vo3或vo4会给你"Abishek."
因为vo1和vo4都指的是同一个对象.
下面的赋值使vo4引用由vo1引用的对象.
vo4 = vo1;
Run Code Online (Sandbox Code Playgroud)
因此,通过任何引用(无论是vo1还是vo4)对引用对象所做的任何更改都将反映到同一对象.
因此,如果你改变说vo4.setName("xyz"),它将改变由vo4引用的对象,但实际上vo1也指的是同一个对象.因此,在为一个对象分配的一个存储器位置进行改变,该对象由许多参考(在这种情况下为vo1和vo4)进行参考.
| 归档时间: |
|
| 查看次数: |
3916 次 |
| 最近记录: |