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教程中解释了什么?

+0

我可以在5分钟内回答。谢谢大家的许多有益的答案。 – Quinma 2012-08-09 19:13:46

Java中的赋值不复制对象,它们复制引用。这种分配

jian = bob; 

jian不再指向您已经分配并指定给jianStudent对象后,这是一样的bob,创建一个别名同一个对象。原来的jian现在已经无法挽回地丢失了,有资格进行垃圾回收。

以下assingment

jian.name = "Jian"; 

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

+0

因此,无论我是否从(jian = bob;),jian或bob上的那个点调用该变量,都会引用相同的数据集? – Quinma 2012-08-09 19:11:52

+0

@Quinma是的,这是正确的。赋值后,两个变量都“指向”相同的“学生”对象。 – dasblinkenlight 2012-08-09 19:12:50

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

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

这是因为bobjian(如Java中的所有非原始变量)的(对象指针)的引用,而不是对象。因此,当您说jian = bob;时,这使得jian指向与bob相同的对象。

这是Java中的一个基本概念:所有对象变量 - 也就是说,对象,如bobjian代表Java类的实例 - 是参考文献。这个概念在C语言中也被称为指针

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

bob = jian 

意味着变量bob现指的内存相同面积jian,而且什么都将反映在其他。

这留下了一个感兴趣的问题,发生了什么事情发生在保存鲍勃的数据的内存区域。由于我们不再提及它,即使它仍然存在于内存中某处(虽然Java很快会注意到并清除它 - 称为垃圾回收),但我们不再可能掌握它。

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