2012-08-09 123 views
1

我正在準備認證考試,我不明白這個代碼: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

回答

3

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

1

現在您的jian對象參考點與對象引用bob相同的內存部分,所以如果您更改其中一個 - 它會影響它們兩個,因爲它們現在是同一個對象。

2

看代碼`「jian = bob;」 您更改了bob對象的引用並將其設置爲jian。
然後設置jian.name =「劍」也改變了鮑勃對象

1

這是因爲bobjian(如Java中的所有非原始變量)的(對象指針)的引用,而不是對象。因此,當您說jian = bob;時,這使得jian指向與bob相同的對象。

1

這是Java中的一個基本概念:所有對象變量 - 也就是說,對象,如bobjian代表Java類的實例 - 是參考文獻。這個概念在C語言中也被稱爲指針

這意味着您的變量bob不,在概念上,按住nameagemajor字段的值,而是內存中的位置,其保存數據。因此,當您使用賦值運算符(即符號=)和對象引用變量時,您只需更改該變量指向的內存部分即可。因此該行:你在一個做

bob = jian 

意味着變量bob現指的內存相同面積jian,而且什麼都將反映在其他。

這留下了一個感興趣的問題,發生了什麼事情發生在保存鮑勃的數據的內存區域。由於我們不再提及它,即使它仍然存在於內存中某處(雖然Java很快會注意到並清除它 - 稱爲垃圾回收),但我們不再可能掌握它。

無論如何,這種概念更好地用圖表表示,所以我建議看看at the official Java documentationthis tutorial