Get the Flash Player to see this player.

time2online Joomla Extensions: Simple Video Flash Player Module
Dziedziczenie

Przerzucając się z języków proceduralnych na języki obiektowy często tworzymy nowy kod przy użyciu starego. Najczęściej kopiujemy całe wiersze kodu lub używamy wcześniej stworzonych funkcji w nowych funkcjach, tym samym poszerzając funkcjonalność nowych funkcji. Było to normalne podejście w językach proceduralnych. Takie podejście również jest dozwolone w językach obiektowych i nazywa się kompozycją. Większość naszych programów zapewne będzie tworzone przy użyciu właśnie kompozycji.

W językach obiektowych, aby poszerzyć jakąś klasę o nową funkcjonalność wystarczy zastosować dziedziczenie używając słowa extends. Dzięki dziedziczeniu nowo powstała klasa jest praktycznie identyczna z klasą bazową, czyli automatycznie posiada te same metody i zmienne. Jeśli jakąś metodę chcemy zmodyfikować, to wystarczy zadeklarować ją w klasie dziedziczonej. Do klasy dziedziczone można także dodawać nowe metody i tym samym zwiększać jej funkcjonalność.

Prosty przykład dziedziczenia zaprezentowałem poniżej. Najpierw tworzymy klasę Czyszczenie i rozszerzamy ją o nowe metody:

class Czyszczenie{
private String s = "czyszczenie klasa:";
 public void append(String a) {s+=a;}
 public void polerka() {append("polerowanie");}
 public void szorowanie() {append("szorowanie");}
 public String toString() {return s;}
 public static void main(String[] args){
Czyszczenie x = new Czyszczenie{};
 x.polerka();
 x.szorowanie();
 System.out.println(x);
}
public class Chemia extends Czyszczenie{
//dodanie nowej metody
 public void detergenty() {append("czyszczenie detergentami");}
//napisanie metody
 public void szorowanie(){
 append("Chemia metoda nadpisana");
 super.szorowanie();} //wywołanie metody klasy bazowej z poziomu klasy rozszerzonej
//Test nowej klasy pochodnej
 public static void main(String[] args){
 Chemia x = new Chemia();
 x.polerka();
 x.detergenty();
 System.out.println(x);
 System.out.println("Test klasy bazowej"); 
 Czyszczenie.main(args);
}
}

Widzimy, że wykorzystaliśmy w metodzie append() operator +=, który został przeciążony przez projektantów Javy taka, aby pracował z łańcuchami znaków.

W kodzie występuje także metoda toString(), która jest standardową metodą. Dzięki niej można wyświetlić stringa używając referencji do obiektu, tak jak to jest robione w tej linijce System.out.println(x). W języku Java wszystkie klasy mają jeden korzeń, czyli jeśli tworzymy jakaś klasę, to ona automatycznie dziedziczy po klasie Object. Takie podejście daje nam kilka zalet, jedną z takich zalet jest właśnie uzyskanie kilku standardowych metod takich jak toString  oraz kompatybilność wszystkich obiektów co wykorzystuje się w polimorfizmie. Polimorfizm jest ściśle związany z dziedziczeniem i postaram opisać się go w następnym artykule.

Widzimy także, że metoda szorowanie występuje w obu klasach. Czyli po prostu ta metoda została nadpisana. Słowo super.szorowanie wywołuje metodę (szorowanie) klasy bazowe (czyszczenie). Czyli słowo super służy do odwoływania się do klasy bazowe i można je także stosować do wywołania konstruktora klasy bazowe, ale tylko wtedy gdy słowo super występuje jako pierwsze słowo w konstruktorze klasy pochodnej.

W przykładzie widać wywołanie Cleanser.main() bezpośrednio z metody.main() z podaniem tych samych argumentów wiersza poleceń.