@k5hu Ответов: 2

Передача объекта и строкового литерала в качестве параметров


class Main {
static void m (int[] i) {
i[0] += 7;
}
public static void main (String[] args) {
int[] j = new int[1];
j[0] = 12;
m(j);
System.out.println(j[0]);
}
}


выход
19

Здесь j и i указывают на один и тот же адрес, так что значение меняется и для i тоже.

Что я уже пробовал:

class Main {
static void m (int i) {
i += 7;
}
public static void main (String[] args) {
int j;
j= 12;
m(j);
System.out.println(j);
}
}


выход
12



class Main{
static void m(String s1) {
s1=new String("acting");

}
public static void main(String[] args) {
String s2 = new String("action");
m(s2);
System.out.println(s2);
}
}


выход
действие

здесь будет создана отдельная память для s1 и s2, так что этот вывод имеет смысл для меня.

class Main{
static void m(String s1) {
s1="acting";

}
public static void main(String[] args) {
String s2 ="action";
m(s2);
System.out.println(s2);
}
}


выход
действие

Но здесь строковые литералы будут указывать на одно и то же место и тогда тоже значение s2 не изменяется. Может ли кто-нибудь объяснить мне это ясно?

2 Ответов

Рейтинг:
2

CPallini

Видеть здесь: Аргументы Метода Java[^].


Рейтинг:
2

Jochen Arndt

В Java все параметры передаются по значению. Это означает, что функция получает копию исходной ссылки при передаче объектов, таких как строки. Потому что струны есть Неизменяемые объекты (учебные пособия Java™ > Основные классы > параллелизм)[^], новая строка создается и присваивается копии ссылки, в то время как оригинал остается неизменным.

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

См. также нить так c - передача строки по ссылке в Java? - переполнение стека[^] который также предоставляет решения для изменения строки, передаваемой в качестве параметра функции.