Java类变量等于相同的值

时间:2012-08-09 19:03:28

标签: java class variables

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

主:

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的名字:Jian”?

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

6 个答案:

答案 0 :(得分:3)

Java中的赋值不复制对象,它们复制引用。完成此作业后

jian = bob;

您的jian不再指向已分配并分配给Student的{​​{1}}对象,它与jian相同,创建别名到同一个对象。原来bob现在已经无可挽回地丢失,有资格进行垃圾收集。

以下的分配

jian

通过 jian.name = "Jian"; 别名覆盖bob变量中的名称,从而得到您看到的结果。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

这意味着您的变量bob在概念上不包含nameagemajor字段的值,而是到内存中保存数据的位置。因此,当您使用带有对象引用变量的赋值运算符(即=符号)时,您只需更改变量指向的内存部分。这一行:

bob = jian

表示变量bob现在将相同的内存区域称为jian,而您在其中执行的任何内容都会反映在另一个内容中。

这留下了一个感兴趣的问题,即存在Bob的数据的内存区域发生了什么。由于我们不再引用它,我们不再可能掌握它,即使它仍然存在于内存中(尽管Java很快会注意到它并将其清除 - 称为垃圾收集< / em>的)。

无论如何,这种概念更好地以图解方式表达,因此我建议您查看at the official Java documentationthis tutorial

答案 5 :(得分:0)