>Java >java지도 시간 >Java에서 참조 및 값 전달에 대한 자세한 설명

Java에서 참조 및 값 전달에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-07-20 13:11:201435검색

먼저 제가 만난 서면 면접 질문인 코드를 보겠습니다:

 1 /** 2  * ***面试题 3  */ 4 public class StringBufferTest { 5     public static void main(String[] args) { 6         int i = 10; 7         test(i); 8         System.out.println(i);//10 9         StringBuffer str = new StringBuffer("str");10         test2(str);11         System.out.println(str.toString());//str_add12         test3(str);13         System.out.println(str.toString());//str_add14     }15 16     public static int test(int m) {17         m = 30;18         return m;19     }20 21     public static StringBuffer test2(StringBuffer str2) {22         str2.append("_add");23         return str2;24     }25 26     public static StringBuffer test3(StringBuffer str3) {27         str3 = new StringBuffer("java");28         return str3;29     }30 31 }
코드 보기

값 전달:

 i 값은 테스트에 입력되지 않습니다. method 매개변수에 30이라는 값이 할당되어 30

이 된다. 따라서 test(i) 메소드를 실행한 후에도 출력되는 i의 값은 여전히 ​​이전 값인 10

이다. 구체적인 과정은 다음과 같다.

Variable i- --->[저장소 값 10]

test(i) 메소드가 호출될 때 메모리의 상황은 다음과 같습니다. i가 자신의 값을 메모리에 복사하고, 변수 m은 복사된 10을 가리킵니다. . -변수 i ---- & gt; [저장값 10] ↓ 값 복사 수행

변수 M --- & gt; [값 10 저장]

이때 17줄까지 실행하면 변수 M M에는 30의 값이 할당되며 이 단계의 작업은 i와 관련이 없습니다.

 Variable m--->[저장값 30]

참조 전달: (전역 변수를 변경할 때 변경 사항이 다른 곳에 영향을 미칠지 특별히 주의하세요)

 test2 메서드에 전달된 Str은 참조입니다. str에, 그래서 str2의 변화는 str의 값에 영향을 미칠 것입니다

따라서 test2(str) 메소드를 실행한 후 인쇄된 str의 값은 str_add

가 됩니다. 구체적인 프로세스는 다음과 같습니다:

변수 str---- >[저장소 값 "str"]

test2(str)을 실행합니다. 이것은 본질적으로 값 전송과 다릅니다. test2(str)를 호출할 때 변수 str2는 str이 가리키는 메모리 공간도 가리킵니다. str의 복사본을 가리키고 있습니다. ㅋㅋㅋ                                                                            ated in in in inency in in on in in on in in on in struct 2 str2에서 추가 메소드를 호출하여 str2가 가리키는 메모리 공간의 값을 변경하고 str도 이에 따라 변경됩니다. ㅋㅋㅋ                     로그인  intesting }  -->["str_add"로 추가]

          

주된 이유는 다음과 같습니다. str3 = new StringBuffer("java"); 이 코드 줄

은 들어오는 값의 복사본과 유사하게 변경됩니다. 새 메서드는 str이 가리키는 메모리의 내용을 변경하지 않지만 그 안에 새로운 블록이 열립니다. 공간은 문자열 "java"를 저장하고 str3은 이 공간을 가리킵니다.

 구체적인 프로세스는 다음과 같습니다.

 프로그램은 12행까지 실행되며, str은 "str_add"가 저장된 메모리 공간을 가리킵니다.

  변수 str--->[저장소 값 "str_add"]

  test3(str)을 호출하고 str에 전달된 참조인 str이 가리키는 메모리 공간을 str3에 지정합니다.

                                   -->[저장소 값 "str_add"]문자열 "java"를 저장하기 위해 새로운 공간이 열리고 str3은 이 공간을 가리킵니다. -변수 str ---- & gt; [저장 값 "str_add"]

STR3의 원래 참조가 잘립니다.

변수 str3 --- & gt; ["java" 공간이 저장된 또 다른 공간]

위 내용은 Java에서 참조 및 값 전달에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.