다음 코드를 실행해 보세요. 결과는 무엇인가요?
package com.test; public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str); System.out.println(ex.ch); } public void change(String str, char ch[]) { str = "test ok"; ch[0] = 'g'; } }
결과는 다음과 같습니다.
good gbc
해설:
Java의 문자열은 불변입니다. 즉, 일단 초기화되면 해당 참조가 가리키는 내용은 불변입니다(참고: 내용은 불변입니다).
즉, 코드에 String str = "aa"; str = "bb"; 가 있다고 가정하면 두 번째 문은 "aa"의 원래 저장 주소 내용을 변경하지 않고 다른 주소를 엽니다. space. "bb"를 동시에 저장하는 데 사용됩니다. str이 원래 가리킨 "aa"는 이제 도달할 수 없기 때문에 jvm은 GC를 통해 자동으로 재활용합니다.
메소드를 호출할 때 String 유형과 배열은 참조로 전달됩니다. 위 코드에서 str은 매개변수로 변경(String str, char ch[]) 메소드에 전달됩니다. 메소드 매개변수 str은 가리키는 문자열을 가리킵니다. 클래스에서 str을 사용하지만 str = "test ok"; 문은 메서드 매개 변수 str이 "test ok"를 저장하는 새로 할당된 주소를 가리키도록 만드는 반면 원래 str은 여전히 "good"을 가리킵니다. 배열의 경우, 변경 메소드에서 메소드 매개변수 ch는 클래스의 ch가 가리키는 배열을 가리키고, ch[0] = 'g' 명령문은
package com.test; public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str); System.out.println(ex.ch); } public void change(String str, char ch[]) { str = str.toUpperCase(); ch = new char[]{ 'm', 'n' }; } }
결과는 다음과 같습니다.
good abc
위의 Java에서의 문자열 유형 변수 할당에 대한 소개는 모두 편집기에서 공유한 내용이므로 참고가 되기를 바라며, Script Home을 지원해 주시길 바랍니다.