2014-09-19 50 views
2

剛開始學習Java,看到字符串和數組都是引用類型。 我不明白了以下問題:Java - 字符串和數組引用

String a = "a1"; 
    String b = "a2"; 
    a=b; 
    a = "rrr"; 

    System.out.println(a); 
    System.out.println(b); 

    int[] arr1 = {1,2,3}; 
    int[] arr2 = arr1; 
    arr2[0]= 19; 
    System.out.println(arr1[0]); 

當我打印出來,我得到:"rrr" "a2" 10

使用數組時 - 據我所知,他們都指向同一個對象,所以如果我改變細胞 - 我在arr1和arr2看到了不同。

關於「字符串」 - 根據我的理解,當我這樣做時:a = b它不應該是:「讓a指向與b指向的相同對象」 - 意思是如果我更改了它們都需要的被改變?

謝謝!

+0

這不是最有用的東西,但我想你會明白,你可以用'System.out.println(Arrays.toString(arr1));'打印一個數組。 – Pokechu22 2014-09-19 18:38:44

+1

開始區分_variables_,_reference values_和_instances_(對象)。 – 2014-09-19 18:45:50

+0

閱讀[this](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value)。 – 2014-09-19 18:47:34

回答

10

在數組情況下,您實際上正在修改數組,因此如果一個引用發生更改,另一個引用發生更改。

在字符串的情況下,你是修改對象時,只是分配不同目的是該引用。 正如您所指出的那樣:a=b的意思是「讓指向與b相同的對象指向」。遵循同樣的思路,a="rrr"的意思是「讓一個指向文字」rrr「」,這與b沒有任何關係。

1

因此,重新分配修改是不同的東西。

如果你有

String a = "foo"; 
String b = a; 

那麼你已經分配b指相同的對象a。 如果然後做

b = "bananas"; 

那麼你有沒有修改字符串,你有重新分配 B上它不再指同一對象a

在另一方面

int[] c = { 1, 2, 3 }; 
int[] d = c; 

在這裏我們再次d分配給指代相同的對象(一個陣列),爲c。如果你再這樣做:

d[0] = 10; 

那麼你修改陣列的內容,無論cd參考。

0

您有3個字符串對象和1個數組對象。
「A1」, 「A2」, 「RRR」
{1,2,3}的所有字符串的

String a = "a1"; // a points to a new object "a1" 
String b = "a2"; // b points to a new object "a2" 
a=b; // a points to b's object "a2" 
a = "rrr"; // a points to new object "rrr" 

System.out.println(a); // prints "rrr" to console 
System.out.println(b); // Prints "a2" to console 

int[] arr1 = {1,2,3}; // arr1 points to new array {1,2,3} 
int[] arr2 = arr1; // arr2 points to array in arr1 {1,2,3} 
arr2[0]= 19; // modifies the array arr2 points to {19, 2, 3} 
System.out.println(arr1[0]); // Prints "19" to console 
0

首先是不可變的。 Immutalbe意味着你不能改變對象本身,但你可以改變參考。 像你的情況 -

String a = "a1"; // a is a reference variable and point to new object with value "a1" 

    String b = "a2"; // b is a reference and point to new object with value "a2" 

    a=b; // now a is referencing same object as b is referencing, a and b value is "a2" 

    a = "rrr"; // at this time "rrr" is creating a new String object with value "rrr" and now a is pointing to this object. 

所以B仍指向「A2」,現在被指向新對象「RRR」。這就是爲什麼兩種打印不同的價值。

System.out.println(a); 
    System.out.println(b);