Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Podobne dokumenty
Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Klasy abstrakcyjne i interfejsy

Dziedziczenie. dr Jarosław Skaruz

Aplikacje w środowisku Java

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

TEMAT : KLASY DZIEDZICZENIE

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Typy sparametryzowane

Programowanie obiektowe

Programowanie obiektowe - 1.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Dokumentacja do API Javy.

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Dziedziczenie. Zadanie 1

Technologie i usługi internetowe cz. 2

Wprowadzenie do programowanie obiektowego w języku C++

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Wykład 8: klasy cz. 4

Rozdział 4 KLASY, OBIEKTY, METODY

Dziedziczenie jednobazowe, poliformizm

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Kompozycja i dziedziczenie klas

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Enkapsulacja, dziedziczenie, polimorfizm

Materiały do zajęć VII

Wykład 6: Dziedziczenie

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Polimorfizm. dr Jarosław Skaruz

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Programowanie obiektowe

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 12

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

PARADYGMATY PROGRAMOWANIA Wykład 4

Języki i techniki programowania Ćwiczenia 4 Wzorce

Języki i metody programowania Java. Wykład 2 (część 2)

Platformy Programistyczne Podstawy języka Java

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie obiektowe

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Aplikacje w środowisku Java

Dziedziczenie jednobazowe, poliformizm, tablice wskaźników na obiekty

Podstawy Programowania Obiektowego

Wykład 5 Okna MDI i SDI, dziedziczenie

Mechanizm dziedziczenia

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Wykład 5: Klasy cz. 3

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Zaawansowane programowanie w C++ (PCP)

Wykład 9: Polimorfizm i klasy wirtualne

Kurs WWW. Paweł Rajba.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie, część I

Wykład 4: Klasy i Metody

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Język C++ zajęcia nr 2

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Dziedziczenie Dana jest klasa Punkt w pliku o nazwie Punkt.java:

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Programowanie obiektowe

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Pola i metody statyczne

Programowanie obiektowe

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Programowanie Obiektowe i C++

Mechanizm dziedziczenia

Java Język programowania

Programowanie obiektowe

Język C++ Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Programowanie obiektowe

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Przypomnienie o klasach i obiektach

Definiowanie własnych klas

Oracle PL/SQL. Paweł Rajba.

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

1 Dziedziczenie. 1.1 Koncepcja dziedziczenia. Ćwiczenie 3

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Transkrypt:

Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik Na potrzeby wykładu nie przedstawiamy ich pełnych charakterystyk, pomijając na przykład ważne dane jakim jest semestr studiów w przypadku studentów czy wykładane przedmioty w przypadku pracowników. Wygenerowanie obiektu reprezentującego pewnego pracownika może wyglądać następująco: Pracownik p = new Pracownik(); p.nazwisko = "Nazwisko"; p.rokurodzenia = 1960; p.pensja = 3512.0; Zauważmy, że część pól zadeklarowanych w obu klasach powtarza się (nazwisko oraz rokurodzenia). Są to wspólne cechy opisujące studentów i pracowników najpierw jako osoby. Wydaje się zatem sensowne wydzielenie pewnej struktury przechowującej tylko dane osobowe. Przy podejściu strukturalnym można wydzielić klasę Osoba dokładając odpowiednie pola do obu klas Student oraz Pracownik, pola charakterystyczne tylko dla tych klas. 1

class Osoba class Student Osoba daneosobowe; class Pracownik Osoba daneosobowe; Wprawdzie płacimy definiując dodatkową klasę (Osoba), ale unikamy powtarzania deklarowania identycznych pól w różnych klasach. W omawianym przykładzie powtarzane były tylko dwa pola. Wydaje się, że strata niewielka. Ale gdybyśmy osoby opisywali jeszcze innymi cechami (np. miejsce urodzenia, PESEL, adres zamieszkania, itp), powtórzeń byłoby wiele więcej. W przypadku wydzielenia klasy Osoba wygenerowanie obiektu reprezentującego pewnego pracownika może wyglądać następująco: Pracownik p = new Pracownik(); p.daneosobowe = new Osoba(); p.daneosobowe.nazwisko = "Nazwisko"; p.daneosobowe.rokurodzenia = 1960; p.pensja = 3512.0; Java, jako język obiektowy, udostępnia inny mechanizm budowania klas z klas już zdefiniowanych, mechanizm zwany dziedziczeniem. Znamy go już z języka C++. W Javie występują jednak pewne znaczące różnice w stosunku do dziedziczenia w C++. Zacznijmy od syntaktyki. W celu wskazania klasy nadrzędnej stosuje się słowo extends, w postaci: class Osoba 2

class Student extends Osoba class Pracownik extends Osoba Pola klasy Osoba (nazwisko oraz rokurodzenia) są dostępne w klasach potomnych bez konieczności ich deklarowania ani explicite ani poprzez dodatkowe pole (np. daneosobowe). Pewnego pracownika można zatem wygenerować następująco: Pracownik p = new Pracownik(); p.nazwisko = "Nazwisko"; p.rokurodzenia = 1960; p.pensja = 3512.0; Dostęp do pól nazwisko oraz rokurodzenia jest bezpośredni, tak jakby były one zadeklarowane w klasie Pracownik. Java jest językiem jednobazowym. To znaczy, że dowolna klasa może mieć co najwyżej jednego przodka bezpośredniego. Ponadto istnieje klasa Object, która jest domyślnie przodkiem każdej innej klasy, nawet jeśli nie jest zapisana w kodzie programu. Dziedziczenie metod Przykłady przedstawiane do tej pory prezentowały wyłącznie dziedziczenie pól. Java, tak jak inne języki obiektowe, umożliwiają również dziedziczenie metod. Metody zdefiniowane w klasach nadrzędnych są dostępne również w ich potomkach. Rozbudujmy klasę Osoba o metodę wiek obliczającą wiek osoby w roku przekazanym jako argument: class Osoba int wiek (int rokbiezacy) return rokbiezacy - rokurodzenia; Możemy ją wykorzystać do obliczenia wieku naszego pracownika w roku na przykład 2012: 3

Pracownik p = new Pracownik(); p.nazwisko = "Nazwisko"; p.rokurodzenia = 1960; p.pensja = 3512.0; System.out.println(p.wiek(2012)); Metody dziedziczone z klas nadrzędnych mogą być nadpisywane w klasach podrzędnych. Nadpisywane, to znaczy zmieniane ich definicje, przy zachowaniu ich deklaracji. Ale tym tematem zajmiemy się na następnym wykładzie przy omawianiu polimorfizmu. Konstruktory Zmodyfikujmy klasę Osoba wprowadzając dwuargumentowy konstruktor: class Osoba Osoba (String n, int r) nazwisko = n; rokurodzenia = r; Taka modyfikacja powoduje, że kompilator zgłasza błędy: Dziedziczenie.java:12: cannot find symbol symbol : constructor Osoba() location: class Osoba class Student extends Osoba Dziedziczenie.java:21: cannot find symbol symbol : constructor Osoba() location: class Osoba class Pracownik extends Osoba Co się stało? Obiekty klas pochodnych składają się z dwóch części: pól odziedziczonych z klasy nadrzędnej oraz pól zadeklarowanych w danej klasie. Zatem, aby poprawnie skonstruować obiekt, należy najpierw poprawnie skonstruować pola odziedziczone, a następnie pola dodeklarowane. Ponieważ klasa nadrzędna (Osoba) posiada konstruktor dwuargumentowy, konstruktor domyślny nie jest generowany, a zatem musimy wykorzystać mechanizm wywołania konstruktora nadklasy z konstruktora klasy. W C++ tym mechanizmem 4

była lista inicjalizacyjna konstruktorów. W Javie rolę tę spełnia konstrukcja super(). Wszystkie klasy pochodne klasy Osoba, tj. Student i Pracownik muszą posiadać własne konstruktory, w których wykorzystuje się super(): class Student extends Osoba Student (String n, int r, int iloscocen) super(n,r); oceny = new double[iloscocen]; class Pracownik extends Osoba Pracownik (String n, int r, double p) super(n,r); pensja = p; Oczywiście taka modyfikacja klas wymaga modyfikacji ich użycia: Pracownik p = new Pracownik("Nazwisko",1960,3512.0); Przy użyciu konstrukcji super() należy pamiętać, że musi to być pierwsze wywołanie w ciele konstruktora, z którego wywołuje się super(). Jeśli konstruktor wykonuje inne instrukcje, muszą być one wykonane po wywołaniu super(). Co wynika z dziedziczenia? Budując klasy z innych klas stosując dziedziczenie tworzy się drzewo typów. W rezultacie obiekty klas pochodnych mają wiele typów typ klasy, dla której obiekt został wygenerowany przy pomocy operatora new, oraz typy wszystkich klas nadrzędnych danej klasy. W naszym przykładzie, każdy obiekt reprezentujący pracownika (obiekt klasy Pracownik), reprezentuje też osobę (obiekt klasy Osoba), reprezentuje też obiekt (obiekt klasy Object). Co z tym się wiąże poprawne są następujące instrukcje przypisania: Pracownik p1 = new Pracownik("Nazwisko",1960,3512.0); Osoba p2 = new Pracownik("Nazwisko",1960,3512.0); Object p3 = new Pracownik("Nazwisko",1960,3512.0); 5

Rozróżniamy tu klasy, dla których dana referencja (obiekt) została zadeklarowana od klas, dla których obiekt został wygenerowany, np: p3 została zadeklarowana dla klasy Object, a wskazuje na wygenerowany obiekt klasy Pracownik. Rozróżnianie klas, dla których się deklaruje od klas, dla których się generuje obiekty, choć w wielu aplikacjach wygodne, ma pewne ograniczenie. Odwołać się można tylko do tych pól i metod obiektu, które są dostępne w klasie, dla której referencję się deklaruje, a nie generuje obiekt. To znaczy, wykonania: System.out.println(p1.wiek(2012)); System.out.println(p2.wiek(2012)); są poprawne, natomiast System.out.println(p3.wiek(2012)); nie. Metoda wiek() nie jest dostępna w klasie Object. 6

Kompletny przykład class Osoba Osoba (String n, int r) nazwisko = n; rokurodzenia = r; int wiek (int rokbiezacy) return rokbiezacy - rokurodzenia; class Student extends Osoba Student (String n, int r, int iloscocen) super(n,r); oceny = new double[iloscocen]; class Pracownik extends Osoba Pracownik (String n, int r, double p) super(n,r); pensja = p; Pracownik p1 = new Pracownik("Nazwisko",1960,3512.0); Osoba p2 = new Pracownik("Nazwisko",1960,3512.0); Object p3 = new Pracownik("Nazwisko",1960,3512.0); System.out.println(p1.wiek(2012)); System.out.println(p2.wiek(2012)); 7

Podsumowanie Dziedziczenie uzyskuje się stosując extends. Dziedziczy się pola i metody. Java jest językiem jednobazowym. Klasa Object jest przodkiem każdej innej klasy. Jeśli klasa bazowa posiada własny konstruktor, w konstruktorach klas potomnych stosuje się super(). super() musi być pierwszym wywołaniem w konstruktorze. Po operatorze dostępu (.) można podać pola i metody dostępne w klasie, dla której obiekt się deklaruje, a nie generuje. Wygenerowany obiekt ma wiele typów typ klasy, dla której obiekt został wygenerowany przy pomocy operatora new, oraz typy wszystkich klas nadrzędnych danej klasy. 8