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

Мне нравится семантика, аналогичнаяC#& APOS; sref ключевое слово.

 Sayed Abolfazl Fatemi05 мар. 2017 г., 12:16
Сала. этот ответ решит мою проблему:http://stackoverflow.com/a/9324155/1676736

Ответы на вопрос(7)

Другим вариантом является использование массива, например, void method(SomeClass[] v) { v[0] = ...; } но 1) массив должен быть инициализирован перед вызовом метода, 2) все же нельзя реализовать, например, метод обмена таким образом ... Этот способ используется в JDK, например, вjava.util.concurrent.atomic.AtomicMarkableReference.get(boolean[]).

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

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

В Java на уровне языка нет ничего похожего наref, На явеthere is only passing by value semantic

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

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"
 27 нояб. 2009 г., 01:07
Должна ли строка со второй по последнюю прочитать "test (ref);"?
 27 нояб. 2009 г., 12:51
@ Брайан Фишер: исправлено, спасибо
 27 нояб. 2009 г., 14:31
Почему бы не использовать вместо этого java.lang.ref.Reference?
 27 нояб. 2009 г., 15:00
java.lang.ref.Reference не имеет метода set, он не изменяем
 30 дек. 2018 г., 19:05
@ jk7 Достаточно ли важно использоватьint вместоInteger, bool вместоBoolean и так далее? То есть классы-обертки (которые автоматически разворачиваются, если вы беспокоитесь о синтаксисе) не работают?

"...There is exactly one parameter passing mode in Java - pass by value - and that keeps things simple. .."

 09 февр. 2015 г., 21:53
На самом деле это вJLS, in section 8.4.1и JLS ссылается на Гослинга в качестве первого автора: «Когда вызывается метод или конструктор (& # xA7; 15.12),the values of the actual argument expressions initialize newly created parameter variablesкаждый из объявленного типа перед выполнением тела метода или конструктора. & quot;
 05 февр. 2015 г., 11:03
@ingyhere:The pronouncement of the language god should be declared the answer : На самом деле, нет. Несмотря на то, что создатель Java думает или верит, абсолютный ответ будет взят из цитаты из спецификации языка.
 25 окт. 2013 г., 23:25
Объявление бога языка должно быть объявлено ответом.
 09 февр. 2015 г., 23:08
Именно так. Сарказм от членов с низким уровнем репутации бесполезен.

Я не думаю, что вы можете. Наилучшим вариантом может быть инкапсуляция того, что вы хотите передать & quot; с помощью ref & quot; на другой экземпляр класса и передают ссылку на (внешний) класс (по значению). Если вы понимаете, что я имею в виду ...

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

Решение Вопроса

Java сбивает с толку, потому чтоeverything is passed by value, Однако для параметраof reference type (т.е. не параметр примитивного типа) этоthe reference itself который передается по значению, следовательно, этоappears быть по ссылке (и люди часто утверждают, что это так). Это не тот случай, как показано ниже:

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

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

Будет печататьHello на консоль. Варианты, если вы хотели, чтобы вышеприведенный код печаталсяGoodbye должныuse an explicit reference следующее:

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

private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }
 21 нояб. 2012 г., 10:38
Я не думаю, что это сбивает с толку, однако это нормальное поведение. Типы значений существуют в стеке, а ссылочные типы существуют в куче, но ссылки на ссылочные типы также существуют в стеке. Таким образом, вы всегда работаете со значением, которое находится в стеке. Я полагаю, что вопрос здесь был: возможно ли передать ссылку из стека, которая указывает на какое-то другое значение, которое также находится в стеке. Или передать ссылку на другую ссылку, которая указывает на какое-то значение, которое живет в куче?
 01 июл. 2009 г., 15:03
Это очень верно
 01 июл. 2009 г., 14:18
Кроме того, массив длины 1 может быть использован для создания ссылки, если вы действительно хотите запутать людей :)
 30 окт. 2012 г., 15:34
AtomicReference является излишним, вы не обязательно хотите, чтобы там был барьер памяти, и они могут стоить вам. У JRuby была проблема производительности из-за изменчивой переменной, используемой при создании объекта. Вариант использования массива в качестве специальной ссылки мне кажется достаточно хорошим, и я видел, что он использовался более одного раза.
 13 июл. 2011 г., 21:50
AtomicReference и соответствующие классы (AtomicInteger) являются лучшими для таких операций

Can I pass parameters by reference in Java?

Нет.

Зачем ? Ява имеетonly one режим передачи аргументов в методы: по значению.

Замечания:

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

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

Это все на этой картинке:

enter image description here

 30 апр. 2012 г., 11:06
+1 Пример, где изображения дают более четкое объяснение, чем слова
 04 июл. 2014 г., 21:34
Хорошее объяснение, спасибо !!
 12 мая 2014 г., 21:29
+1 к комментарию выше за крайнюю иронию :)
 22 сент. 2011 г., 21:21
Картина сломана.

Ваш ответ на вопрос