Здравствуйте! Пересев с С# узнал, что в 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 происходит создание нового экземпляра класса и ссылку на него записываете в ту область памяти которая была выделена для копии ссылки передаваемого объекта. Таким образом вы не меняете исходную ссылку и исходный объект.
И да, при передаче объекта в метод, создаётся дополнительная ссылка, т.е. их становится две, как вы написали в вашем вопросе.
Комментариев нет:
Отправить комментарий