Java类变量等于相同的值
我正在准备认证考试,我不明白这个代码:Java类变量等于相同的值
主营:
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教程中解释了什么?
Java中的赋值不复制对象,它们复制引用。这种分配
jian = bob;
你jian
不再指向您已经分配并指定给jian
的Student
对象后,这是一样的bob
,创建一个别名同一个对象。原来的jian
现在已经无法挽回地丢失了,有资格进行垃圾回收。
以下assingment
jian.name = "Jian";
通过其jian
别名将覆盖bob
变量名,导致您看到的结果。
因此,无论我是否从(jian = bob;),jian或bob上的那个点调用该变量,都会引用相同的数据集? – Quinma 2012-08-09 19:11:52
@Quinma是的,这是正确的。赋值后,两个变量都“指向”相同的“学生”对象。 – dasblinkenlight 2012-08-09 19:12:50
现在您的jian
对象参考点与对象引用bob
相同的内存部分,所以如果您更改其中一个 - 它会影响它们两个,因为它们现在是同一个对象。
看代码`“jian = bob;” 您更改了bob对象的引用并将其设置为jian。
然后设置jian.name =“剑”也改变了鲍勃对象
这是因为bob
和jian
(如Java中的所有非原始变量)的(对象指针)的引用,而不是对象。因此,当您说jian = bob;
时,这使得jian
指向与bob
相同的对象。
这是Java中的一个基本概念:所有对象变量 - 也就是说,对象,如bob
和jian
代表Java类的实例 - 是参考文献。这个概念在C语言中也被称为指针。
这意味着您的变量bob
不,在概念上,按住name
,age
和major
字段的值,而是点内存中的位置,其保存数据。因此,当您使用赋值运算符(即符号=
)和对象引用变量时,您只需更改该变量指向的内存部分即可。因此该行:你在一个做
bob = jian
意味着变量bob
现指的内存相同面积jian
,而且什么都将反映在其他。
这留下了一个感兴趣的问题,发生了什么事情发生在保存鲍勃的数据的内存区域。由于我们不再提及它,即使它仍然存在于内存中某处(虽然Java很快会注意到并清除它 - 称为垃圾回收),但我们不再可能掌握它。
无论如何,这种概念更好地用图表表示,所以我建议看看at the official Java documentation或this tutorial。
我可以在5分钟内回答。谢谢大家的许多有益的答案。 – Quinma 2012-08-09 19:13:46