[java] Java에서 참조로 매개 변수를 전달할 수 있습니까?

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[]).