기본 유형 및 참조 유형 기본 유형: 값은 어떻게 수정하더라도 현재 스택 프레임의 값만 수정되며 외부에서는 변경되지 않습니다. 이 때 외부 변수를 변경해야 합니다. 활성 할당을 반환해야 합니다. 참조 데이터 유형: 포인터는 메서드가 호출되면 복사본 참조가 스택에 푸시되고 할당은 복사본의 참조만 변경합니다. 그러나 복사 참조의 값을 직접 변경하고 참조 주소의 객체를 수정하면 당연히 메소드 외부에서 이 주소를 참조하는 객체가 수정됩니다. (두 개의 참조, 동일한 주소, 모든 수정 동작은 두 참조에 동시에 적용됩니다.)
public class Test2 { public static void setValue(String str){ str = "ss"; } public static void setValue(Man str){ str = new Man("test"); } public static class Man{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Man(String name) { this.name = name; } @Override public String toString() { return "Man{" + "name='" + name + '\'' + '}'; } } public static void main(String[] args) { String str = "s"; setValue(str); System.out.println(str); Man man = null; setValue(man); System.out.println(man); } }
위의 코드 연습에서 보듯이 결과가 출력됩니다.
s null
이유는 메소드가 실행될 때 스택 프레임 개념을 가지고 있기 때문입니다. , 스택에 푸시되면 Push 메서드 매개 변수만 전달된 매개 변수의 복사본입니다.
Java 고급 기능
이번에는 데이터 유형 구별: 기본 유형과 참조 유형
기본 유형:값은 어떻게 수정되든 상관없이 로컬 변수 테이블에 저장됩니다. 현재 스택 프레임만 수정합니다. 이때 메서드 실행 후에는 메서드 값이 메서드 외부에서 변경되지 않습니다. 외부 변수를 변경해야 하는 경우 활성 할당이 반환되어야 합니다.
참조 데이터 유형: 메서드가 호출되면 포인터가 로컬 변수 테이블에 저장되고, 할당은 복사본의 참조만 변경합니다. 그러나 복사 참조의 값을 직접 변경하고 참조 주소의 개체를 수정하면 당연히 메서드 외에 이 주소를 참조하는 개체도 수정됩니다. (두 개의 참조, 동일한 주소, 수정 사항은 동시에 두 참조에 모두 적용됩니다.)
예를 들어
public static void setValue(StringBuilder str){ str = new StringBuilder("sss"); } public static void setValue2(StringBuilder str){ str.append("sss"); } public static void main(String[] args) { StringBuilder str = new StringBuilder(); setValue(str); System.out.println(str.toString()); setValue2(str); System.out.println(str.toString()); }
String에 대해서는 본질적으로 최종 유형 char 배열이므로 수정할 수 없으며, 할당되고 매개변수가 전달될 때 수정됩니다. 이 경우 실제로는 새 객체이고 외부 문자열 참조에 적용하려면 외부 변수를 반환하고 다시 할당해야 합니다.
이해하려면 문자열 소스 코드의 메서드를 살펴보세요.
/** * Returns a string resulting from replacing all occurrences of * {@code oldChar} in this string with {@code newChar}. * <p> * If the character {@code oldChar} does not occur in the * character sequence represented by this {@code String} object, * then a reference to this {@code String} object is returned. * Otherwise, a {@code String} object is returned that * represents a character sequence identical to the character sequence * represented by this {@code String} object, except that every * occurrence of {@code oldChar} is replaced by an occurrence * of {@code newChar}. * <p> * Examples: * <blockquote><pre class="brush:php;toolbar:false"> * "mesquite in your cellar".replace('e', 'o') * returns "mosquito in your collar" * "the war of baronets".replace('r', 'y') * returns "the way of bayonets" * "sparring with a purple porpoise".replace('p', 't') * returns "starring with a turtle tortoise" * "JonL".replace('q', 'x') returns "JonL" (no change) ** * @param oldChar the old character. * @param newChar the new character. * @return a string derived from this string by replacing every * occurrence of {@code oldChar} with {@code newChar}. */ public String replace(char oldChar, char newChar) { if (oldChar != newChar) { int len = value.length; int i = -1; char[] val = value; /* avoid getfield opcode */ while (++i
참조 유형은 얕은 복사 및 깊은 복사 현상을 유발합니다.
관련 기사:
JavaScript에서 범위 밖의 변수를 수정하는 방법
PHP 클로저 함수에 매개변수를 전달하고 외부 변수, PHP 변수를 사용하는 방법
위 내용은 Java에서 함수 수신 값 수정: 기본 유형 및 참조 유형의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!