Przypisanie obiektu do obiektu

0

Witam wszystkich.
Mam proste pytanie. Nie umiem zrozumiec czemu tak sie dzieje.
Poniżej prosty przykład:

public class Pracownik {

	String imie;
	String nazwisko;
	int	   wiek;
}
public class Test {
	static void zmien(Pracownik prc){
		Pracownik prc2 = new Pracownik();
		
		prc2.imie = "Leszek";
		prc2.nazwisko = "Leszkowicz";
		prc2.wiek =1500190;
		prc = prc2; 
		//prc.imie = prc2.imie;
		//prc.nazwisko = prc2.nazwisko;
		//prc.wiek =prc2.wiek;
	}

}
public class Firma {

	public static void main(String[] args) {
		Pracownik[] pracownicy = new Pracownik[3];
		
		String[] imiona = {"Wlodek", "Staszek", "Lukasz"};
		String[] nazwiska = {"Zieba", "Kowalski", "Zietek"};
		int[] wiek = {45, 34, 56};
		
		for(int i=0; i< pracownicy.length; i++) {
			
			pracownicy[i] = new Pracownik();
			pracownicy[i].imie = imiona[i];
			pracownicy[i].nazwisko = nazwiska[i];
			pracownicy[i].wiek = wiek[i];
			
		}
		System.out.println("Pracownicy firmy to:");
		for(int i=0; i< pracownicy.length; i++){
			Test.zmien(pracownicy[i]);
			System.out.println(pracownicy[i].imie+" "+pracownicy[i].nazwisko+", "+pracownicy[i].wiek+" lat");
		}

	}

}

OUTPUT

Pracownicy firmy to:
Wlodek Zieba, 45 lat
Staszek Kowalski, 34 lat
Lukasz Zietek, 56 lat

Jezeli odkomentuje. w klasie Test zakomentowany kod i zakomentuje prc = prc2; to dostane wynik:

Pracownicy firmy to:
Leszek Leszkowicz, 1500190 lat
Leszek Leszkowicz, 1500190 lat
Leszek Leszkowicz, 1500190 lat

Pytanie brzmi:

Żeby uzyskać zmiany w obiekcie prc, mogę tylko w sposób odwołania się do poszczególnych elementów tego obiektu. I czemu nie mogę przypisać mu zmian jakie są w obiekcie prc2?

0

W wierszu

prc = prc2;

następuje przypisanie referencji - nadanie nowej nazwy temu samemu obiektowi w pamięci komputera.

0

Rozumiem ze teraz prc2 wskazuje na obiekt prc? Moge sie nie zgodzic bo , jak dodalem na koncu klasy Test

System.out.println(prc2.imie+" "+prc2.nazwisko+", "+prc2.wiek+" lat");

Dane były takie:

prc2.imie = "Leszek";
prc2.nazwisko = "Leszkowicz";
prc2.wiek =1500190;

Dlatego nie rozumiem co moge osiagnac takim przypisaniem

prc = prc2; 
0

Rozumiem ze teraz prc2 wskazuje na obiekt prc?

Odwrotnie. Teraz nazwa prc pokazuje na ten sam obiekt na który pokazuje prc2.

0

Źle rozumiesz, po przypisaniu

prc = prc2

prc wskazuje na obiekt prc2, a nie prc2 na obiekt prc.

0
bogdans napisał(a):

Źle rozumiesz, po przypisaniu

prc = prc2

prc wskazuje na obiekt prc2, a nie prc2 na obiekt prc.

Mhm
Po dodaniu na koniec klasy Test

System.out.println(prc.imie+" "+prc.nazwisko+", "+prc.wiek+" lat");

faktycznie prc teraz wskazuje na prc2, ale w klasie Firma, po wywolaniu

for(int i=0; i< pracownicy.length; i++){
			Test.zmien(pracownicy[i]);
			System.out.println(pracownicy[i].imie+" "+pracownicy[i].nazwisko+", "+pracownicy[i].wiek+" lat");
		}

Obiekt prc nie bedzie zmieniony, bo wskazywal na co innego w Test, a skoro prc2 istniał tylko w obrebach klasy Test, to prc w klasie Firma dalej wskazuje sam na siebie. Dobrze rozumiem??

A jak w klasie Test robil bym bezposrednio zmiany na obiekcie prc, zmiany by zostały zapisane bezposrednio do obiektu z klasy Firma?

0

Tak, metoda zmien powinna wyglądać tak

public class Test {
    static void zmien(Pracownik prc){ 
        prc.imie = "Leszek";
        prc.nazwisko = "Leszkowicz";
        prc.wiek =1500190;
    }
 
}
0

Wiem przetestowalem sobie to, chciałem tylko zrozumiec jak to dziala, dzieki za odpowiedzi juz rozumiem :)

0
  1. Tak.
  2. Tak.
    Bo czym innym jest przypisanie lokalnej "nazwy" (referencji) do innego obiektu a czym innym jest zmiana pól danego obiektu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1