2014-09-19 3 views
2

자바를 배우기 시작한 순간, 문자열과 배열이 참조 유형이라는 것을 알게되었습니다. 나는 다음과 같은 문제를 이해하지 않습니다자바 - 문자열 및 배열 참조

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를 : "b와 같은 개체에 대한 a 포인트가 가리키는하자"- 의미 나는 그들이 모두도 할 필요가 있다는을 변경하는 경우 변경 되나요?

감사합니다.

+0

이것은 가장 유용한 것은 아니지만'System.out.println (Arrays.toString (arr1)); '을 사용하여 배열을 인쇄 할 수 있다는 것을 알고 있으면 감사히 생각합니다. – Pokechu22

+1

_variables_, _reference values_ 및 _instances_ (개체)를 구별합니다. –

+0

[this] (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value)를 읽으십시오. –

답변

10

배열의 경우 실제로 배열을 수정하고 있으므로 하나의 참조가 변경되면 다른 배열도 변경됩니다. 문자열의 경우

, 당신은 객체를 수정 하지, 당신은 단순히 참조에 다른 객체를 할당하고 있습니다. 언급했듯이 : a=b은 "b가 가리키는 것과 동일한 대상을 가리 키도록하십시오"를 의미합니다. 같은 생각을 한 후에, a="rrr"은 "문자 그대로"rrr "을 가리킨다. 이것은 b와 아무런 관련이 없다.

1

따라서 재 할당수정과 다른 점입니다.

ba와 같은 객체를 참조 할 을 할당하면

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

이있는 경우 다음있다. 당신이 다음

b = "bananas"; 

는 다음 문자열을 수정하지 않으면 , 당신은 더 이상 a와 같은 객체를 참조되도록 B를 재 할당 없다. 한편 다시 우리 c 같은 객체 (배열)를 참조 d을 할당 한 다음

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

에서

. 당신은 다음과 같은 일을 할 경우
d[0] = 10; 

는 당신은 cd 모두가 참조하는 배열의
내용을 수정 이다.

0

3 개의 문자열 개체와 1 개의 배열 개체가 있습니다.
"A1", 문자열의 모든

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

첫째는 불변 "RRR"
{1,2,3} "A2". 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);