Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Вопросы по передаче параметров в Java

Здравствуйте! Пересев с С# узнал, что в Java все параметры передаются по значению.
1) Ссылка ссылается на имеющийся объект, и если до передачи на него ссылалась одна ссылка, то теперь их две?
2) Создаётся новый объект в куче, и в пределах блока кода метода работаешь с новосозданным объектом. При этом после завершения работы метода, изначальный объект остаётся не изменённым? Созданный объект в методе уже стал на учёте у сборщика мусора?
Прочитав пару статей про передачу параметров в Java, решил поэкспериментировать. Есть свой класс со строковым полем и двумя методами. Первый метод меняет поле объекта, а второй меняет значение скопированной ссылки.
Вот класс:
class MyClass {
String s;
public MyClass(String s) { this.s = s; }
public static void changeField(MyClass other) { other.s = "**********"; }
public static void changeRef(MyClass other) { other = new MyClass("----------"); }
Однако почему-то, метод changeField изменяет объект, в то время как changeRef - нет.
MyClass obj1 = new MyClass("1"); MyClass obj2 = new MyClass("2");
MyClass.changeField(obj1); MyClass.changeRef(obj2);
System.out.println(obj1.s); System.out.println(obj2.s);
Вывод исполнения программы:
************** 2


Ответ

Как вы сказали, в Java передаётся ссылка на объект(за исключением примитивных классов типа int, long and etc.) при этом, под эту ссылку выдается своя память.
В методе changeField происходит изменение самого объекта. И вы видите эти изменения за пределами функции.
В методе changeRef происходит создание нового экземпляра класса и ссылку на него записываете в ту область памяти которая была выделена для копии ссылки передаваемого объекта. Таким образом вы не меняете исходную ссылку и исходный объект.
И да, при передаче объекта в метод, создаётся дополнительная ссылка, т.е. их становится две, как вы написали в вашем вопросе.

Комментариев нет:

Отправить комментарий