Joh*_*ost 3 java static field reference object
我创建了以下测试,以了解Java如何处理对象,这让我感到困惑.
public class MyClass
{
public String text = "original";
public MyClass(String text)
{
this.text = text;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了以下两个场景:
1.
String object1 = new String("original");
String object2 = new String("original");
object2 = object1;
object2 = "changed";
System.out.println(object1);
System.out.println(object2);
Run Code Online (Sandbox Code Playgroud)
结果:
original
changed
Run Code Online (Sandbox Code Playgroud)
2.
MyClass object1 = new MyClass("object1");
MyClass object2 = new MyClass("object2");
object2 = object1;
object2.text = "changed";
System.out.println(object1.text);
System.out.println(object2.text);
Run Code Online (Sandbox Code Playgroud)
结果:
changed
changed
Run Code Online (Sandbox Code Playgroud)
现在为什么文本字段像静态字段一样被共享?
现在为什么文本字段像静态字段一样被共享?
看看这一行:
object2 = object1;
Run Code Online (Sandbox Code Playgroud)
这是将object2
变量的值设置为与变量的值相同object1
.这些变量值都是对象的引用 - 它们本身不是对象.
因此,在该行之后,两个变量都具有引用同一对象的值.如果您通过一个变量更改对象,您仍将通过另一个变量看到该更改.用现实世界的术语来说:假设你有两张纸,每张都有你的家庭住址,并把它们交给两个不同的人.第一个去你的前门涂红色,然后第二个去看你的房子 - 他们仍然会看到一个红色的前门.
将三个概念分开是非常重要的:
一个变量的值(或任何其它表达,实际上)是始终或者是原始值(int
,char
等)或参考.它永远不是一个完整的对象.
更改一个变量的值永远不会更改另一个变量的值,所以这里:
String object1 = new String("original");
String object2 = new String("original");
object2 = object1;
object2 = "changed";
Run Code Online (Sandbox Code Playgroud)
...我们将object2
一次的值更改为具有相同的值object1
,然后使用不同的值,引用String
具有"已更改"文本的对象.这永远不会改变它的价值object1
.
这有帮助吗?如果没有,请询问非常具体的情况 - 最简单的选择细节而不是概括.