Могу ли я изменить ссылку внутри одного метода с этой ссылкой в ​​качестве аргумента в Java? - PullRequest
8 голосов
/ 22 декабря 2009
private static void changeString(String s) {
    s = new String("new string");
}

public static void main(String[] args) {
    String s = new String("old string");
    changeString(s);
    System.out.println(s); // expect "new string"
}

Как сделать так, чтобы вывод "новой строки" происходил с s в качестве единственного аргумента для метода changeString?

спасибо.

Ответы [ 9 ]

10 голосов
/ 22 декабря 2009

В аргументах Java передаются по значению, аргументы объекта передают ссылку на объект, это означает, что вы можете изменить ссылку на аргумент, но это не изменит объект, на который вы передали ссылку. У вас есть две возможности: вернуть новый объект (предпочтительно) или передать ссылку на контейнер, который может получить новую ссылку (коллекция, массив и т. Д.). Например:

private static String changeStringAndReturn(String s) {
    return new String("new string");
}
private static void changeStringInArray(String[] s) {
    if (null != s && 0 < s.length) {
        s[0] = new String("new string");
    }
}
5 голосов
/ 22 декабря 2009

Ссылки в Java передаются значением , поэтому даже если вы измените ссылку внутри функции, изменения не будут отражены обратно в вызывающую функцию, потому что то, что вы изменяете внутри функции, является просто копией исходной ссылки, а не исходной ссылки.

Но вы можете вернуть новую строку из вашего метода changeString вместо попытки изменить ссылку там (внутри функции).

4 голосов
/ 22 декабря 2009

Только если вы сделаете функцию

private static void changeString(String[] s) {
    s[0] = new String("new string");
}

Строка неизменна, и в Java нет понятия «указатель на ссылку» как тип данных первого класса. Если вам не нравится вышеуказанное, вы можете создать небольшой класс, содержащий одно поле String.

2 голосов
/ 22 декабря 2009

Конечно, вы можете вернуть новую строку из вашего метода changeString вместо того, чтобы пытаться изменить ее на месте.

В качестве альтернативы, вы можете создать объект, который оборачивает или содержит строку, и передать ее внутрь. Метод ChangeString изменит строку, которая является внутренней для вашего объекта, и метод main все равно будет содержать ссылку на этот объект.

В противном случае, вы не можете сделать это. String является неизменным, и java всегда передает объекты как значение, которое является указателем на определенный объект. Измените, куда вы указываете, и вы больше не ссылаетесь на один и тот же объект.

2 голосов
/ 22 декабря 2009

A : Вы не можете, в Java ссылки на объекты передаются по значению.

Если вам действительно нужно, вы можете создать оболочку вот так и использовать ее так, как вы ожидали:

private static void changeString( _<String> str) {
     str.s("new string");
}

public static void main(String[] args) {
    _<String> s = new _<String>("old string");
    changeString(s);
    System.out.println(s); // prints "new string"
}
1 голос
/ 22 декабря 2009

Строки являются неизменяемыми в Java, а параметры передаются по значению, поэтому вы не можете их изменить (в C # нет эквивалента ref). Вы можете передать StringBuilder и изменить его содержимое так же легко.

0 голосов
/ 22 декабря 2009

Это ужасно, но вы можете изменить строку на глобальную статическую:

private static String s;

    private static void changeString(String t) {
        if(s.equals(t))
            s = new String("new string");
    }

    public static void main(String[] args) {
        s = new String("old string");
        changeString(s);
        System.out.println(s); // expect "new string"
    }
0 голосов
/ 22 декабря 2009

Java не допускает out параметров , как C #, поэтому вы не сможете достичь этого как такового.

0 голосов
/ 22 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...