我正在准备认证考试,我不明白这段代码:
主:
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教程中解释了什么?
答案 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)
那是因为bob
和jian
(就像java中的所有非原始变量一样)是引用(指向对象的指针)而不是对象。因此,当您说jian = bob;
时,jian
指向与bob
相同的对象。
答案 4 :(得分:1)
这是Java中的一个基本概念:所有对象变量 - 即表示Java类实例的bob
和jian
等对象 - 是参考。这个概念在C等语言中也被称为指针。
这意味着您的变量bob
在概念上不包含name
,age
和major
字段的值,而是点到内存中保存数据的位置。因此,当您使用带有对象引用变量的赋值运算符(即=
符号)时,您只需更改变量指向的内存部分。这一行:
bob = jian
表示变量bob
现在将相同的内存区域称为jian
,而您在其中执行的任何内容都会反映在另一个内容中。
这留下了一个感兴趣的问题,即存在Bob的数据的内存区域发生了什么。由于我们不再引用它,我们不再可能掌握它,即使它仍然存在于内存中(尽管Java很快会注意到它并将其清除 - 称为垃圾收集< / em>的)。
无论如何,这种概念更好地以图解方式表达,因此我建议您查看at the official Java documentation或this tutorial。
答案 5 :(得分:0)