Dziedziczenie dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com
Dziedziczenie
specjalizacja Dziedziczenie generalizacja Generalizacja-specjalizacja jest takim związkiem pomiędzy klasami, który łączy klasę bardziej ogólną z jedną lub więcej klas, będących jej specjalizacjami. Klasa, będąca specjalizacją danej klasy, oprócz własności nadklasy może posiadać (i z reguły posiada) też własności swoje. pole atrybutów Osoba nazwisko data ur. wiek pole nazwy klasy pole metod Pracownik pensja Asystent Adiunkt Docent Profesor
Dziedziczenie Dziedziczenie jest to mechanizm paradygmatu programowania obiektowego Przejmowanie stanu (pola) oraz zachowań (metody) obiektu z którego się dziedziczy Tworzenie kategorii (generalization): Klasa bazowa stanowi kategorię (rodzinę typów) na bazie której mogą być tworzone inne typy Nadpisywanie (overriding): zmienianie znaczenia zachowania się typu, z którego dziedziczmy Ponowne wykorzystanie kodu (co-reuse), w innych typach. Dziedziczone są wszystkie elementy klasy nadrzędnej z wyjątkiem konstruktorów. Konstruktor klasy bazowej mogą być wołane z klasy, która dziedziczy. Odwołanie do członków klasy bazowej po przez super. Wołanie konstruktora klasy bazowej: super(); Dwa określenia: klasa bazowa (super klasa, nadklas) i klasa potomna (podrzędna, podklasa) Pole Obwód x y Prostokąt FIGURA Pole Obwód Pole Obwód Pole Obwód obwód promień Koło
Jednokrotne dziedziczenie W Javie można stosować wyłącznie jednokrotne dziedziczenie. Co można robić na poziomie podklasy: Dziedziczone pola mogą być używane bezpośrednio w podklasie Można deklarować zmienne w podklasie o nazwach takich jak w klasie bazowej. Możliwość deklaracji pól w klasie podrzędnej, które nie są w klasie bazowej. Odziedziczone metody mogą być wykorzystywane w klasie podrzędnej bezpośrednio. Możliwość nadpisywania metod z klasy nadrzędnej po przez identyczną deklarację. Możliwość deklaracji metody statycznej w klasie podrzędnej, która przykryje metodę z klasy nadrzędnej Możliwość deklaracji nowych metod w podklasie. Możliwość napisania konstruktora w podklasie, który wywoła konstruktor klasy bazowej.
Typ Object jako przykład klasy bazowej Klasa Object znajduje się na samej górze hierarchii dziedziczenia. Wszystkie klasy dziedziczą po Object. Klasa Object udostępnia zbiór metod, które powinny w miarę potrzeby zostać przeładowane w tworzonych klasach. Przykłady: protected Object clone() throws CloneNotSupportedException Implementuje interfejs Clonable. public boolean equals(object obj) wykorzystywana do porównania dwóch obiektów. W podstawowej implementacji tej metody użyto operatora ==, który daje poprawne wyniki dla typów prymitywnych (porównanie wyłącznie referencji, tzn. czy to ten sam obiekt). Dlatego znając specyfikę klasy należy przeładować tą metodę. protected void finalize() throws Throwable wołana w przypadku, gdy obiekt jest niszczony przez Garbage Collector. public final Class getclass() zwraca nazwę klasy. public int hashcode() zwraca kod klasy w postaci heksadecymalnej. public String tostring()
Modyfikatory i rzutowanie obiektów Podklasa nie dziedziczy elementów klasy bazowej z modyfikatorem private Podklasa dziedziczy elementy klasy bazowej z modyfikatorem protected Należy starać się stosować możliwe najbardziej restrykcyjny modyfikator dostępu. Możliwość rzutowania obiektu klasy podrzędnej na typ obiektu klasy bazowej; Możliwość wymuszonego rzutowania np.: Rower rower = new Rower(); Object obj = new Rower(); Rower newrower = obj; (BŁĄD) kompilator nie wie do jakiego typu został przypisany błąd. Jeśli obj nie jest typu Rower zostanie rzucony wyjątek. Rower newrower = (Rower) obj; W celu zabezpieczenia się przed błędnym rzutowaniem można wykonać następujący test logiczny: if (obj instanceof Rower) { Rower mybike = (Rower)obj;
Nadpisywanie i ukrywanie metod Metoda podklasy z taką samą sygnaturą (nazwa oraz lista parametrów) oraz z tym samym zwracanym typem nadpisuje (override) metodę z klasy bazowej Nadpisywanie pozwala korzystać z typów, które są dla nas prawie wystarczające natomiast częściowo chcemy zmienić ich zachowanie W przypadku wystąpienia w podklasie pól o takich samych nazwach jak w klasie bazowej następuje ich przykrycie przez pola z podklasy. Odwołanie do tych pól możliwe jedynie przez super Uwaga! Jeśli nie chcemy, aby dana metoda została nadpisana należy ją zadeklarować z modyfikatorem final. Również jeśli nie chcemy, aby dana klasa była rozszerzana stosujemy final.
Dziedziczenie
Dziedziczenie
Rozszerzanie klas
Klasa bazowa java.lang.object
Przesłanianie a klasa java.lang.object
Przesłanianie a klasa java.lang.object
Projektowanie obiektowe przykład 1
Projektowanie obiektowe przykład 1
Projektowanie obiektowe przykład 1
Użycie słowa kluczowego super class Pudelko { double szerokosc; double wysokosc; double glebokosc; Pudelko() { szerokosc = -1; wysokosc= - 1; glebokosc =-1;... Pudelko(Pudelko p) { szerokosc = p.szerokosc; wysokosc = p.wysokosc; glebokosc = p.glebokosc;
Użycie słowa kluczowego super class PudelkoPlus extends Pudelko { double ciezar;... PudelkoPlus() { super(); ciezar = 0;
Odwołanie do nadklasy przez super Stosuje się szczególnie, gdy składowe podklasy przesłaniają składowe nadklasy o tych samych nazwach super.pole super.metoda()
Przykład użycia słowa super class A { protected int i; Przesłonięcie pola w nad-klasie: class B extends A { private int i; B(int a, int b) { super.i = a; i = b;
Słowo final Klasa deklarowana jako final nie posiada potomków, nie wolno po niej dziedziczyć. final class A {... Ta klasa jest nielegalna: class B extends A {...
Słowo final c.d. Metodę deklarowaną jako final w nad-klasie nie wolno przesłaniać w pod-klasie: class A { final void meth() { System.out.println("Metoda final"); class B extends A { void meth() { System.out.println("Nielegalne!");
Tak, to już KONIEC Dziękuję za uwagę!