Referencje to innymi słowy zmienne typów obiektowych. Są to zmienne, których wartością jest wskaźnik na obiekt ustalonego typu (zależnego od typu referencji) albo wartość null. Wartość null to specjalna wartość zmiennych referencyjnych, która to wartość oznacza, że nie jest to wskaźnik na żaden obiekt.
Kluczem do zrozumienia referencji jest zrozumienie różnicy między referencją samą w sobie a obiektem przez tę referencję wskazywanym. Aby opisać obiekt wystarczy znać typ tego obiektu (jego klasę), oraz stan (wartość) każdej zmiennej tego obiektu. Informacje te zapisane są w pewnym obszarze pamięci. Obszar ten zobrazowano na poniższej ilustracji jako dużą elipsę. W każdej chwili w pamięci zapisany jest stan bardzo wielu obiektów, stąd takich elips na poniższej ilustracji zaznaczono kilka. Referencja z kolei jest niczym innym jak tylko wskazaniem na jeden z tych obiektów, a więc na jeden z tych obszarów pamięci. Referencje oznaczono na poniższym rysunku małymi kółkami. Fakt, że referencje wskazują obiekty zaznaczono jako strzałki. Oczywiście nic nie stoi na przeszkodzie, żeby kilka referencji wskazywało ten sam obiekt. Takie referencje mają po prostu tą samą wartość. Zerknijmy teraz na ten rysunek.
Deklaracja zmiennej typu String o nazwie x i przypisanie jej wartości „Ola” powoduje utworzenie zmiennej referencyjnej x oraz obiektu typu String reprezentującego napis „Ola” i jednoczesne przypisanie do tej referencji wskaźnika na ten obiekt. Przypisanie jakiejś innej zmiennej referencyjnej – zmiennej y – wartości zmiennej x oznacza, że zmienna y będzie wskazywała na ten sam obiekt co zmienna x. Nie jest to operacja na obiekcie wskazywanym przez zmienną referencyjną x, tylko na samej zmiennej. Mamy więc do czynienia z sytuacją pokazaną na kolejnej ilustracji.
Zmienna y miała początkowo wartość null, jako że w deklaracji nie przypisaliśmy jej żadnej wartości. Następnie przypisujemy do tej zmiennej wartość zmiennej x i odtąd obydwie referencje odnoszą się do tego samego obiektu. Możemy teraz wywoływać metody klasy String dla tego obiektu zarówno za pośrednictwem zmiennej x jak i y i będzie to miało dokładnie ten sam skutek. Koniec końców metody te będą wywoływane na tym samym obiekcie klasy String.
Często zdaża się, że potrzebujemy odwołać się w implementowanym kodzie do obiektu dla którego ten kod się wykonuje. To tak, jakbyśmy rozmawiając z grupą osób chcieli powiedzieć coś o sobie – używamy wtedy słowa 'ja’. W Javie takim odpowiednikiem słowa 'ja’, tj. wskaźnikiem na samego siebie jest wskaźnik this. W jakich konkretnie okolicznościach wskaźnik this jest przydatny nauczymy się z biegiem kursu. Póki co nie przejmujmy się jeśli nie specjalnie rozumiemy do czego to służy.
tującego napis „Ola” i jednoczesne przypisanie do tej referencji wskaźnika na ten obiekt. Przypisanie jakiejś innej zmiennej referencyjnej – zmiennej y – wartości zmiennej x oznacza, że zmienna y będzie wskazywała na ten sam obiekt co zmienna x. ……………………………liiitościiiiiii iiiiiiiiiiiii kto to ma zrozumieć chyba Tylko Ty – ksiażek w każdym razie o Javie nie pisz…zamykam to zanim zniechęcę się dl javy..
Taka informacja dla autora tekstu. Niezainicjowane zmienne w javie, nie przyjmują wartości NULL.
Wprowadzacie w błąd. Możecie to łatwo sprawdzić poprzez napisanie prostej metody, która wyświetli jakikolwiek napis, jeśli wartość zmiennej będzie równa null:
(…)
String x;
if(x==NULL) {
System.out.println(„To sie nie wyswietli”);
else
System.out.println(„Natomiast, to tak.”);
}
(..)
Pozdrawiam
Dwa dni usiłowałem zrozumieć zagadnienie referencji i upewnić się, że rozumiem je dobrze. Właśnie nastał ten moment… nareszcie wiem o co kaman 🙂 @Janusz – Uważam, że powyższa „definicja” wcale nie jest taka zagmatwana. Podstawowa sprawa, to czytać wolno, dokładnie i z ogromnym skupieniem. Jedne rzeczy wymagają mniej, inne więcej czasu i jeśli chcesz się w ogóle zabierać za programowanie (na poważnie), to musisz się z tym faktem pogodzić. To jest już n-ta strona, do której odnośnik wyskakuje w wynikach Gugla i na którą wszedłem żeby pojąć referencje. Wczoraj czytałem to 3 razy i dałem spokój, ale zamiast wysmarować niemiły… Czytaj więcej »
Nauka Javy nie jest prosta, ale tak naprawdę nie proste jest programowanie obiektowe jak się wcześniej używało programowania strukturalnego. Sam uczę się javy ale największy problem to zmiana myślenia. Jak się zaskoczy to wtedy wiemy o co kaman 🙂
W C++ referencje i adresy zmiennych są dobrze wyszczególnione .
W Javie jak widać, trochę zagmatwane, ale da się uzywać.
Pozdr.
Najlepiej uczyć na przykładach i metaforach, wtedy najwięcej sie rozumie. Przyjmijmy że mamy jakies typy np aut. Mamy osobne typy fiat, porsche. Te typy mogą mieć swoje metody (czyli funkcje) np funkcja kolo1(), czy zderzakPrzedni( ). Referencja to Twoja „zmienna” (np o nazwie auto) dzieki której latwo Ci skojarzyć o jaki z wielu typów mogło Ci chodzić, np możesz utworzyć referencję do typu fiat o nazwie „fiacik” a osobną do typu porsche (bo powiedzmy porsche ma funkcję zderzak() a fiat nie). Referencje są użyteczne przy odwołaniach do typów. Nic więcej. Jesli popełnilem błąd to niech ktoś mnie poprawi.
W tekście, który właśnie czytam nt. Referencji jest bardzo dużo odniesień do rysunków, ale ich nie widzę. O co chodzi? (jestem tu nowy)