Klasa Object – matka wszystkich klas
Wróć do znanej z poprzednich lekcji klasy Cat (może to być też jakakolwiek inna zaimplementowana przez Ciebie klasa) i spróbuj wywołać ją w metodzie main, tak jak na obrazku:
W menu kontekstowym Eclipse widać wszystkie metody dostępne z klasy, którą wywołujesz (w tym przypadku po Cat, a także dziedziczonych po Animal). Jest to logiczne, że używając obiektu danej klasy, masz możliwość korzystania w innej klasie wszystkich pól lub metod, które do niej należą (o ile pozwalają Ci na to akcesory dostępu, takie jak np. public). Pytanie, które już od dawno może Cię nurtować jest, co oznaczają pozostałe metody, pochodzące od klasy Object?
Klasa Object i dziedziczenie
Jak już wiesz, programiści Java uwielbiają upraszczać sobie życie, czasem łamiąc własne reguły. Tak się działo z literałami, czy konstruktorami domyślnymi. Ogólnie takich uproszczeń jest dużo w języku Java. Jednym z nich jest klasa Object. Czyli super klasa, która jest nad wszystkimi innymi. Gdyby narysować drzewo dziedziczenia każdego projektu Java na samym wierzchołku zawsze będzie widnieć ta klasa. Mówiąc wprost, sygnatura omawianej klasy Animal, w wersji bardziej formalnej powinna wyglądać tak:
public abstract class Animal extends Object
Do klasy Cat nie możesz dodać już Object ani żadnej innej klasy, bo język Java nie przewiduje wielodziedziczenia, czyli czegoś takiego:
public class Cat extends Animal, Object
Klasa Object – właściwości
Natomiast nie ma to znaczenia, bo każda klasa jeśli niczego nie dziedziczy to niejawnie ma wpisane końcówkę extends Object. Koniec końców metody tej klasy są dostępne w każdej innej. Zapytasz w końcu, po co taka wszędzie dostępna klasa? Autorzy języka Java stwierdzili, że są metody, które są tak często używane, że przydałoby się, aby były dostępne w każdej innej bez korzystania z polecenia import.*
O to metody, które możesz w niej znaleźć :
- toString – metoda była omówiona na poprzedniej lekcji. Służy do wyświetlania zawartości pól w klasie.
- hashCode – zwraca hasz** danego obiektu.
- equals – porównuje czy zawartość jednego obiektu jest równa zawartości drugiego.
- clone – zwraca kopię danego obiektu.
- getClass – przydatny jak klasa pomocowa, do zwracania metadanych jakiejś klasy.
- finalize – wywołuje 'garbage collector’***, zanim obiekt jest usuwany
- notify, notifyAll i wait – poznasz je bliżej przy lekcji o wielowiątkowości.
* Czy praktyka pokazała, że to ma faktycznie jakiś sens, to już inna sprawa..
** https://pl.wikipedia.org/wiki/Tablica_mieszająca
*** Garbage collector to specjalny proces wirtualnej maszyny Java, służący do 'odśmiecania’ pamięci z nieużywanych referencji do obiektów.
Ta lekcja nie posiada specjalnego kodu, natomiast proponuję powtórzyć sobie informacje o dziedziczeniu: Java #9: dziedziczenie oraz modyfikator protected