【问题标题】:Java class variables equal same valueJava 类变量等于相同的值
【发布时间】:2012-08-09 19:03:27
【问题描述】:

我正在准备认证考试,但我不明白此代码:

主要:

public class TestStudent {
    public static void main(String[] args) {
        Student bob = new Student();
        Student jian = new Student();
        bob.name = "Bob";
        bob.age = 19;
        jian = bob;
        jian.name = "Jian";
        System.out.println("Bob's Name: " + bob.name);
    }
}

类:

public class Student {
    public String name = "";
    public int age = 0;
    public String major = "Undeclared";
}

为什么会输出“Bob's Name: Jian”?

Bob.name 从未设置为 Jian。显然一定是因为“jian = bob;”但我认为这只会将 jian 变量设置为与 bob 相同。这个概念叫什么,它在 java 教程中的解释是什么?

【问题讨论】:

  • 我可以在 5 分钟内回答这个问题。谢谢大家的许多有用的回答。

标签: java class variables


【解决方案1】:

Java 中的赋值不复制对象,它们复制引用。完成此任务

jian = bob;

您的jian 不再指向您已分配并分配给jianStudent 对象,它与bob 相同,为同一对象创建别名 .原来的 jian 现在已经无法挽回地丢失,有资格进行垃圾回收。

以下评估

    jian.name = "Jian";

通过其jian 别名覆盖bob 变量中的名称,从而得到您所看到的结果。

【讨论】:

  • 那么无论我从那一点调用变量 (jian = bob;)、jian 还是 bob,它都引用同一个数据集?
  • @Quinma 是的,这是正确的。赋值后,两个变量都“指向”同一个Student 对象。
【解决方案2】:

看代码`"jian = bob;" 您更改了 bob 对象的引用并将其设置为 jian。
然后设置 jian.name = "Jian" 也会改变 bob 对象

【讨论】:

    【解决方案3】:

    现在您的 jian 对象引用指向与对象引用 bob 相同的内存部分,因此如果您更改其中一个 - 它会影响它们,因为现在它们是同一个对象。

    【讨论】:

      【解决方案4】:

      这是因为bobjian(就像java 中的所有非原始变量一样)是引用(指向对象的指针)而不是对象。所以当你说jian = bob; 时,这会使jian 指向与bob 相同的对象。

      【讨论】:

        【解决方案5】:

        这是 Java 中的一个基本概念:所有对象变量 - 即表示 Java 类实例的对象,例如 bobjian - 都是引用。这个概念在 C 等语言中也称为指针

        这意味着您的变量bob 在概念上并不保存nameagemajor 字段的值,而是指向内存中的某个位置保存数据。因此,当您将赋值运算符(即= 符号)与对象引用变量一起使用时,您只是在更改该变量指向的内存部分。所以这行:

        bob = jian
        

        表示变量bob 现在与jian 引用相同的内存区域,您在其中所做的任何事情都会反映在另一个中。

        这留下了一个有趣的问题,即保存 Bob 数据的内存区域发生了什么。由于我们不再有对它的引用,我们不再可能得到它,即使它仍然存在于内存中的某个地方(尽管 Java 很快会注意到并清除它 - 称为 garbage collection)。

        无论如何,这种概念最好用图表表达,所以我建议看at the official Java documentationthis tutorial

        【讨论】:

          【解决方案6】:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-29
            • 2013-02-18
            • 2022-07-04
            • 2021-11-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多