Informatyka I Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2017
Dziedziczenie klas Dziedziczenie ustanowienie związku pomiędzy klasą bazową a klasą pochodną Celem dziedziczenia jest naśladowanie przez klasę pochodną wybranych cech klasy bazowej (pól oraz metod) Klasa pochodna (subclass) Samochód extends Klasa bazowa (superclass) Pojazd
Idea dziedziczenia Klasa pochodna korzysta z pól oraz metod klasy bazowej oraz może definiować własne Kolor Waga Jedź() Przyspiesz() Zwolnij() Kolor Waga LiczbaDrzwi PojemnośćDilnika TabliceRejestracyjne Jedź() Przyspiesz() Zwolnij() Parkuj() Złomuj() Pojazd Samochód
Modyfikatory dostępu do elementów składowych klasy Klasa może ograniczać dostęp do swoich pól/metod dla obiektów zewnętrznych Klasa zawsze ma dostęp do własnych pól/metod Klasa wewnętrzna ma dostęp do pól/metod klasy zewnętrznej w której została zadeklarowana W pozostałych przypadkach stosowane są tzw. modyfikatory dostępu
Modyfikatory dostępu do pół/metod klasy (c.d.) Modyfikator private protected public Element jest dostępny. tylko wewnątrz klasy wewnątrz klasy oraz klas pochodnych (dziedziczenie) dla wszystkich
Domyślny dostęp do elementów klasy Jeśli przez nazwą pola lub metody klasy nie użyto modyfikatora dostępu w jawnej postaci { private, protected, public }, zakłada się iż element jest dostępny dla wszystkich klas/metod w danym pakiecie
Dostęp do pól/metod klasy pole public, protected private metoda metoda Klasa A pole extends metoda public protected, private pole metoda Klasa B Klasa C
Przykłady deklarowania dostępu do elementów klasy class Samochód { private int przebieg; protected String kolor; public double liczbapasażerów; } public jedź(int odległość) { przebieg += odległość }
Klasą bazową może być klasa zdefiniowana przez użytkownika w kodzie źródłowym programu klasa z bibliotek Java występująca w systemie w postaci skompilowanej oraz dowolna inna klasa nie zadeklarowana jako final (p. dalej) Przykład: z klasy Integer nie można dziedziczyć własnej klasy
Hierarchia klas Klasa pochodna może być klasą bazową dla kolejnej klasy w ten sposób powstaje drzewo klas mających jednego wspólnego przodka Pojazd Samochód Samolot Pociąg Osobowy Dostawczy
Dziedziczenie konstruktorów Konstruktory są dziedziczone automatycznie Jeśli klasa bazowa nie posiada konstruktora bez parametrów, w konstruktorze klasy pochodnej należy wywołać go w jawnej postaci z użyciem słowa kluczowego super super jest wskaźnikiem na obiekt klasy nadrzędnej (przodka)
Przykład dziedziczenia konstruktora
Nadpisanie metody Klasa pochodna może zawierać własną definicję metody już istniejącej w klasie bazowej Zaleca się oznakowanie metody nadpisanej atrybutem @Override W kodzie metody nadpisanej można wywołać metodę klasy bazowej za pomocą super
Przykład nadpisania metody Nadpisanie metod stosuje się w celu zmiany zachowania obiektów w klasach pochodnych
Zmiana modyfikatorów dostępu przy dziedziczeniu Klasa pochodna nie może zmniejszyć uprawnień dostępu do jej elementów dziedziczonych z klasy bazowej Dozwolone jest podniesienie uprawnień protected => public Jest to sprzeczne z klasycznymi zasadami programowania obiektowego, gdyż pozwala na uzyskanie dostępu do chronionych elementów klasy // przyp. A.C.
Generalizacja typów danych Generalizacja (uogólnianie) posługiwanie się obiektem klasy pochodnej za pomocą typu klasy bazowej (bardziej ogólnej) class Lokomotywa extends Pojazd class Pojazd class Samochod extends Pojazd
Metody abstrakcyjne W klasie bazowej można zadeklarować metodę wspólną dla wszystkich klas pochodnych Realizacja tej metody w ogólnej postaci może być trudna lub niemożliwa Metoda abstrakcyjna - metoda, treść której zostanie zrealizowana w klasach pochodnych
Klasa abstrakcyjna Klasa zawierająca przynajmniej jedną metodę abstrakcyjną, nazywa się klasą abstrakcyjną Egzemplarza (obiektu) klasy abstrakcyjnej nie można stworzyć!
Realizacja metody abstrakcyjnej w klasach pochodnych Klasa dziedzicząca z klasy abstrakcyjnej, powinna realizować wszystkie metody abstrakcyjne klasy bazowej Jeśli klasa nie realizuje przynajmniej jednej metody abstrakcyjnej, staje się również klasą abstrakcyjną!
Słowo kluczowe final Zastosowane do metody lub pola klasy: Oznacza że nie mogą być one modyfikowane w klasach pochodnych (wykluczenie możliwości nadpisania funkcji) Zastosowane do całej klasy: nie można z tej klasy dziedziczyć
Wskaźnik na obiekt bieżący this W jednym segmencie kodu mogą wystąpić dwie zmienne o identycznej nazwie ale różnym zasięgu W celu jawnego wskazania na pole klasy należy wówczas użyć this class Samochód() { int przebieg; Samochód(int przebieg) { this.przebieg = przebieg; }
Statyczne pola klasy Pole klasy domyślnie przechowuje indywidualną wartość dla każdego egzemplarza (obiektu) klasy Jeśli pole ma być wspólnych dla wszystkich obiektów, należy zadeklarować go jako statyczne
Wykorzystanie statycznego pola na zewnątrz klasy Adresacja statycznego pola klasy następuje poprzez nazwę klasy (nie nazwę obiektu!)
Statyczne metody Metoda wspólna dla wszystkich obiektów klasy nazywa się statyczną metodą Statyczna metoda należy do klasy, nie do obiektu Statyczna metoda nie może korzystać z pól oraz metod klasy innych niż statyczne (nie zmienia stanu obiektu!)
Klasy wewnętrzne Klasa w Javie może być zadeklarowana wewnątrz innej klasy Klasa wewnętrzna ma dostęp do pól i metod klasy zewnętrznej
Podsumowanie Cel dziedziczenia: zwiększenie wydajności pracy programisty oraz zbudowanie programu stabilnego, skalowalnego oraz łatwego do opanowania poprzez Rozszerzenie funkcjonalności klasy bazowej Eliminację powtarzającego się kodu w klasach pochodnych Zachowanie wspólnych cech obiektów Metody nadpisane pozwalają na realizację odmiennego zachowania klas w hierarchii Klasy abstrakcyjne realizują fundament hierarchii