Понимание Java Pass по значению
Я просмотрел несколько постов в stackru и погуглил другие хорошие сайты, чтобы понять концепции передачи Java по значению.
мое сомнение идет как ниже.
Dog someDog = new Dog("FOO"); //mem location 42
foo(someDog);
someDog.setName("FIFI"); // false
foo(Dog newDog){
newDog.name.equals("FOO"); //true
newDog = new Dog("FIFI"); // create a new DOG object mem location 72. my doubt here
newDog.name.equals("FIFI"); //true
}
так как выше в строке newDog = new Dog("FIFI");
Насколько я понимаю, новый объект DOG создается в ячейке памяти 72 и назначается другому объекту местоположения собаки в ячейке памяти 42.
что это значит? на заднем плане..
С уважением Пунит.
3 ответа
void foo(Dog newDog){
newDog.name.equals("FOO"); //true
newDog = new Dog("FIFI"); // create a new DOG object mem location 72. my doubt here
newDog.name.equals("FIFI"); //true
}
Вот newDog
является локальной переменной для этого метода. Когда вы вызываете этот метод и передаете someDog
, значение someDog
(который является ссылкой на Dog
объект) копируется в newDog
, Итак, теперь у вас есть 2 ссылки, указывающие на один и тот же объект. Вот почему первая строка оценивается как true
,
После того, как вы выполните
newDog = new Dog("FIFI");
переменная newDog
ссылается на недавно созданный Dog
объект. Это не меняет переменную someDog
совсем. Итак, теперь у вас есть 2 переменные, каждая из которых указывает на разные Dog
объект.
После того, как метод сделан, newDog
переменная исчезает, а вновь созданная Dog
объект больше не ссылается на него, поэтому он становится пригодным для сборки мусора.
Код, размещенный в методе, не меняет никаких атрибутов объекта, на который ссылается someDog
и он никогда не сможет переключить объект, на который ссылается someDog
Вот почему
someDog.setName("FIFI"); // is false
Понял?
Одна картинка стоит тысячи слов, так что вот что происходит:
Как видите, две переменные someDog
в звонилке и newDog
в foo
ссылка на тот же объект изначально. После назначения они ссылаются на разные объекты, объясняя поведение, которое вы видите: Dog
передается по ссылке, и потому что вы создали новый Dog
вместо того, чтобы модифицировать существующий, newDog
становится не связанным с someDog
после назначения.
Обратите внимание, что если бы вы изменили существующую собаку, картина была бы другой: если бы вы сделали newDog.setName("FIFI");
внутри foo
, скорее, чем newDog = new Dog("FIFI");
результаты были бы другими: диаграмма все равно выглядела бы как средняя картинка, но имя собаки было бы FIFI
,
Вы создаете новый объект Dog (FIFI) и позволяете параметру метода new Dog ссылаться на этот новый объект. Это никак не влияет на объект, на который все еще ссылается someDog. Таким образом, эта переменная все еще ссылается на тот же объект. Было ли это то, что вас интересует?