Я попытался упростить приведенные выше примеры, оставив только суть проблемы.
Позвольте мне представить это как историю, которую легко запомнить и правильно применить.
История идет так:
У вас есть домашняя собака, Джимми, хвост которой составляет 12 дюймов в длину.
Вы оставляете его у ветеринара на несколько недель во время поездки за границу.
Ветеринару не нравится длинный хвост Джимми, поэтому он хочет сократить его вдвое.
Но, будучи хорошим ветеринаром, он знает, что не имеет права калечить чужих собак.
Поэтому он сначала делает клона собаки (с ключевым словом new ) и режет хвост клона.
Когда собака наконец возвращается к вам, у нее есть оригинальный 12-дюймовый хвост в такте. Счастливого конца!
В следующий раз, когда вы путешествуете, вы невольно берете собаку к злому ветеринару.
Он также ненавистник длинных хвостов, поэтому он сокращает его до несчастных 2 дюймов.
Но он делает это с твоим дорогим Джимми, а не клоном этого.
Когда вы вернетесь, вы будете шокированы, увидев, как Джимми жалостно трясет 2-дюймовую заглушку.
Мораль истории: когда вы передаете своего питомца, вы отдаете целое и беспрепятственное
опека питомца с ветеринаром. Он свободен, чтобы поиграть с этим.
Прохождение по значению , справке , указателю - все это просто технические споры.
Если ветеринар не клонирует его первым, он в конечном итоге покалечит оригинальную собаку.
public class Doggie {
public static void main(String...args) {
System.out.println("At the owner's home:");
Dog d = new Dog(12);
d.wag();
goodVet(d);
System.out.println("With the owner again:)");
d.wag();
badVet(d);
System.out.println("With the owner again(:");
d.wag();
}
public static void goodVet (Dog dog) {
System.out.println("At the good vet:");
dog.wag();
dog = new Dog(12); // create a clone
dog.cutTail(6); // cut the clone's tail
dog.wag();
}
public static void badVet (Dog dog) {
System.out.println("At the bad vet:");
dog.wag();
dog.cutTail(2); // cut the original dog's tail
dog.wag();
}
}
class Dog {
int tailLength;
public Dog(int originalLength) {
this.tailLength = originalLength;
}
public void cutTail (int newLength) {
this.tailLength = newLength;
}
public void wag() {
System.out.println("Wagging my " +tailLength +" inch tail");
}
}
Output:
At the owner's home:
Wagging my 12 inch tail
At the good vet:
Wagging my 12 inch tail
Wagging my 6 inch tail
With the owner again:)
Wagging my 12 inch tail
At the bad vet:
Wagging my 12 inch tail
Wagging my 2 inch tail
With the owner again(:
Wagging my 2 inch tail