1

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

主要的:

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

4

6 回答 6

3

Java 中的赋值不复制对象,它们复制引用。在这个任务之后

jian = bob;

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

下面的赋值

    jian.name = "Jian";

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

于 2012-08-09T19:05:57.313 回答
2

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

于 2012-08-09T19:06:27.580 回答
1

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

于 2012-08-09T19:06:21.340 回答
1

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

于 2012-08-09T19:08:07.963 回答
1

这是 Java 中的一个基本概念:所有对象变量(即表示 Java 类实例的对象)bob都是引用。这个概念在诸如 C 之类的语言中也被称为指针。jian

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

bob = jian

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

这就留下了一个有趣的问题,即保存 Bob 数据的内存区域发生了什么。由于我们不再拥有对它的引用,因此我们不再可能获取它,即使它仍然存在于内存中的某个位置(尽管 Java 很快会注意到并清除它 - 称为垃圾收集)。

无论如何,这种概念最好用图表来表达,所以我建议查看官方 Java 文档本教程

于 2012-08-09T19:17:47.817 回答
0

变量 bob 和 jian 是对象引用。请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

本文包含与您类似的示例:http: //www.informit.com/articles/article.aspx? p=174371&seqNum=4

于 2012-08-09T19:08:47.197 回答