2010-08-16 4 views
0

객체가 그대로 사용되는 동안 메소드의 매개 변수로 사용되는 프리미티브가 해당 값의 복사본을 수행하는 이유를 알려주십시오.메소드의 객체 및 프리미티브

+0

상세한 설명은 http://stackoverflow.com/questions/40480/is-java-pass-by-reference를 참조하십시오 도움이되기를 바랍니다. –

답변

6

자바에서는 모든 인수가 값으로 전달되지만 참조 유형 (즉, 프리미티브 이외의 모든 것)의 경우 변수 값은 객체 자체가 아닙니다. 객체에 대한 참조입니다. 따라서 참조이 메소드의 매개 변수에 복사되므로 동일한 객체를 참조합니다. 이것은 단지 메소드 호출에 적용되지 않습니다

참고 :

StringBuilder x = new StringBuilder(); 
StringBuilder y = x; // Copy the value of x, which is a *reference* 

y.append("Hello"); 
System.out.println(x); // Prints "Hello" 
여기

, xy은 별도의 변수를 있는데도, 같은 객체를 참조하십시오. 따라서 해당 객체의 내용이 y 변수를 통해 append 호출을 통해 변경되면 x 변수를 통해 변경 내용을 볼 수 있습니다.

저는 누군가에게 집 주소를주는 것과 조금 같다고 생각합니다. 두 사람에게 집 주소를 알려주고 그 중 한 명이 빨간색으로 칠하면 두 번째 사람이 집을 방문 할 때, 빨간 문도 보일거야. 나는 그 (것)들에게 나의 집 자체를주지 않는다, 나는 그 (것)들에게 나의 집에 얻기의 방법을주고있다.

유감스럽게도 일부는 클레임인데, 객체는 Java에서 참조로 전달됩니다. 그들은 위에서 말했듯이 참조가 가치에 의해 전달됩니다. Scott Stanchfield는 good article about this을 보유하고 있습니다.

1

Jon Skeet이 말한 것을 확장하면 기본 유형은 일반적으로 매우 작습니다. 이중 크기는 8 바이트입니다. 반면에 객체는 거대 할 수 있으므로 참조를 전달하면 시간과 스택 공간을 절약하고 전체를 복사 할 수 있습니다. 이것에 의해, 오브젝트의 내용을 변경할 수 있습니다.

1

그게 닮았지 만 그렇지 않습니다. Java는 항상 값으로 전달됩니다.

당신은 이런 식으로 뭔가를 선언 할 때 :

Date aDate = new Date(); 

변수 aDate 정말 개체하지만, 객체 참조하지 않습니다. 객체 참조를 다른 메소드에 전달하면 해당 참조의 "사본"이 전달됩니다 (값의 사본이 전달 된 프리미티브와 마찬가지로)

이제이 두 사본이 동일한 언더 레이 객체를 참조하기 때문에, 그 중 하나에서 메시지를 보내는 것이 다른 것에 영향을주는 것을 볼 수 있지만, 새로운 것을 할당하기 위해 참조를 변경하면 다른 하나는 변경되지 않습니다. 예를 들어

:

class Some { 
    int data = 0; 
} 

class Other { 
    void doSomething(Some o) { 
     o.data = 10; 
    } 
    void change(Some a) { 
     a = new Some(); 
     a.data = 1024; 
    } 
} 
class Main { 
    public static void main(String [] args) { 
     // create an object and get its object reference 
     Some original = new Some(); 
     System.out.println(original.data); // prints 0 

     // now pass it to a method from the class "Other" 
     Other o = new Other(); 
     other.doSomething(original); 


     System.out.println(original.data); // prints 10, because data was changed in "doSomething" 


     // To probe that the reference is not passed, but a copy of it 
     // invoke the "change" method. 
     other.change(original); 

     System.out.println(original.data); // remains 10, instead of 1024. 

     // the value 1024 was changed in the new reference, and the one passed along 
     // didn't change. It still refers to the original object. 
    } 
} 

나는이

관련 문제