Jason. Cała informatyka w jednym miejscu!

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.

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" w języku Java

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!

PODOBNE ARTYKUŁY