Почему мой метод Java не может изменить пропущенную переменную? [Дубликат

StackOverflow https://stackoverflow.com/questions/3481438

Вопрос

Этот вопрос уже имеет ответ здесь:

Я был вроде сбившись, когда увидел следующий код, не работал, как ожидалось.

Я думал, что Java всегда проходил переменные по ссылкам в функции. Поэтому, почему функция не может переназначить переменную?

public static void main(String[] args) {

  String nullTest = null;

  setNotNull(nullTest);

  System.out.println(nullTest);
}

private static void setNotNull(String s) {
  s = "not null!";
}

Эта программа выводит null.

Это было полезно?

Решение

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

Первоначально у вас есть это:

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

Когда вы впеьте введите метод Setnotnull, вы получаете Копия стоимости изнутри s. Отказ В этом случае значение Nulltest - это нулевая ссылка:

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

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

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

А затем оставить метод:

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

Другие советы

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

Я надеялся сделать что-то вроде 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());

Что все довольно неуклюже, и, вероятно, не стоит усилий.

s =

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top