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
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
.
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
}
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
} // ...
}
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
Plik z chomika:
Iskraa
Inne pliki z tego folderu:
w5.pdf
(269 KB)
Inne foldery tego chomika:
w1
w10
w11-12
w2
w3
Zgłoś jeśli
naruszono regulamin