C#
의 ref
키워드 와 유사한 의미를 원합니다 .
답변
모든 것이 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에서 참조로 매개 변수를 전달할 수 있습니까?
아니.
왜 ? Java에는 값으로 메소드에 인수를 전달하는 유일한 모드가 있습니다.
노트 :
프리미티브의 경우 이해하기 쉽습니다. 값의 사본을 얻습니다.
다른 모든 경우 참조의 사본을 얻습니다.이 값을 전달하는 것도 호출됩니다.
이 사진에 모두 있습니다.
답변
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"
답변
“Java Programming Language”의 James Gosling에서 :
“… Java에는 정확히 하나의 매개 변수 전달 모드가 있으며 값을 기준으로 전달됩니다. 이는 단순하게 유지합니다 ..”
답변
나는 당신이 할 수 있다고 생각하지 않습니다. 가장 좋은 방법은 다른 클래스 인스턴스에 “ref로”전달하려는 것을 캡슐화하고 (외부) 클래스의 참조를 값으로 전달하는 것입니다. 무슨 말인지 알면 …
즉, 메소드는 전달 된 오브젝트의 내부 상태를 변경 한 다음 호출자에게 표시됩니다.
답변
Java는 항상 가치에 의해 전달됩니다.
프리미티브를 전달하면 값의 사본이고 객체를 전달할 때 참조 포인터의 사본입니다.
답변
다른 옵션은 배열을 사용하는 것입니다. 예를 들어
void method(SomeClass[] v) { v[0] = ...; }
1) 메소드를 호출하기 전에 배열을 초기화해야합니다 java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[])
.