Klasa abstrakcyjna to klasa, która nie może tworzyć referencji do obiektów za pomocą operatora new. Klasę abstrakcyjną oznacza się słowem kluczowym abstract.
1 2 3 |
abstract class className { // ... } |
Klasa abstrakcyjna może zawierać deklaracje metod abstrakcyjnych, zwykłe metody, stałe i składowe finalne.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 |
abstract class Example { public static final int PI = 3.14; // deklaracja stałej abstract String Something(); // metoda abstrakcyjna (bez ciała) public void Message() // zwykła metoda { System.out.println("Hello World!"); } } |
Aby lepiej zdefiniować sens abstrakcji w programowaniu posłużmy się przykładem z życia. Klasą abstrakcyjną może być figura geometryczna. Nie wiemy jak wygląda „figura”, dla nas to ogólne pojęcie, abstrakcyjny byt, którego nie potrafimy sobie wyobrazić. Możemy natomiast zdefiniować właściwości owej figury, np: pole powierzchni, obwód, które mogą być dziedziczone przez konkretne klasy potomne (i które możemy sobie wyobrazić 🙂 np: Kwadrat, Prostokat, Trójkąt itd.
Klasa abstrakcyjna jest pewnego rodzaju wzorcem dla klas potomnych.
1 2 3 4 5 |
abstract class Figura { abstract double Pole(); abstract double Obwod(); } |
Klasa Figura zawiera dwie metody abstrakcyjne, które zwracają wartości zmiennoprzecinkowe – double. W odróżnieniu od interfejsów metody abstrakcyjne muszą określać typ zwracanych wartości. Klasy potomne, dziedziczące klasę abstrakcyjną muszą zaimplementować wszystkie jej metody abstrakcyjne. Ponadto klasa abstrakcyjna może posiadać również zwykłe metody, które nie muszą być implementowane w klasach potomnych.
Z powyższego przykładu wiemy już, że klasy potomne będą obliczać pole powierzchni i obwód danej figury. Klasa abstrakcyjna nie podaje konkretów dla metod obliczeniowych, bo każda figura ma przecież inny wzór matematyczny na przeliaczanie tych niewiadomych. Jak widać, jest to elastyczne podejście dające nam dużo swobody w projektowaniu.
Przykłady klas potomnych implementujących klasę abstrakcyjną Figura:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Kwadrat extends Figura { public double a; public double Pole() { return a*a; } public double Obwod() { return 4*a; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Prostokat extends Figura { public double a, b; public double Pole() { return a*b; } public double Obwod() { return 2*a + 2*b; } } |
Użycie klasy abstrakcyjnej i klas dziedziczących jej składowe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class FiguraTest { public static void main(String[] args) { Kwadrat zadanie1 = new Kwadrat(); zadanie1.a = 10; System.out.println("Pole kwadrat = " + zadanie1.Pole()); System.out.println("Obwód kwadrat = " + zadanie1.Obwod()); Prosotkat zadanie2 = new Prostokat(); zadanie2.a = 5; zadanie2.b = 2; System.out.println("Pole prostokąt = " + zadanie2.Pole()); System.out.println("Obwód prostokąt = " + zadanie2.Obwod()); } } |
Czytaj dalej: KONSTRUKTOR →