2012-07-07 3 views
0

나는 이해할 수없는 것을 발견 했으므로 실현 될 수 없다는 것을 깨달았습니다.Java가 메소드의 매개 변수를 전달할 수있는 방법은 무엇입니까?

나는 안드로이드의 코드 블록으로 장난, 어떤 날 흥미 것은이이었다 :

public boolean onTouch(View v, MotionEvent event){ 
    Rect outRect = new Rect(); 
    _btn.getHitRect(outRect); 
    // ... rest of code cut 
    // outRect fields of that Rect object is 'filled' in. 
} 

안드로이드의 자바 직접적으로 메서드에 전달 된 Rect 객체 outRect을 수정할 수 있는지 방법 버튼 위젯의 Rect을 얻기 위해서. 내가 값에 의한 '통화 별 기준'이 아니라, 그 '통과를 사용하여, 자바 용어로 자바'참조에 의해 패스 '같은 건 없었다 생각으로, 나를 놀라게

'또는' 전화 걸 때 '?

예, 이전에 물어 본 question을 읽었지만 문제가 발생했거나 안드로이드일까요?

누구든지이 문제에 대해 의견을 개진 할 수 있습니까?

+0

이미지를 추가했습니다. 아마도 도움이됩니다. – Ixx

+0

답변 해 주셔서 감사합니다. 대단히 감사합니다. :) +1을 내게서 : – t0mm13b

+0

내 대답은 여기 좀 봐 : http://stackoverflow.com/questions/9404625/java-pass-by-reference/9404727#9404727 –

답변

3

outRect 참조가 getHitRect 메서드로 전달되고이 메서드는 outRect이라는 개체를 수정합니다. 참조는 가치에 의해 전달됩니다. http://javadude.com/articles/passbyvalue.htm

+0

그건 좀 혼란 스럽네요. "레퍼런스가 가치에 의해 전달된다"는 말, 다른 말로하면? (좋은 연결 고리 - 즐겨 찾기 - 환호 친구) – t0mm13b

+0

참조 (주소) 자체는 사본이므로 같은 주소입니다. 그래서 그것은 같은 대상을 가리 킵니다. – Ixx

+1

@ t0mm13b 그래 맞아! "outRect'라는 이름은 실제로 객체에 대한 참조의 이름입니다. 그 참조는'getHitRect' 메쏘드에 값으로 전달됩니다 (즉, 복사됩니다). 그리고 나서'outRect'에 의해 참조 된 동일한 객체에 대한 그것 자신의 참조를가집니다. 주의해야 할 중요한 점은'outRect'에 의해 참조 된 OBJECT는 전달되지 않고 단지 그것에 대한 참조이다. –

4

개체의 경우 주소는 값이며 프리미티브 값과 유사하게 값이 복사됩니다. 그러나 객체를 가리키는 값이며 객체는 복사되지 않습니다. 메모리에 단 한 번만 존재하며 조작 할 수 있습니다. enter image description here

+1

이것은 잘못되었습니다. 객체는 * 전달되지 않습니다. 참조가 전달되고 메커니즘은 가치가 있습니다. 그것은 의미 이상입니다. – duffymo

+0

그게 무슨 뜻인지, 그것을 잘못 표현했을 뿐이야. – Ixx

+0

나는이 답변을 한 번 이상 upvote 수 :) 소원 감사합니다 :) – t0mm13b

1

사각형 객체에 대한 참조를 값에 의해 전달되지만 업데이트 할 수 있도록 사각형 개체 자체가 힙에 할당된다

이에 대한 자세한 설명은

이 문서를 참조하십시오. 결과적으로 이는 참조로 전달되는 의미를 제공합니다. 그러나 참조를 변경할 수는 없습니다. 즉, 이런 식으로 뭔가가 작동하지 않습니다 :

public void someFunction(Rect r) { 
    r = new Rect(); // will not be seen by the calling function 
} 
1

당신이 링크 된 질문에 대한 가장 높은 등급의 대답은 꽤 명확하게 설명합니다

자바는 항상 패스에 의해 값입니다. Java가 객체를 값으로 전달 된 참조로 전달한다는 것을 이해하는 것이 어려운 일입니다.

그런 다음 당신을 놀라게 무슨 내가 오해하지 않았다면에 대해 요구하고있는 행동에 어떤 신비를 떠나 두 가지 예를 보여 계속된다.

+0

C/C++ 배경에서 왔을 때 - 저를 놀라게했습니다. D하지만, 저에게서 +1 예를 들어 보았습니다. :) – t0mm13b

1

Java의 메소드에 대한 모든 매개 변수는 프리미티브 및 객체 값에 의해 전달됩니다. 그러나 객체가 Java에서 참조되는 방식은 값보다 C++ 포인터에 더 가깝습니다. 예를 들어, Java의 모든 객체 값이 null 값을 가질 수 있지만 C++에서만 포인터는 make null 값을 사용합니다 (반면 객체 및 참조는 항상 유효한 초기화 값 임).

하지만 개체 값에 대한 전달 값은 실제로 무엇을 의미합니까? 이것은 객체의 사본을 생성하고 그것을 호출 할 메소드의 스택에 밀어 넣는 것을 의미합니다. 포인터의 경우 포인터 값을 스택에 푸시하는 것을 의미합니다.그런 식으로 호출하는 메소드와 호출 된 메소드 모두 객체 값이 저장된 동일한 메모리 위치에 액세스 할 수 있습니다. 따라서 호출 된 메소드에서 수행 된 모든 변경 사항이 호출 메소드에 반영됩니다.

* 참조가 손상된 데이터를 포함 할 수있는 경우가 있습니다.

관련 문제