Dziedziczenie. Tomasz Borzyszkowski

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

Wykład 6: Dziedziczenie

Dziedziczenie. dr Jarosław Skaruz

Klasy abstrakcyjne i interfejsy

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

Definicje klas i obiektów. Tomasz Borzyszkowski

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

Polimorfizm. dr Jarosław Skaruz

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

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Klasy abstrakcyjne, interfejsy i polimorfizm

Pakiety i interfejsy. Tomasz Borzyszkowski

Kurs WWW. Paweł Rajba.

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

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

Aplikacje w środowisku Java

Dokumentacja do API Javy.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

.NET Klasy, obiekty. ciąg dalszy

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

Programowanie w Internecie. Java

Enkapsulacja, dziedziczenie, polimorfizm

Projektowanie obiektowe. Roman Simiński Polimorfizm

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

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Wykład 9: Polimorfizm i klasy wirtualne

Programowanie obiektowe - 1.

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

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

Programowanie obiektowe

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

Programowanie obiektowe

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

TEMAT : KLASY DZIEDZICZENIE

Dziedziczenie i interfejsy

Programowanie w Javie - wykład 3

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

Interfejsy i klasy wewnętrzne

Wykład 5 Okna MDI i SDI, dziedziczenie

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

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

Programowanie obiektowe i zdarzeniowe

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Platformy Programistyczne Podstawy języka Java

Java Język programowania

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

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

Rozdział 4 KLASY, OBIEKTY, METODY

Technologie i usługi internetowe cz. 2

Wykład 7: Pakiety i Interfejsy

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

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Programowanie w Javie wykład 7 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Bloki inicjalizacyjne

Programowanie obiektowe

Materiały do zajęć VII

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Podstawy Programowania semestr drugi. Wykład czternasty

Dziedziczenie jednobazowe, poliformizm

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

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

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Programowanie obiektowe

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

Programowanie obiektowe

Język C++ Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe

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

java.util.* :Kolekcje Tomasz Borzyszkowski

Programowanie 2. Język C++. Wykład 3.

Typy sparametryzowane

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie, część I

Programowanie 2. Język C++. Wykład 9.

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Czym jest polimorfizm?

JAVA- wykład 2 Klasy

Definiowanie własnych klas

Programowanie obiektowe

Wykład 4: Klasy i Metody

Wykład 8: klasy cz. 4

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

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

10. Programowanie obiektowe w PHP5

Języki i techniki programowania Ćwiczenia 2

PHP 5 język obiektowy

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Template method (metoda szablonowa)

Programowanie w Javie wykład 8 Interfejsy

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

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

Podstawy programowania obiektowego w języku Java dla programujących w C++

KLASY, INTERFEJSY, ITP

Transkrypt:

Dziedziczenie Tomasz Borzyszkowski

Podstawy Zobacz: Dziedzictwo1.java Dziedzictwo2.java Dziedziczenie jest jedną z podstawowych cech OOP ponieważ umożliwia łatwe implementowanie klasyfikacji hierarchicznych. W OOP klasę dziedziczoną nazywamy klasą nadrzędną (superclass), natomiast klasę dziedziczącą klasą podrzędną (subclass). Klasa podrzędna jest wyspecjalizowaną wersją klasy nadrzędnej. Dziedziczy ona wszystkie zmienne instancyjne i metody zdefiniowane w klasie nadrzędnej. Sama dodaje swoje specyficzne elementy. Ogólny schemat definicji klasy z dziedzictwem: class nazwapodklasy extends nazwanadklasy { // ciało klasy } W Java można dziedziczyć tylko po jednej klasie nadrzędnej. W C++ można dziedziczyć po wielu klasach. Można za to tworzyć hierarchie klas, w których klasa podrzędna staje się klasą nadrzędną innej klasy podrzędnej, itd. Klasa nie może być klasą nadrzędną dla samej siebie. 2

Referencje do klas Zmienna referencyjna do klasy nadrzędnej może wskazywać na obiekt dowolnej klasy podrzędnej. Przykład: A oba = new A(); B obb = new B(); oba = obb; Typ zmiennej referencyjnej wyznacza, które elementy wskazywanego obiektu będą dostępne. W powyższym przykładzie zakładamy, że klasa B dziedziczy po klasie A. Zmienna referencyjna oba, wskazująca na obiekt klasy A, będzie miała dostęp tylko do tych elementów wskazywanego obiektu, które są dziedziczone z klasy A. Zobacz: Dziedzictwo3.java 3

Zmienna super Zobacz: SuperDemo.java BoxDemo4.java Zmienna super służy do odwoływania się do elementów klasy będącej bezpośrednim poprzednikiem klasy obiektu, w którym występuje. super może być używany na dwa sposoby: Odwołanie do konstruktora klasy będącej bezpośrednim poprzednikiem klasy ropatrywanego obiektu. Może się to okazać jedyną możliwością inicjalizacji danych prywatnych klasy nadrzędnej. Odwołanie do konstruktora przez super musi odbywać się w konstruktorze jako pierwsza instrukcja. Odwołanie do zmiennej lub metody to zastosowanie jest podobne do użycia zmiennej this z tym, że odwołuje się do klasy nadrzędnej. Często stosuje się, gdy klasa podrzędna definiuje element o takiej samej nazwie jak klasa nadrzędna. Konstruktory zawsze są wywoływane w kolejności od klasy nadrzędnej do podrzędnej nawet, gdy nie używamy odwołania do konstruktora przez super. Zobacz: KonstrDemo.java 4

Nadpisywanie metod Gdy, w hierarchii klas, metoda w klasie podrzędnej posiada tę samą nazwę i sygnaturę co metoda w klasie nadrzędnej, wówczas mówimy, że metoda z klasy podrzędnej nadpisuje metodę klasy nadrzędnej. Wywołanie nadpisanej metody z klasy podrzędnej zawsze spowoduje wykonanie kodu metody z klasy podrzędnej. Wersja metody z klasy nadrzędnej będzie przesłonięta wersją z klasy podrzędnej, dostępną wciąż przez zmienną super. Zobacz: Overriding1.java Overriding2.java Z nadpisywaniem metod mamy do czynienia tylko wtedy, gdy nazwy i sygnatury dwóch metod są identyczne. Jeżeli metody mają takie same nazwy lecz różne sygnatury, to mamy do czynienia z przeciążaniem metod, omówionym już wcześniej. Zobacz: Overriding3.java 5

Dynamiczne wiązanie metod Nadpisywanie metod tak jak je przedstawiliśmy nie jest niczym szczególnym. Dopiero z wraz mechanizmem dynamicznego wiązania metod, tworzy podstawę dla polimorfizmu. Dynamiczne wiązanie metod polega na tym, że dopiero w czasie wykonywania programu można zdecydować, która wersja nadpisanej metody będzie uruchomiona (a nie już w czasie kompilacji). Zmienne referencyjne typu nadklasy mogą wskazywać również na obiekty klasy podrzędnej. Java wykorzystuje ten fakt do rozwiązywania odwołań do nadpisanych metod w czasie wykonania w następujący sposób: Wywołanie nadpisanej metody przez referencję typu nadklasy jest wyznaczone przez typ obiektu wskazywanego przez referencję w czasie wykonania. Prezentowany sposób nadpisywania metod bardzo przypomina tzw. funkcje wirtualne języka C++. Zobacz: DynMetod.java 6

Zastosowanie polimorfizmu Polimorfizm w OOP jest ważnym mechanizmem ponieważ ułatwia definiowane hierarchii klas. Możemy definiować klasy abstrakcyjne, definiujące cechy wspólne, a następnie w klasach potomnych doprecyzować definicje metod z klas abstrakcyjnych dla poszczególnych przypadków. Przykład: W pliku Figury.java pokazujemy jak przy pomocy nadpisywania metod i polimorfizmu można zdefiniować hierarchię klas opisujących figury geometryczne. Ciekawe wywołania polimorficzne można uzyskać stosując, prócz nadpisywania metod, zmienne this i super. Przykład można znaleźć w pliku DynWia.java. Zobacz: Figury.java 7

Klasy abstrakcyjne Zobacz: SimpleAbs.java BoxDemo4.java Zdarzają się sytuacje, w których chcemy zdefiniować abstrakcyjną klasę nadrzędną, deklarującą strukturę abstrakcji lecz bez implementowania wszystkich metod. Klasa taka powinna nadawać kształt (sygnaturę) metod w klasach potomnych lecz sama o niczym nie przesądzać. Metody takie możemy tworzyć przez poprzedzenie ich nagłówka słowem kluczowym abstract. Klasy takie nie posiadają implementacji, tj. składają się tylko z nagłówka. Postać metody: abstract typ nazwa(lista-parametrów); Każda klasa, która posiada chociaż jedną metodę abstrakcyjną, musi także być zadeklarowana jako abstrakcyjna (abstract przed słowem class). Nie można tworzyć instancji klas abstrakcyjnych, chociaż można deklarować zmienne referencyjne klas abstrakcyjnych i wskazywać nimi obiekty klas pochodnych. 8

Zobacz: FinalMethod.java Słowo final FinalClass.java Słowo kluczowe final posiada trzy zastosowania: Niezmienne zmienne instancyjne czyli stałe; omówiliśmy już to zagadnienie wcześniej Metody nienadpisywalne metody posiadające słowo kluczowe final w nagłówku nie mogą być nadpisane w klasach pochodnych; stąd są w pewien sposób niezmienne w klasach pochodnych Klasy nie dające się dziedziczyć klasy takie nie mogą być dziedziczone do żadnych klas potomnych; wszystkie metody takiej klasy niejawnie są zadeklarowane jako final; jak można się domyślać błędem jest deklarowanie klasy jako abstract i final jednocześnie Kompilatory Javy często, dla wygenerowania efektywniejszego kodu, wpisują kod metody finalnej w miejsce jej wywołania. Oszczędza to czas potrzebny na wywołanie metody. Taki sposób kompilacji nazywamy wczesnym wiązaniem, tj. wiązaniem kodu metody z jej wywołaniem w trakcie kompilacji. 9

Klasa Object Klasa Object jest specjalną klasą języka Java. Wszystkie klasy języka Java są jej podklasami. Oznacza to, że zmienna referencyjna typu Object może wskazywać na obiekt dowolnej klasy. Klasa Object definiuje następujące metody, które są dostępne we wszystkich klasach Javy: Object clone() tworzy obiekt taki sam, jak obiekt wywołujący boolean equals(object o) sprawdza równość obiektów wywołującego i o void finalize() wywoływana przed odzyskaniem pamięci obiektu przez zbieracz śmieci Class getclass() oddaje klasę obiektu wywołującego int hashcode() oddaje pozycję obiektu wywołującego w tablicy mieszanej String tostring() oddaje napis opisujący obiekt wywołujący 10

Dokumentacja klas W skład SDK wchodzi program javadoc, służący do generowania dokumentacji klasy na podstawie pliku źródłowego oraz specjalnych znaczników: /**.. */ komentarz będący jednocześnie dokumentacją komentowanego elementu @autor autor klasy lub komentowanego elementu {@link} link do dodatkowej informacji @param parametry metody @return opis wartości zwracanej przez metodę @see link do tematu pokrewnego @exception wyjątki generowane przez metodę @version wersja klasy Zobacz: Sortowanie.java Wypróbuj: javadoc Sortowanie.java 11