Почему я не могу использовать Java способ изменить переданную переменную? [duplicate]

7
задан Paŭlo Ebermann 23 August 2011 в 19:55
поделиться

4 ответа

Ссылки на объекты передаются с помощью значения в Java, поэтому присвоение локальной переменной внутри метода не меняет исходную переменную. Только локальная переменная s указывает на новую строку. Возможно, это будет легче понять с помощью небольшого рисунка ASCII.

Изначально у вас есть следующее:

------------
| nullTest |
------------
     |
    null

Когда вы впервые вводите метод setNotNull, вы получаете копию значения nullTest в s . В этом случае значение nullTest является пустой ссылкой:

------------    ------------
| nullTest |    |    s     |
------------    ------------
     |               |
    null            null

Затем переназначьте s:

------------    ------------
| nullTest |    |    s     |
------------    ------------
     |               |
    null         "not null!"

И затем оставьте метод:

------------
| nullTest |
------------
     |
    null
21
ответ дан 6 December 2019 в 07:24
поделиться

Java не передает по ссылке, она передает значение ссылки. Когда вы назначаете s = "not null" , вы переназначаете это значение.

2
ответ дан 6 December 2019 в 07:24
поделиться

Я надеялся сделать что-то вроде setNotNull (MyObject o) без использования o = setNotNull (o)

Просто вы не можете. Ближайшее, что вы получите, выглядит примерно так:

public class MyRef<T> {
    private T obj;

    public T get() {
        return obj;
    }

    public void set(T obj) {
        this.obj = obj;
    }

    public void setNotNull(T obj) {
        if (this.obj == null) {
            this.obj = obj;
        }
    }
}

MyRef<MyObj> ref = new MyRef<MyObj>();
ref.setNotNull(xyz);
System.err.println(ref.get());

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

1
ответ дан 6 December 2019 в 07:24
поделиться
s =

вот почему. вы назначаете s, а не изменяете объект, на который указывает s.

0
ответ дан 6 December 2019 в 07:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: