Podstawa: Bruce Eckel, Thinking in Java, Second Ed., Prentice Hall, 1998 The JavaLanguage Environment, A white Paper, Sun, Oct.

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

Enkapsulacja, dziedziczenie, polimorfizm

Dokumentacja do API Javy.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Dziedziczenie. dr Jarosław Skaruz

Technologie i usługi internetowe cz. 2

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

Wykład 6: Dziedziczenie

Polimorfizm. dr Jarosław Skaruz

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

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

Programowanie obiektowe i zdarzeniowe

Wykład 7: Pakiety i Interfejsy

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Dziedziczenie. Tomasz Borzyszkowski

Klasy abstrakcyjne, interfejsy i polimorfizm

Podstawy Języka Java

Programowanie obiektowe

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

Aplikacje w środowisku Java

Kurs WWW. Paweł Rajba.

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

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

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe - 1.

Języki i metody programowania Java Lab2 podejście obiektowe

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

Programowanie obiektowe

Wykład 4: Klasy i Metody

Programowanie obiektowe

Programowanie w Internecie. Java

Podstawy Programowania Obiektowego

Programowanie obiektowe

Wykład 9: Polimorfizm i klasy wirtualne

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

Klasy abstrakcyjne i interfejsy

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

1 Atrybuty i metody klasowe

Związek między pojęciami Zasada podstawialności Podklasy muszą realizować kontrakt zawarty przez nadklasy

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Zaawansowane programowanie w C++ (PCP)

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe

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

Programowanie obiektowe

TEMAT : KLASY DZIEDZICZENIE

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

Definiowanie własnych klas

PHP 5 język obiektowy

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

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

Programowanie obiektowe

Java: interfejsy i klasy wewnętrzne

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

Przykład -

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

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

Mechanizm dziedziczenia

Wykład 5 Okna MDI i SDI, dziedziczenie

Język Java część 2 (przykładowa aplikacja)

Wykład 5: Więcej o Klasach i Metodach

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Pakiety i interfejsy. Tomasz Borzyszkowski

Język Java część 2 (przykładowa aplikacja)

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

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Aplikacje w środowisku Java

KLASY, INTERFEJSY, ITP

Języki i techniki programowania Ćwiczenia 4 Wzorce

10. Programowanie obiektowe w PHP5

Programowanie obiektowe

Java Język programowania

Definicje klas i obiektów. Tomasz Borzyszkowski

Mechanizm dziedziczenia

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Diagramy klas. dr Jarosław Skaruz

Programowanie obiektowe

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Projektowanie obiektowe. Roman Simiński Polimorfizm

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

Wykład 5: Klasy cz. 3

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

DOSTĘP DO METOD I ZMIENNYCH. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla każdego, Helion 2001)

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Programowanie obiektowe

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

Wykład 8: klasy cz. 4

Programowanie obiektowe

Programowanie Obiektowe i C++

Transkrypt:

Spis treści Temat: Dziedziczenie Celem wykładu jest pokazanie podstawowych mechanizmów stosowanych w programowaniu zorientowanym obiektowo. Głównie chodzi o dziedziczenie, rozszerzanie klas, przesłanianie i przeciążanie metod. Podstawa: Bruce Eckel, Thinking in Java, Second Ed., Prentice Hall, 1998 The JavaLanguage Environment, A white Paper, Sun, Oct. 1995; 1 Dziedziczenie Zadeklarujemy klasę Figura oraz cztery metody, które w zamyśle, realizują rysowanie, wycieranie, obrót i przesuwanie figur geometrycznych. class Figura extends Object { void { //// rysowanie void { //// void obracaj() { //// void przesuwaj() { Klasę Figura możemy przedstawić przy pomocy nazwanego prostokąta. Jego dolna część (pod kreską) zawiera nazwy metod klasy. Na rysunku widzimy przykład klasy Figura. 1

KLASA bazowa Figura przesuwaj() obracaj() Klasa bazowa Od klasy bazowej Figura można wywieść inne bardziej szczególne klasy takie jak np, okręgi, kwadraty i trójkąty. KLASA bazowa Klasy pochodne Figura przesuwaj() obracaj() Okrag Kwadrat Trojkat class Kwadrat extends Figura { //// tutaj jakies deklaracje Klasa bazowa i klasy potomne Te nowe klasy dziedziczą wszystkie pola i metody klasy przodka Figura. Oznacza to, że metody itd. są w nich dostępne tak samo jak w biektach typu Figura. 2 Wymiana metod i poszerzanie klas Metody odziedziczone przez klasy potomne można wymienić na nowe (ang. overriding) lub można dodawać w nowych klasach całkiem nowe metody. Klasy potomne otrzymane metoda pozszerzania (extends) mają dostęp do wszystkich metod klasy bazowej. Jeśli o klasie pomyślimy jako o typie danych to proces ten jest poszerzaniem typu danych. Zarówno okręgi (Okrag) jak też kwadraty (Kwadrat) i trójkąty (Trojkat) są figurami (Figura), ale mają dodatkowe, własne cechy. W przypadku trójkątów może to byc np. możliwość ich poziomego lub pionowego odbijania (np. wzgledem prostej pionowej lub poziomej przechodzącej przez środek trójkąta). Zrealizujemy te nowe możliwości wprowadzając nowe procedury tak jak to pokazano na diagramie. 2

KLASA bazowa Klasy pochodne Figura przesuwaj() obracaj() Okrag Kwadrat Trojkat OdbijPoz() OdbijPion() Klasa bazowa i klasy potomne. Klasa Trojkat została pozszerzona i posiada dwie nowe metody odbijpoz() oraz odbijpion(). Metody i klas Okrag i Kwadrat zostały zdefiniowane od nowa (ang. overrided). Można tego dokonać tak class Trojkat extends Figura { void odbijpion() { //// polecenia void odbijpoz() { //// polecenia Dodatkowo, zmieniliśmy juz istniejące procedury klasy Figura, a więc procedury, itp. Tak wygląda to w nowej klasie Kwadrat,. Kwadrat wycieramy i rysujemy w specjalny sposób (inaczej niż okrąg). Podobnie jest z okręgiem. class Kwadrat extends Figura { void { // polecenia void { // polecenia 3

Tego typu praktyka pozwala rozszerzać i korygować istniejące już klasy (sprawdzone) bez konieczności interwencji do ich kodów źródłowych. Nowe klasy maja w ten sposób wszystkie potrzebne cechy istniejące w przodkach (klasach bazowych) i nowe cechy, których przodkowie nie posiadają, a więc charakterystyczne tylko dla wybranych potomków. Deklaracja obiektów nowych klas przebiega tak samo jak poprzednio. Na przykład, deklarowanie obiektów Kwadrat odbywa sie wg. schematu Kwadrat k1 = new Kwadrat(); Kwadrat k2 = new Kwadrat(); //// itd k1.; k2.; k1.obracaj(); Uwaga! Wymiana, przesłanianie metody następuje tylko wtedy gdy przy jej powtórnym deklarowaniu w klasie potomka nie zmienimy nagłówka metody, tzn. jeśli liczba parametrów formalnych metody, ich typy i typ samej metody nie zmienią się. W innym wypadku mamy doczynienia z przeciążaniem metod, 3 Przeciążanie metod Jeśli nagłówek w nowej deklaracja metody, oprócz samej nazwy metody, zawiera zmiany w porównaniu z już istniejąca metodą przodka, to metoda nie jest przesłaniana (wymieniana) lecz istnieje jako inna metoda. Możemy mieć wiele metod o tej samej nazwie lecz różnej liczbie parametrów formalnych lub różnych typach parametrów formalnych. W takim przypadku mamy doczynienia ze zjawiskiem przeciążania metod. Najczęściej przeciążanymi metodami są konstruktory. P r z y k ł a d. 1. //// //// overloading class Overloading { public static void main(string[] args){ System.out.println(dodaj(1, 2)); System.out.println(dodaj(1f, 2f)); static String dodaj(int x, int y) { System.out.println("int"); return String.valueOf(x+y); // konwersja do łańcucha 4

static String dodaj(float x, float y) { System.out.println("float"); return String.valueOf(x+y); // konwersja do łańcucha //// Wynikiem działania programu jest int 3 float 3.0 Wynik programu pozwala sądzić, że działały obie metody dodaj(), każda w dpowiedniej sytuacji. Java T M rozróżnia oba przypadki. Ten przykład świadczy o tym, że mamy "wieloznacznąńazwę dodaj(), a więc jest tutaj realizowane przeciążenie metody. 4 Jednokrotne dziedziczenie W Java T M, inaczej niż w C++, dziedziczenie jest jednokrotne, tzn. każda klasa może dziedziczyć tylko od jednego przodka. Zamiast wielokrotnego dziedziczenia wprowadzono tzw. interfejsy (ang. interface), sprzęgi, które pozwalają na zastąpienie pewnych cech wielokrotnego dziedziczenia. Interfejs nie jest definicją obiektu, lecz definicją zbioru metod, które można zastosowac w jednym lub wielu obiektach. Interfejs jest tylko deklaracją metod i stałych. Nie można w nim deklarować zmiennych. 5 Polimorfizm Załóżmy, że zdefiniowaliśmy klasy Trojkat, Okrag i Kwadrat tak jak wyżej. Chcemy teraz wykonac pewne prace z figurami. Ciąg tych prac jest zawsze taki sam: rysujemy figurę i obracamy ją. Z góry nie wiemy jakich figur bedzie to dotyczyć. Czy można to zrobić w jednej metodzie? Nazwijmy ją wykonajprace(). void wykonajprace(figura f) { f.; f.obracaj(); //// Okrag o = new Okrag(); Trojkat t = new Trojkat(); Kwadrat k = new Kwadrat(); 5

wykonajprace(t); wykonajprace(o); wykonajprace(k); Wywołanie metody wykonajprace() automatycznie robi to co potrzeba. Ponieważ o, k, w są typu Figura to metoda wykonajprace() traktuje je wszystkie tak, jak należy. Opisany mechanizm nosi nazwę polimorfizmu. Zauważmy, że przed wywołaniem metoda wykonajprace() nie wie z jakim obiektem będzie miała doczynienia. Nie wie czy będzie to trójkąt, okrąg czy coś jeszcze. Rozstrzyga się to w ostatnim momencie. Odpowiednie metody i obracaj() sa dobierane w chwili gdy dany obiekt znajdzie się wewnątrz metody. Nosi to nazwę dynamicznego wiązania metod, późnego wiązania lub viązania w czasie wykonywania programu. Realizacja tego typu zachowań w przypadku Java T M jest bardzo wygodna z punktu widzenia programisty, czytelności programu i możliwości jego rozbudowy. 6 Kontrola dostępu Istnieją cztery kategorie określające prawa dostępu do metod lub zmiennych obiektu. Są to public, protected, private oraz kategoria bez nazwy określana jako przyjazna. Jeśli zmienna nie jest zadeklarowana z użyciem jednego z trzech pierwszych słów to należy do kategorii zmiennych przyjaznych, Jest to zmienna, która jest dostępna we wszystkich obiektach danego pakietu (package). Organizacja klas w pakiety jest wygodna i zwiększa czytelność programu (patrz dalej). W przypadku deklaracji public, zmienna (metoda) jest dostępna wszędzie. Zmienna lub metoda kategorii protected jest dostępna tylko w podklasach danej klasy i nigdzie więcej. W kategorii private, zmienne lub metody są dostępne tylko w klasie, w której zostały zadeklarowane i nigdzie więcej. 7 Zmienne klasowe i metody klasowe Zwyczajne zmienne deklarowane w klasie są zmiennymi instancyjnymi - każda taka zmienna istnieje w każdym oddzielnym obiekcie utworzonym z tej klasy. Zmienne klasowe są natomiast zmiennymi wspólnymi dla wszystkich obiektów tworzonych z tej klasy. Są one lokalne w klasie. Istnieje pojedyncza kopia kazdej zmiennej lokalnej. Zmienne klasowe deklarujemy z użyciem słowa static. class Prostokat extend Object { static final int version = 2; static final int revision = 0; // 6

Słowo final oznacza, że zmienne klasowe w klasie Prostokat są stałymi. Zupełnie podobnie rzecz się ma z metodami klasowymi. Wspólne metody, np. metoda wyznaczania wielkości okna aplikacji, są pojedynczymi metodami w klasie. Metody klasowe mogą operowac tylko na zmiennych klasowych i nie mają dostępu do zmiennych instancyjnych. 8 Metody i klasy abstrakcyjne Rozważmy klasę abstrakcyjną. Jest to klasa, w której zdefiniowano metody (w zasadzie ich nagłówki), których nie zaimplementowano. Są one tylko zgłoszone i nie robią nic poza tym. W podklasach tej nadklasy metody te muszą byc przedefiniowane yak, by coś wykonywały. Weźmy pod uwagę następujący przykład. Załóżmy, że piszemy program, rysujący figury geometryczne. W którymś momencie dochodzimy do wniosku, że wygodnie będzie zadeklarować klasę Figura, w której oprócz metod ustawiających kolory linii, kolory wypełnienia figur itd., przydatna będzie metoda, która bedzie różna dla różnych figur, inna dla okręgu, a inna dla prostokąta. Definiujemy wiec pustą metodę. Jej implementacja skonkretyzuje się w podklasach takich, jak Okrąg, Prostokat itd., a więc w przypadku kjonkretnych figur. abstract class Figura extends Object { protected Punkt ld; protected Punkt pg; Color lk, ink; public void setposition( Punkt ld, Punkt pg ) { this.ld = ld; this.pg = pg; abstract void { public void setlinecolor(color k) { lk = k; public void set setinsidecolor(color k) { ink = k; Ponieważ klasa Figura jest klasą abstract więc nie możemy utworzyć obiektów tej klasy. Można natomiast utworzyć klasy potomne (podklasy) i następni zadeklarować nowe metody właściwe dla tych podklas. Napiszmy dla przykłady podklasę Prostokąt. 7

class Prostokat extends Figura { void { moveto(ld.x, ld.y); lineto(ld.x, pg.y); lineto(pg.x, pg.y); W ten sposób, klasa Prostokat posiada wszystkie metody klasy Figura i wie jak rysować prostokąt. 9 Podsumowanie Najważniejszymi cechami programowania obiektowego jest enkapsulacja - ukrywanie informacji i modularność, polimorfizm - różne zachowanie sie obiektów w zależności od ich natury, dziedziczenie - przejmowanie metod i pól nadklasy w definiowanych podklasach, dynamiczne wiązanie - zapewnia maksymalną elastyczność w czasie wykonywania sie programu. 8