Java - przekazywanie przez wartość, czy przez referencję?

Rozpoczęty przez farcel
32cf0271759b6acb239686f9084d976d?s=128&d=mm

farcel

W Javie piszę od niedawna, skorzystałem również z kursu CodeQuack. Myślałem, że w Javie występuje przekazywanie parametrów do funkcji przez referencję, jednak ostatnio natrafiłem na informacje, że można również przekazywać parametry przez wartość.
Nie bardzo rozumiem ten temat, proszę o wyjaśnienie.

1612db74844986637702239a0006177e?s=128&d=mm

detomastah

Cześć! Możesz być zaskoczony, ale w Javie parametry zawsze są przekazywane przez wartość. W rzeczywistości referencje są po prostu wskaźnikami na obiekty.

Spójrz na poniższy przykład, mam nadzieję, że trochę rozjaśni temat:

class Dog {
String name;
public Dog (String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Burek");
System.out.println(dog.getName()); // "Burek"
createNewDog(dog);
System.out.println(dog.getName()); // "Burek"
}
public static void createNewDog(Dog dog) {
System.out.println("Poczatek createNewDog");
System.out.println(dog.getName()); // "Burek"
dog = new Dog("Rex");
System.out.println(dog.getName()); // "Rex"
System.out.println("Koniec createNewDog");
}
}

Po uruchomieniu tego kodu zostanie wypisany tekst:

Burek
Poczatek createNewDog
Burek
Rex
Koniec createNewDog
Burek

W przykładzie widać, że wartość dog w funkcji main nie została nadpisana, ponieważ wskaźnik na obiekt dog został przekazany przez wartość, a nie przez referencję. Gdyby ten wskaźnik był przekazany przez referencję, to obiekt dog w funkcji main zostałby zmieniony.

Warto jeszcze przeanalizować poniższy przykład, w którym zmieniamy to na co wskazuje wskaźnik, czyli zmieniamy obiekt, zamiast tworzyć nowy.

class Dog {
String name;
public Dog (String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Burek");
System.out.println(dog.getName()); // "Burek"
changeDog(dog);
System.out.println(dog.getName()); // "Rex"
}
public static void changeDog(Dog dog) {
System.out.println("Poczatek changeDog");
System.out.println(dog.getName()); // "Burek"
dog.setName("Rex");
System.out.println(dog.getName()); // "Rex"
System.out.println("Koniec changeDog");
}
}

Tym razem zostanie wypisany następujący tekst.

Burek
Poczatek changeDog
Burek
Rex
Koniec changeDog
Rex

Zaloguj się, aby odpowiedzieć