Я мог изменить ссылку в одном методе с этой ссылкой как аргумент в Java?

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
задан bmargulies 22 December 2009 в 14:19
поделиться

9 ответов

В 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");
    }
}
10
ответ дан 4 December 2019 в 08:33
поделиться

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

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

5
ответ дан 4 December 2019 в 08:33
поделиться

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

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

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

4
ответ дан 4 December 2019 в 08:33
поделиться

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

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

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

2
ответ дан 4 December 2019 в 08:33
поделиться

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

2
ответ дан 4 December 2019 в 08:33
поделиться

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"
}
2
ответ дан 4 December 2019 в 08:33
поделиться

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

0
ответ дан 4 December 2019 в 08:33
поделиться

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

0
ответ дан 4 December 2019 в 08:33
поделиться

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

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
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

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