
Wyjaśnienie, co to referencja i jak rozumieć tworzenie obiektów w java.
kanarexPraktykant
10piorunówPo polsku chyba nikt tego tak dokładnie jeszcze tak nie wytłumaczył.
Komentarze (7)
@kanarex Metoda someMethod może robić dowolną rzecz. Jeśli w tym przypadku modyfikowałaby któreś z pól w klasie MyOwnClass to zarówno pierwsze jak i drugie wywołanie zmieniałoby to samo pole w tym samym obiekcie klasy MyOwnClass (bo obie referencje wskazują/prowadzą do tego samego obiektu). I tak, ostatnie wywołanie metody określa jaki stan będzie miał obiekt klasy MyOwnClass na koniec programu.
@kbk uwaga daję z siebie 100%.
Czyli i.someMethod() i moc.someMethod() mogą modyfikować oryginalną wartość z obiektu MyOwnClass i tenże obiekt będzie miał wartość z ostatniej wykonanej przez program metody?
@kanarex
Tak na szybko. Zmienna/pole np.
int box1;
String box2;
MyOwnClass box3
to pudełko. Dla typów prostych w pudełku trzyma się jedną, konkretną wartość np. true, 4, 4.5. Dla typów obiektowych w pudełku jest referencja/"adres" obiektu.
W przypadku typów prostych:
2.1 public void fun(int i){
2.2 i++;
2.3 System.out.println(i)
}
1. int j = 0;
2. fun(j);
3. System.out.println(j);
1. Wkładamy do pudełka j wartość 0;
2. Wywołujemy funkcję fun i przekazujemy (kopiujemy) do niej zawartość pudełka j, czyli 0;
2.1 W funkcji ta wartość z pudełka j jest wkładana do pudełka i;
2.2. Zawartość pudełka i zwiększamy o 1, zawartość pudełka j w tym czasie się nie zmienia.
2.3. Wypisujemy 1
3. Wypisujemy zawartość pudełka j, czyli cały czas 0;
W przypadku typów obiektowych:
2.1 public void fun(MyOwnClass i){
//
}
1. MyOwnClass moc = new MyOwnClass();
2. fun(moc);
1. Tworzymy obiekt typu MyOwnClass i wkładamy jego referencję/"adres" do pudełka moc.
2. Wywołujemy funkcję fun i przekazujemy (kopiujemy) do niej zawartość pudełka moc czyli referencję/"adres" wcześniej utworzonego obiektu. Sam obiekt nie jest kopiowany, nadal jest tylko jeden.
2.1 W funkcji ta referencja/"adres" z pudełka moc jest kopiowana do pudełka i
Na tym etapie mamy jeden obiekt typu MyOwnClass i dwie zmienne które "wskazują" na ten obiekt. Wywołanie metody i.someMethod() czy moc.someMethod() odnoszą się do tego samego obiektu. Tak samo odwołanie się do pola w klasie i.field1 czy moc.field2 też dotyczy tego samego pola.
Dałem z siebie całe 30%
@kbk właśnie szukam jakiegoś poradnika który mi to wytłumaczy, dokładnie to zagadnienie, ni cholery nie mogę zrozumieć
Nie jest prawdą że typ prosty możemy poznać po tym, że jest pisany mała literą.
Koduje po polsku, ale heap i stack nie przetłumaczył ;).
Nie powiedział o bardzo istotnej różnicy przy przekazywaniu typów prostych i referencyjnych do metod.
Solidne 3+ XD
każda książka o OOP dobrze to tłumaczy jak i studia więc opis dość głupi, ale piorun na zachętę
@kanarex Witam tego całkiem śnieżnego dnia! Mam nadzieję, że będzie on lepszy niż poprzedni! (✿❦ ͜ʖ ❦)