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.
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ć
Korzystając z Kodologii, przyjmujesz do wiadomości, że rozwijamy platformę wykorzystując cookies i pokrewne technologie. Dowiedz się więcejSchowaj