Czas poruszyć wątek dziedziczenia :O! Jest to kolejny element stanowiący zakres podstawowego rozumienia Javy. Dziedziczenie w języku Java to fundament w paradygmacie obiektowym. Na czym on polega? Jak on działa w programie? Jak go dostrzec w kodzie? Spokojnie, jedno zagadnienie po drugim zostanie tu wytłumaczone :D.
Tweet |
JAK W DUŻYM SKRÓCIE WYGLĄDA DZIEDZICZENIE W JĘZYKU JAVA?
Jak wspomniałem wcześniej, klasa to szablon dla tworzonych obiektów. Klasa może również rozszerzać o inną klasę będącą wyżej w hierarchii. Chodzi o możliwość "odziedziczania" danych składowych i metod z klasy nadrzędnej bez konieczności duplikowania tych samych metod i zmiennych. Poświęcono kilka słów kluczowych dotyczących dziedziczenia, które będziemy rozpatrywać w przyszłych artykułach, a na razie skupimy się na najważniejszym: "extends". Słowo "extends" (ang. rozszerza) dodane po podaniu nazwy klasy, umożliwia dziedziczenie od innej już istniejącej klasy. W efekcie końcowym, dysponujemy wszystkimi danymi składowymi i metodami znajdującymi się w klasie dziedziczonej objęte modyfikatorem "public" lub "protected" (rzadko stosowany), choć warto wiedzieć że to nie jest jego jedyne przeznaczenie. W Javie odziedziczanie od wielu klas pod rząd jest niemożliwe! Po słowie "extends" następuje podanie TYLKO JEDNEJ nazwy klasy. Kiedy klasa dziedziczy od innej, mówimy o niej że jest klasą potomną.
PRZYKŁAD KODU ŹRÓDŁOWEGO
Tyle teorii na początek wystarczy. Oto przykładowy program wykorzystujący banalne dziedziczenie w języku Java:
KLASA "MAIN"
public class Main {
public static void main(String[] args) {
BaseClass bc = new BaseClass();
ChildClass cc = new ChildClass();
bc.x = 5;
cc.x = 67;
bc.printX();
cc.printX();
}
}
KLASA "BASECLASS"
public class BaseClass {
public int x;
private int y;
public void printX() {
System.out.println("Moja dana składowa \"x\" wynosi " + x);
}
private void printY() {
System.out.println("Moja dana składowa \"y\" wynosi " + y);
}
}
KLASA "CHILDCLASS"
public class ChildClass extends BaseClass {
}
Mamy tu dwie klasy: "BaseClass", która jest klasą bazową i "ChildClass", która jest klasą potomną klasy "BaseClass". Klasa "BaseClass" posiada dwie dane składowe: "x" i "y". Jedna jest publiczna, a druga prywatna. Wybór modyfikatora dostępu jest bardzo ważny i decyduje o tym, czy dana składowa lub metoda "przeniesie się" na klasę potomną. Publiczne będą widoczne w klasie potomnej, prywatne zostaną tylko w klasie bazowej. Dlatego też można przedostać się do zmiennej "x" zarówno w klasie bazowej, jak i potomnej i to nawet na zewnątrz obu klas (co jest niedopuszczalne w paradygmacie obiektowym!), a zmienna "y" siedzi głęboko zaszyta i nie ma do niej dostępu nikt poza tą klasą. To samo dotyczy metod.
Z reguły wszystkie dane składowe powinny być osłaniane przed zewnętrzną modyfikacją, a ich modyfikowanie powinno się odbywać wewnątrz metod publicznych! A to dlatego, aby uniknąć ujawniania implementacji przed użytkownikami Waszego kodu. Odgrywa to bardzo ważną rolę kiedy wypuszczacie jakąś aktualizację swojego kodu, a ktoś inny go wykorzystuje w swoim projekcie. Naruszenie struktury danych składowych poprzez choćby zmianę nazwy, spowodowałaby pojawienie się wielu problemów i wymuszenie na człowieku dostosowanie się do zaistniałych zmian. Ukrywając zmienne przed światem zewnętrznym i "opakowując" operacje na nich w metody, znacznie redukujemy wyżej wymieniony problem, przez może się zakończyć na zmianie nazwy metody z jakiej się korzysta.
Słowo kluczowe "extends" przeznaczone jest (między innymi) do wyznaczania klasy, od której będzie się odbywać dziedziczenie w języku Java przez klasę potomną.
Na razie kończymy na ten moment, aczkolwiek to jest dopiero wierzchołek góry lodowej. W kolejnej części epizodu porozmawiamy o abstrakcyjności :O!