![]()
Do tej pory poznaliśmy, czym są klasy i obiekty, jak działają metody oraz jak działa dziedziczenie i polimorfizm w programowaniu obiektowym. W dzisiejszym, krótszym niż zwykle artykule, poznamy klasy abstrakcyjne, które łączą wszystkie te elementy w jeden spójny mechanizm, będąc naturalnym rozszerzeniem dziedziczenia i polimorfizmu. Dzięki nim możemy tworzyć uporządkowany i elastyczny kod, który jest łatwy w rozbudowie i utrzymaniu.
Wprowadzenie
Klasy abstrakcyjne to takie klasy, z których nie można tworzyć obiektów. Jednocześnie służą jako szablon dla klas potomnych. Pozwalają określić wspólne cechy i zachowania, a szczegóły implementacji pozostawiają klasom potomnym. Dzięki temu różne klasy dziedziczące po tej samej klasie abstrakcyjnej mogą wywoływać te same metody w jednakowy sposób, mimo że ich działanie może być różne.
Metody abstrakcyjne i konkretne
W klasach abstrakcyjnych możemy definiować dwa rodzaje metod: abstrakcyjne i konkretne. Dzięki takiemu podziałowi kod staje się spójny i elastyczny.
Metody abstrakcyjne
To deklaracje metod bez implementacji. Mówią, „co” metoda ma robić, ale nie mówią „jak”. Każda klasa dziedzicząca musi je implementować.
Przykład:
abstract class Zwierze {
abstract void wydajDzwiek(); // metoda abstrakcyjna
}
class Pies extends Zwierze {
@Override
void wydajDzwiek() {
System.out.println("Hau Hau!");
}
}
Metody konkretne
To metody z pełną implementacją, które można od razu używać w klasach potomnych. Pozwalają wielokrotnie wykorzystywać kod i zapewniają wspólne zachowanie.
Przykład:
abstract class Zwierze {
void przedstawSie() { // metoda konkretna
System.out.println("Jestem zwierzęciem");
}
}
Klasy abstrakcyjne
Klasa abstrakcyjna pełni rolę szablonu dla innych klas. Nie możemy z niej bezpośrednio tworzyć obiektów, ale możemy po niej dziedziczyć. Dzięki temu klasy potomne korzystają ze wspólnych cech i metod, a jednocześnie ułatwia się polimorfizm.
Na przykład, jeśli mamy klasę abstrakcyjną Zwierze, możemy w niej określić, że każde zwierzę wydaje dźwięk, ale nie musimy od razu mówić, jaki to dźwięk – to zrobią konkretne zwierzęta, jak Pies czy Kot.
Przykład:


Ten przykład pokazuje, jak klasy abstrakcyjne ułatwiają dziedziczenie i polimorfizm – pozwalają wywoływać te same metody dla różnych typów obiektów w spójny sposób.
Klasy abstrakcyjne a zwykłe klasy
Podstawowa różnica polega na tym, że zwykłą klasę można instancjonować, czyli tworzyć jej obiekty. Natomiast klasy abstrakcyjnej nie. Ponadto klasy abstrakcyjne pozwalają definiować metody abstrakcyjne, które muszą być uzupełnione w klasach potomnych. Dzięki temu mamy większą kontrolę nad strukturą aplikacji.
Zwykłe klasy sprawdzają się, gdy wszystkie obiekty mają dokładnie takie same zachowania i nie potrzebujemy wymuszonej implementacji.
Podsumowanie
Klasy abstrakcyjne są naturalnym rozszerzeniem idei klas i obiektów. Pozwalają tworzyć uporządkowany kod, w którym wspólne cechy i zachowania różnych obiektów umieszczamy w jednym miejscu, a szczegóły implementacji pozostawiamy klasom potomnym. Dzięki temu kod staje się bardziej spójny, elastyczny i łatwiejszy w rozbudowie.
Kolejną lekcją w naszym kursie będą agregacja i kompozycja, które pokazują, jak obiekty mogą współpracować ze sobą, zachowując różny stopień zależności między sobą.
Dzięki zrozumieniu klas abstrakcyjnych Twój kod staje się bardziej intuicyjny i modularny. Zamiast powielać podobne funkcje w różnych klasach, tworzysz elastyczne szablony, które łatwo dostosować do nowych wymagań.
O autorze
Tester oprogramowania z pasją do jakości i technologii. Łączy doświadczenie w testach manualnych i automatycznych, koncentrując się przede wszystkim na aplikacjach webowych oraz usługach SOAP i REST. Testowanie to dla niego nie tylko szukanie błędów, ale przede wszystkim kwestionowanie przyjętych założeń i usprawnianie tego, co nie działa – również w samym procesie testowym. Lubi zmieniać, angażować się i aktywnie budować proces testowy, tak by miał sens, a nie tylko formę. Prywatnie fan rocka, biwakowania, podróży.
