Понимание 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. Таким образом, эта переменная все еще ссылается на тот же объект. Было ли это то, что вас интересует?

Другие вопросы по тегам