【问题标题】:Java class fields by reference?引用的Java类字段?
【发布时间】:2012-06-01 08:27:12
【问题描述】:

我创建了以下测试来了解 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

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

【问题讨论】:

  • @DyapaSrikanth:如果您要提供答案,请作为答案提供 - 但最好使用完整的英语,而不是文字。
  • 尝试真正学习 C 或 C++,你会理解任何其他编程语言...这是一个简单的对象引用问题...

标签: java object reference static field


【解决方案1】:

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

看看这一行:

object2 = object1;

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

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

区分三个概念很重要:

  • 对象
  • 变量
  • 参考文献

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

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

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

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

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

【讨论】:

    【解决方案2】:

    解释这种行为的图示

    第 1 步。

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

    第 2 步。

    object2 = object1;
    

    第三步。

    object2.text = "changed";
    

    【讨论】:

      【解决方案3】:

      object2 = object1; 在此之后 object2 指的是 object1 指的是同一个对象。

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

      【讨论】:

        猜你喜欢
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 2012-07-19
        • 2018-09-21
        • 1970-01-01
        • 1970-01-01
        • 2018-08-19
        相关资源
        最近更新 更多