2009-07-10 1 views
3

는 그냥 빨리 매개 변수를 자바로 전달되는 방법에 대한 질문 ...이 경우Java 함수 매개 변수는 항상 값에 의해 전달됩니까? 그 값은 새로운 StringBuffer를 변경 한 (버퍼 (단정()에 매개 변수로 사용)

 
... 
      if ((index = stdout.indexOf(pattern)) != -1) { 
       tidy(stdout, index + pattern.length()); 
       return true; 
      } else if ((index = stderr.indexOf(pattern)) != -1) { 
       tidy(stderr, index + pattern.length()); 
       return true; 
... 

    private void tidy(StringBuffer buffer, int i) { 
     logger.info("Truncating buffer: " + buffer); 
     buffer = new StringBuffer(buffer.substring(i)); 
     logger.info("Buffer now: " + buffer); 
    } 

, 표준 출력됩니다 및 stderr. substring (i))? 내 가정은 그들이 객체 변수 (객체 포인터)가 항상 전달된다는 것입니다.

+0

예를 들어 심층적 인 설명이 필요합니다. http://javadude.com/articles/passbyvalue.htm – akf

+6

이 게시물을 참조하십시오. http://stackoverflow.com/questions/40480/is-java-pass- 참조로 – akf

답변

14

여기에 무슨 일이 일어나고 있는지 알 수 없으므로 개체 참조는 값으로 전달됩니다 (참조 사본이 만들어 짐). 그래서 깔끔하게 전화 할 때 stdout과 stderr는 이 아니며이 수정됩니다. 의 줄 2를 실행하면 복사본으로 구성된 사본이 수정됩니다.

자바에서 전달되는 매개 변수는 많은 사람들에게 혼동의 원천입니다. 여기에 a good explanation이 있습니다.

+0

감사합니다! 이 'pass-by-value'문제에 대한 당신의 언급을 좋아합니다. –

+0

나는 그걸 좋은 설명이라고 부르지 않을 것입니다 ... 나는 그것을 이해하지 못합니다. – Victor

1

아니요, stdout 및 stderr은 변경되지 않으며 예, 매개 변수는 값으로 전달됩니다.

변수 "buffer"는 stdout과 동일하게 설정됩니다. 즉, buffer는 처음에 동일한 객체를 가리 킵니다. 버퍼가 새 객체를 가리 키도록 변경되면 이전 stdout 참조는 여전히 이전 객체를 가리 킵니다.

0

귀하의 가정이 잘못되었습니다. 왜?

함수 매개 변수는 항상 값으로 전달됩니다.

당신이 할 경우 : 당신이 매개 변수 참조에서 복사 한 로컬 참조에 새 StringBuffer을 할당하는

buffer = new StringBuffer(buffer.substring(i)); 

. 따라서 원래 버퍼는 변경되지 않습니다.

2

Java 매개 변수는 항상 값 별 전달 기간입니다. (buffer = new StringBuffer(...)buffer.subString(...)를 호출하여이 PBR 또는 PBV의 경우 귀하의 경우에는 http://www.javaranch.com/campfire/StoryPassBy.jsp

, 그것은 당신이 있기 때문에 새로운 객체에 SB를 다시 할당 문제가되지 않습니다 여기

는 현상을 설명하는 귀여운 기사의 객체 자체를 변형시키지 않습니다). "자바 프로그래밍 언어"에

제임스 고슬링 (James Gosling)에서
3

:

는 "- 값으로 전달할 - ... 자바에서 정확히 하나 개의 매개 변수 전달 모드가 그 단순함을 유지 ...."

저는 이것이 이것이 최종 권한이라고 생각합니다.

+0

아이러니를 가치로 전달하는 +1 –

관련 문제