답변:
모든 것이 value에 의해 전달 되므로 Java는 혼란스러워 합니다 . 그러나 참조 유형 의 매개 변수 (즉, 기본 유형의 매개 변수가 아닌)의 경우 값으로 전달되는 참조 자체이므로 참조 로 전달되는 것처럼 보입니다 (그리고 사람들은 종종 그것을 주장합니다). 다음과 같이 그렇지 않습니다.
Object o = "Hello";
mutate(o)
System.out.println(o);
private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!
Hello
콘솔에 인쇄 합니다. 위 코드를 인쇄하려면 옵션 은 다음과 같이 명시 적 참조Goodbye
를 사용하는 것입니다.
AtomicReference<Object> ref = new AtomicReference<Object>("Hello");
mutate(ref);
System.out.println(ref.get()); //Goodbye!
private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }
Java에는 언어 수준에 ref 와 비슷한 것이 없습니다 . Java에서는 값 의미 만 전달합니다.
호기심을 위해 객체를 가변 클래스로 래핑하여 Java에서 ref-like semantic을 구현할 수 있습니다.
public class Ref<T> {
private T value;
public Ref(T value) {
this.value = value;
}
public T get() {
return value;
}
public void set(T anotherValue) {
value = anotherValue;
}
@Override
public String toString() {
return value.toString();
}
@Override
public boolean equals(Object obj) {
return value.equals(obj);
}
@Override
public int hashCode() {
return value.hashCode();
}
}
테스트 케이스 :
public void changeRef(Ref<String> ref) {
ref.set("bbb");
}
// ...
Ref<String> ref = new Ref<String>("aaa");
changeRef(ref);
System.out.println(ref); // prints "bbb"
AtomicReference
않습니까? 또는 프리미티브의 경우 AtomicSomething
(예 AtomicBoolean
:)?
int
대신 Integer
, bool
대신 Boolean
등? 즉, 래퍼 클래스 (구문이 걱정되면 자동으로 줄 바꿈되지 않음)가 작동하지 않습니까?
"Java Programming Language"의 James Gosling에서 :
"... Java에는 정확히 하나의 매개 변수 전달 모드가 있으며 값을 기준으로 전달됩니다. 이는 단순하게 유지합니다 .."
The pronouncement of the language god should be declared the answer
: 실제로는 아닙니다. Java 작성자가 생각하거나 믿는 바에도 불구하고 절대적인 대답은 언어 사양의 인용에서 비롯됩니다.