먼저 제가 만난 서면 면접 질문인 코드를 보겠습니다:
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 저장]
주된 이유는 다음과 같습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!