Java类字段通过引用?

时间:2012-06-01 08:27:12

标签: java object reference static field

我创建了以下测试,以了解Java如何处理对象,这让我感到困惑。

public class MyClass
{
    public String text = "original";
    public MyClass(String text)
    {
        this.text = text;
    }
}

然后我创建了以下两个场景:

1

String object1 = new String("original");
String object2 = new String("original");
object2 = object1;
object2 = "changed";
System.out.println(object1);
System.out.println(object2);

结果:

original
changed

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);

结果:

changed
changed

现在为什么文本字段像静态字段一样共享?

3 个答案:

答案 0 :(得分:7)

  

现在为什么文本字段像静态字段一样共享?

看看这一行:

object2 = object1;

这是将object2变量的值设置为与object1变量的值相同。这些变量值都是对象的引用 - 它们本身不是对象。

因此在该行之后,两个变量都具有引用同一对象的值。如果您通过一个变量更改对象,您仍将通过另一个变量看到该更改。用现实世界的术语来说:假设你有两张纸,每张都有你的家庭住址,并把它们交给两个不同的人。第一个去你的前门涂红色,然后第二个去看你的房子 - 他们仍然会看到一个红色的前门。

将三个概念分开是非常重要的:

  • 物件
  • 变量
  • 参考

变量(或任何其他表达式,实际上)的值始终是原始值(intchar等)或引用。它从不整个对象。

更改一个变量从不的值会更改另一个变量的值,所以这里:

String object1 = new String("original");
String object2 = new String("original");
object2 = object1;
object2 = "changed";

...我们将object2的值更改为与object1具有相同的值,然后使用不同的值,引用String对象文字“改变了”。 永远不会改变object1 的价值。

这有帮助吗?如果没有,请询​​问非常具体的情况 - 最简单的选择几种情况而不是概括。

答案 1 :(得分:4)

用于解释此行为的图示表示

第1步。

MyClass object1 = new MyClass("object1");
MyClass object2 = new MyClass("object2");

第2步。

object2 = object1;

Step3。

object2.text = "changed";

enter image description here

答案 2 :(得分:1)

object2 引用 object1 引用的同一个对象之后,

object2 = object1;

object2.text =“已更改”; 此处文字的值变为已更改。现在, object1 object2 都引用同一个对象,因此输出相同。