2012-06-01 111 views
3

我創建了下面的測試,看看Java的如何處理對象和它混淆了我不少。Java類的字段參考?

public class MyClass 
{ 
    public String text = "original"; 
    public MyClass(String text) 
    { 
     this.text = text; 
    } 
} 

然後我創建了以下2種情況:

1.

String object1 = new String("original"); 
String object2 = new String("original"); 
object2 = object1; 
object2 = "changed"; 
System.out.println(object1); 
System.out.println(object2); 

結果:

original 
changed 

2.

MyClass object1 = new MyClass("object1"); 
MyClass object2 = new MyClass("object2"); 
object2 = object1; 
object2.text = "changed"; 
System.out.println(object1.text); 
System.out.println(object2.text); 

結果:

changed 
changed 

現在爲什麼文本字段共享像一個靜態字段?

+2

@DyapaSrikanth:如果你要提供一個答案,請這樣做*爲*的答案 - 但最好這樣做是全英文版,而不是文本發言。 –

回答

7

現在爲什麼文本字段共享像一個靜態字段?

看這句話:

object2 = object1; 

這是設置object2變量的值是相同object1變量的值。這些變量值都是引用對象 - 它們本身不是對象。

所以這行後,這兩個變量都指的是同一個對象的值。如果您通過一個變量更改對象,您仍然可以通過其他變量看到更改。用現實世界的話來說:假設你有兩張紙,每張都有你的家庭住址,並將它們分給兩個不同的人。第一個去,並繪製你的前門紅色,然後第二個去拜訪你的房子 - 他們仍然會看到一個紅色的前鬥。

它以分離三個概念是非常重要的:

  • 對象
  • 變量
  • 參考

一個變量的值(或任何其它表達,實際上)是總是無論是原始值(intchar等)或參考。它的從來沒有整個對象。

改變一個變量從未價值的變化不同變量的值,所以在這裏:

String object1 = new String("original"); 
String object2 = new String("original"); 
object2 = object1; 
object2 = "changed"; 

...我們改變object2值一次具有相同的值作爲object1 ,然後有一個不同的值,指的是帶有「更改」文本的String對象。 永遠不會改變的object1值。

這是否幫助?如果沒有,請詢​​問非常具體的情況 - 最簡單的方法是選擇幾種不同的情況,而不是一概而論。

1

object2 = object1;在此之後object2指的是同一個對象object1指的是。

object2.text =「changed」;這裏的值爲文本變成改爲。既然object1object2指的是同一個對象,所以輸出是一樣的。

4

圖形表示來解釋這種行爲

步驟1.

MyClass object1 = new MyClass("object1"); 
MyClass object2 = new MyClass("object2"); 

步驟2.

object2 = object1; 

第三步。

object2.text = "changed"; 

enter image description here