Wpis z mikrobloga

class Person {
private String name;

public Person(String name) {
this.name = name;
}

public void setName(String name) {
this.name = name;
}

public String toString() {
return "Person [name = " + name + "]";
}
}

public class Main {
public static void main(String[] args)
{
Main main = new Main();

Person person = new Person("Robert");
System.out.println("1. " + person);
main.show(person);
System.out.println("4. " + person);

}

public void show(Person xyz) {
System.out.println("2. " + xyz);

xyz.setName("Piotr");

xyz = new Person("Jacek");

System.out.println("3. " + xyz);
}
}

Wynik:
1. Person [name = Robert]
2. Person [name = Robert]
3. Person [name = Jacek]
4. Person [name = Piotr]

Dlaczego w metodzie show gdy używam xyz.setName("Piotr") to zmieniam zmienną name w obiekcie person, a gdy używam xyz = new Person("Jacek") to pod person nie podstawia mi new Person("Jacek")?
#naukaprogramowania #java
  • 7
Bo jak w metodzie show(Person xyz) zmienna xyz jest kopią.

Czyli jak w niej masz już obiekt to masz do niego tylko referencję w xyz. Zmieniając imię zmieniasz tylko pole zmiennej. Natomiast przypisując do xyz nowy obiekt, to w xyz masz nową referencję, która jest tylko w xyz i zostanie zniszczona przez GC po wywołaniu metody. CHYBA~
xyz jest referencją do obiektu utworzonego poprzez "new Person("Robert");"

xyz.setName("Piotr");


jest wywołaniem metody z obiektu (nie z referencji bo to nie ma sensu). Dlatego wywołuje zmianę wartości pola w obiekcie.

xyz = new Person("Jacek");


To jest utworzenie nowego obiektu i przypisanie go do referencji xyz. Nie zmienia to referecji person która nadal odnosi się do obiektu utworzonego poprzez "new Person("Robert");"
@kenshin985: nie znam tego języka za dobrze, ale też tak rozumiem to..
xyz trzyma referencję do obiektu przesłanego do metody,
xyz.setname zmienia jej wartość.
Później do xyz przypisujesz nową referencję, czyli nazwa wskazuje na inny obiekt lokalny
wyświetlasz xyz z lokalnego
wychodzisz z metody i masz poprzednią referencję, ze zmienioną wartością.
Lokalna referencja z metody jest niszczona.
@dzony_: jest jak pisze @kenshin985

Bo jak w metodzie show(Person xyz) zmienna xyz jest kopią.


Dodam tylko, że zmienna xyz trzyma kopię referencji do obiektu i wszelkie operacje na obiekcie wpływają na zmianę jego stanu.

Jednak gdy przypiszesz obiekt do xyz, to przypiszesz to tylko referencję do innego obiektu, i teraz to na nim wykonujesz "akcje". Proste i logiczne.
xyz


@dzony_: Zmienna to taka taczka którą przewozisz ładunek w pudełkach. Możesz załadować taczkę, zawieść gdzieś pudełko, zrobić coś z zawartością pudełka, ...

Wykonując xyz = new Person("Jacek") ładujesz do taczki nowe pudełko i tym samym tracisz dostęp do poprzedniego pudełka.