w5.pdf

(269 KB) Pobierz
Microsoft PowerPoint - w5.ppt
Wykład 5
Dziedziczenie (rozszerzanie klas)
Podstawowe pojęcia
Konstruktory i finalizatory klas rozszerzonych
Polimorfizm
Typy i podtypy
Zastępowanie metod
Interfejsy i klasy abstrakcyjne
Przesłanianie pól i metod statycznych
Ponowne wykorzystanie klas: złożenie i dziedziczenie
Wyjątki
Zgłaszanie, przechwytywanie i obsługa wyjątków
Informacje diagnostyczne wyjątków
Klasy generyczne (Java 5.0)
Przykład: stos
645495564.003.png
Dziedziczenie
Istota programowania obiektowego polega na tworzeniu nowych
abstrakcyjnych typów danych jako rozszerzeń typów już istniejących,
korzystając z mechanizmu dziedziczenia (rozszerzania klas).
Czworokąt
Równoległobok
Trapez
Trapezoid
Romb
Prostokąt
Trapez
równoramienny
Deltoid
Kwadrat
W powyższym diagramie strzałka oznacza relację „jest”. Np. prostokąt
jest równoległobokiem, czyli każdy obiekt klasy Prostokąt jest
również obiektem klasy Równoległobok . Mówimy, że podklasa
(ang. subclass) lub klasa rozszerzona (ang. extended class)
Prostokąt dziedziczy (ang. inherits) z nadklasy (ang. superclass)
Równoległobok .
645495564.004.png
Podstawowe pojęcia
Dziedziczenie definiuje przechodnią relację między klasami i jest mechanizmem
umożliwiającym ponowne wykorzystanie kodu i rozszerzanie funkcjonalności nadklasy.
Wszystkie składowe publiczne i chronione nadklasy są dostępne w każdej z jej podklas.
Składowe chronione są również dostępne w ramach pakietu. W Javie istnieją trzy formy
dziedziczenia: rozszerzanie klas, rozszerzanie interfejsów i implementacja interfejsów.
Rozszerzanie klas tworzy drzewiastą hierarchię między klasami z klasą Object w
korzeniu. Każda klasa (oprócz klasy Object ) ma dokładnie jedną nadklasę.
Deklaracja klasy:
[ ModyfikatoryKlasy ] class NazwaKlasy [ extends Nadklasa ]
[ implements Interfejs 1 , Interfejs 2 …]
{ DeklaracjeSkładowychKlasy }
645495564.005.png
Konstruktory i finalizatory klas rozszerzonych
Konstruktory nadklasy nie są dziedziczone przez podklasę, jednak można się do nich odwołać przez
referencję super( ... ) .
Konstruktor podklasy zawsze wywołuje konstruktor nadklasy zanim stworzy i zainicjuje dane
składowe własnej klasy. Jawne wywołanie konstruktora nadklasy (przez referencję super ) musi
być pierwszą instrukcją konstruktora podklasy. W przeciwnym razie wywoływany jest domyślny
(bezargumentowy) konstruktor nadklasy. Jeśli nadklasa nie ma konstruktora domyślnego,
kompilator zgłasza błąd.
Metoda finalize podklasy powinna wywołać metodę finalize nadklasy jako swoją ostatnią
akcję, w celu poprawnego sfinalizowania odziedziczonych składowych.
public class Nadklasa
{ int x = ...; // wykonywane jako pierwsze
public Nadklasa()
{ x = ...; // wykonywane jako drugie
} // ...
}
public class Podklasa extends Nadklasa
{ int y = ...; // wykonywane jako trzecie
public Podklasa()
{ super();
y = ...; // wykonywane jako czwarte
} // ...
}
645495564.006.png
Podtypy
Typ T 1 jest podtypem typu T 2 ( T 1 T 2 ), jeśli każda dopuszczalna wartość typu T 1 jest
dopuszczalna wartością typu T 2 , który jest wówczas nadtypem typu T 1 .
Reguła podciągania (ang. subsumption rule) oraz zwrotności i przechodniości dla
podtypów:
M
σ
σ
τ
τ
τ
2
τ
2
τ
M
:
τ
τ≤
τ
τ
1
τ
3
W kontekście klas i obiektów reguła podciągania mówi, że egzemplarza podklasy
może zawsze użyć w kontekście, w którym oczekiwany jest egzemplarz nadklasy.
Konwersje typów
Java jest językiem ze ścisłą kontrolą typów, wykonywaną w czasie kompilacji.
Niejawne konwersje typów są wykonywane zgodnie z regułami dla podtypów.
Potencjalnie niebezpieczne konwersje wymagają zawsze jawnego użycia
operatora rzutowania. Konwersje typów prostych (np. z int do double )
powodują zmianę reprezentacji wewnętrznej konwertowanych wartości.
Konwersja typów referencyjnych (do obiektów) nie powoduje jakichkolwiek zmian
w reprezentacji obiektu.
:
1
3
645495564.001.png 645495564.002.png
Zgłoś jeśli naruszono regulamin