4

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

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

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

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

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

4

3 回答 3

8

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

看看这一行:

object2 = object1;

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

所以在那一行之后,两个变量的值都指向同一个对象。如果您通过一个变量更改对象,您仍然会通过另一个变量看到该更改。用现实世界的话来说:假设你有两张纸条,每张纸条上都有你的家庭住址,然后把它们交给两个不同的人。第一个去把你的前门涂成红色,然后第二个去参观你的房子——他们仍然会看到一个红色的前门。

区分三个概念非常重要:

  • 对象
  • 变量
  • 参考

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

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

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

...我们将object2once 的值更改为与 相同的值object1,然后更改为不同的值,指的是String带有文本“已更改”的对象。这永远不会改变object1.

这有帮助吗?如果不是,请询问非常具体的案例 - 最简单的方法是详细区分几种情况而不是一概而论。

于 2012-06-01T08:30:16.583 回答
4

用于解释此行为的图示

第1步。

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

第2步。

object2 = object1;

第三步。

object2.text = "changed";

在此处输入图像描述

于 2012-06-01T10:55:47.917 回答
1

对象2 =对象1;在此object2引用 object1所引用的同一对象之后。

object2.text = "改变"; 这里text的值发生了变化。现在由于object1object2都引用同一个对象,所以输出是相同的。

于 2012-06-01T08:35:10.763 回答