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?
спасибо.
В 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");
}
}
Ссылки в Java передаются значением , поэтому даже если вы измените ссылку внутри функции, изменения не будут отражены обратно в вызывающую функцию, потому что то, что вы изменяете внутри функции находится просто копия исходной ссылки, а не сама исходная ссылка.
Но вы можете вернуть новую строку из вашего метода changeString вместо того, чтобы пытаться изменить ссылку там (внутри самой функции).
Только если вы сделаете функцию
private static void changeString(String[] s) {
s[0] = new String("new string");
}
String неизменяемой, а Java не имеет понятия «указатель на ссылку» как тип данных первого класса. Если вам не нравится приведенное выше, вы можете создать небольшой класс, содержащий одно поле String.
Вы, конечно, можете вернуть новую строку из вашего метода changeString вместо того, чтобы пытаться изменить ее на месте.
В качестве альтернативы вы можете создать объект, который обертывает или содержит строку, и передайте это внутрь. Метод ChangeString изменит внутреннюю строку вашего объекта, а основной метод по-прежнему будет содержать ссылку на этот объект.
В противном случае вы не сможете этого сделать. Строка неизменна, и java всегда передает объекты как значение, которое является указателем на конкретный объект. Измените место, куда вы указываете, и вы больше не ссылаетесь на тот же объект.
Строки неизменяемы в Java, а параметры передаются по значению, поэтому вы не можете их изменить (в C # нет эквивалента ref
). Вы можете передать StringBuilder
и так же легко изменить его содержимое.
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"
}
Это невозможно в Java, так как в Java все передается по значению. В этом случае, когда аргумент является ссылкой на объект, в метод передается значение ссылки, а не сама ссылка.
Java не разрешает из параметров как C #, поэтому вы не сможете этого добиться.
Это уродливо, но вы можете изменить строку на глобальную статическую:
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"
}