Могу ли я передать параметры по ссылке в Java?

Использование XOR-оператора - очень плохая идея:

Во-первых, это гораздо менее читаемо. Во-вторых, были времена, когда это было быстрее, но в настоящее время наоборот. См.

Wikipedia

для справки.

142
задан oxbow_lakes 1 July 2009 в 13:44
поделиться

6 ответов

Java сбивает с толку, потому что все передается по значению . Однако для параметра ссылочного типа (т.е. не параметра примитивного типа) это сама ссылка , которая передается по значению, поэтому выглядит как передача по ссылке (и люди часто утверждают, что это так). Это не так, как показано ниже:

Object o = "Hello";
mutate(o)
System.out.println(o);

private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!

Будет напечатано Hello на консоли. Если вы хотите, чтобы приведенный выше код печатал До свидания , можно использовать явную ссылку следующим образом:

AtomicReference<Object> ref = new AtomicReference<Object>("Hello");
mutate(ref);
System.out.println(ref.get()); //Goodbye!

private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }
222
ответ дан 23 November 2019 в 22:46
поделиться

Java всегда передается по значению.

Когда вы передаете примитив, это копия значения, когда вы передаете объект, это копия ссылочного указателя.

7
ответ дан 23 November 2019 в 22:46
поделиться

Могу ли я передавать параметры по ссылке в Java?

Нет.

Почему? В Java есть только один режим передачи аргументов методам: по значению.

Примечание:

Для примитивов это легко понять: вы получаете копию значения.

Для всех остальных вы получаете копию ссылки, и это также называется передачей по значению.

Все это изображено на этой картинке:

enter image description here

65
ответ дан 23 November 2019 в 22:46
поделиться

В Java нет ничего на уровне языка, подобного ref . В Java существует только передача по семантике значений

Ради любопытства вы можете реализовать в Java семантику типа ref, просто заключив свои объекты в изменяемый класс:

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();
    }
}

testcase:

public void changeRef(Ref<String> ref) {
    ref.set("bbb");
}

// ...
Ref<String> ref = new Ref<String>("aaa");
changeRef(ref);
System.out.println(ref); // prints "bbb"
23
ответ дан 23 November 2019 в 22:46
поделиться

От Джеймса Гослинга в «Языке программирования Java»:

«... В Java есть только один режим передачи параметров - передача по значению - и это упрощает работу. .. "

18
ответ дан 23 November 2019 в 22:46
поделиться

Не думаю, что ты сможешь. Лучшим вариантом может быть инкапсуляция того, что вы хотите передать «по ссылке», в другой экземпляр класса и передать ссылку на (внешний) класс (по значению). Если вы понимаете, что я имею в виду ...

т.е. ваш метод изменяет внутреннее состояние переданного объекта, которое затем становится видимым для вызывающего.

Лучшим вариантом может быть инкапсуляция того, что вы хотите передать «по ссылке», в другой экземпляр класса и передать ссылку на (внешний) класс (по значению). Если вы понимаете, что я имею в виду ...

т.е. ваш метод изменяет внутреннее состояние переданного объекта, которое затем становится видимым для вызывающего.

Лучшим вариантом может быть инкапсуляция того, что вы хотите передать «по ссылке», в другой экземпляр класса и передать ссылку на (внешний) класс (по значению). Если вы понимаете, что я имею в виду ...

т.е. ваш метод изменяет внутреннее состояние переданного объекта, которое затем становится видимым для вызывающего.

10
ответ дан 23 November 2019 в 22:46
поделиться