Obiektowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

Podobne dokumenty
Wprowadzenie do obiektowości

Wprowadzenie do obiektowości

Definiowanie własnych klas

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

Interfejsy i klasy wewnętrzne

Dokumentacja do API Javy.

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

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

Technologie i usługi internetowe cz. 2

Materiały do zajęć VII

Podstawy Programowania Obiektowego

Wykład 8: klasy cz. 4

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Programowanie obiektowe - 1.

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Enkapsulacja, dziedziczenie, polimorfizm

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

TEMAT : KLASY DZIEDZICZENIE

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

Klasy i obiekty cz II

Programowanie obiektowe

Podstawy Języka Java

Do czego służą klasy?

Definiowanie własnych klas

Wykład 4: Klasy i Metody

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

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

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

Definicje klas i obiektów. Tomasz Borzyszkowski

Dziedziczenie. Tomasz Borzyszkowski

Kurs WWW. Paweł Rajba.

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Wykład 5: Klasy cz. 3

Programowanie obiektowe

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

Programowanie obiektowe

Aplikacje w środowisku Java

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

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

Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik

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

Programowanie obiektowe

Rozdział 4 KLASY, OBIEKTY, METODY

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

Technologie obiektowe

Aplikacje w środowisku Java

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

.NET Klasy, obiekty. ciąg dalszy

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

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

Zaawansowane programowanie w języku C++ Klasy w C++

KLASY cz.1. Dorota Pylak

PHP 5 język obiektowy

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Podstawy Programowania Programowanie Obiektowe

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

Dziedziczenie jednobazowe, poliformizm

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

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

Polimorfizm. dr Jarosław Skaruz

Klasy abstrakcyjne, interfejsy i polimorfizm

Języki i techniki programowania Ćwiczenia 2

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Programowanie obiektowe

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

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

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Podstawy programowania obiektowego

Do czego służą klasy?

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

Wykład 3 Składnia języka C# (cz. 2)

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Wykład 7: Pakiety i Interfejsy

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

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

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

Wprowadzenie do projektu QualitySpy

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

Dziedziczenie. dr Jarosław Skaruz

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

Laboratorium 1 - Programowanie proceduralne i obiektowe

10. Programowanie obiektowe w PHP5

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

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

Mechanizm dziedziczenia

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Wstęp do Programowania 2

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

Wykład 6: Dziedziczenie

Programowanie obiektowe

Szablony klas, zastosowanie szablonów w programach

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

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

Kompozycja i dziedziczenie klas

Transkrypt:

Obiektowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

Obiekt jest abstrakcją pewnego konkretnego bytu ze świata rzeczywistego, reprezentujący rzecz (obiekt fizyczny), pojęcie (obiekt konceptualny) lub pewny byt programistyczny nie mający swojego odpowiednika w rzeczywistości. Klasa określa właściwości i możliwości każdego obiektu do niej należącego, definiuje zatem to, jak obiekt jest zbudowany i co potrafi. W szczególności klasa zawiera specyfikację danych i metod, implementację metod, informacje dotyczące relacji i powiązań z innymi klasami. Można różnić jeszcze następujące pojęcia: Tożsamość (ang. identity), pozwala na odróżnienie danego obiektu od każdego innego (poprzez jego unikatową nazwę lub adres w pamięci). Stan (ang. state), opisuje to co obiekt w danym momencie powinien wiedzieć aby sprawnie działać (poprzez zestaw atrybutów i przypisanych im wartości). Zdolność do działania (ang. behavior) opisuje operacje(metody), które obiekt może wykonać.

Właściwości (atrybuty): string Producent; int Kolor; Metody: Jedź(); Stój(); Skręć_w_lewo(); Skręć_w_prawo();

Abstrakcja obiekt jest abstrakcją pewnego konkretnego bytu ze świata rzeczywistego, reprezentującego rzecz (obiekt fizyczny) lub pojęcie (obiekt konceptualny). Abstrakcja pozwala postrzegać modelowaną rzeczywistość bez wnikania w jej wewnętrzną strukturę. Enkapsulacja (hermetyzacja) dostęp do danych obiektu jest możliwy tylko przez określone operacje (metody) obiektu. Możliwa jest zmiana implementacji obiektu bez negatywnego wpływu na resztę programu. Polimorfizm - Referencje mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego. Jeśli dzieje się to w czasie działania programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym. Diedziczenie pozwala na tworzenie hierarchicznych związków między klasami. Podklasa dziedziczy atrybuty i metodzie po nadklasie.

Abstrakcyjny model roweru Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); Stój(); Skręć_w_lewo(); Skręć_w_prawo(); Rzeczywiste byty (rowery)

Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); Stój(); Skręć_w_lewo(); Skręć_w_prawo(); PobierzProducenta(); ZmienProducenta(producent); PobierzKolor(); ZmienKolor(kolor); Należy odwoływać się do konkretnych metod, a nigdy bezpośrednio do wartości pól Przykład: ZmienProducenta( Author ); Zamiast Producent = Author ; Po co? Enkapsulacja pozwala obiektom kontrolować poprawność swojej reprezentacji wewnętrznej. Użytkownik odwołując się bezpośrednio do pola Producent może tam wpisać błędną wartość np. 1243, natomiast korzystając z metody ZmienProducenta() zostałby wyświetlony błąd.

Załóżmy, że istnieją 3 klasy: Rower, Samochód i Pojazd. Zarówno Rower jak i Samochód są pojazdami, więc mają jakieś cechy wspólne (Kolor, Producenta) i podobne możliwości (mogą jechać, zatrzymywać się i skręcać). Aby zatem nie powtarzać się tworząc te 3 klasy, wystarczy zdefiniować klasę Pojazd, a potem stworzyć klasy Rower i Samochód, które będą dziedziczyły wszystkie pola i metody klasy pojazd. Pojazd Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); Stój(); Skręć_w_lewo(); Skręć_w_prawo(); Rower Właściwości (atrybuty): Typ roweru Metody: Nasmaruj łańcuch() Samochód Właściwości (atrybuty): Numer nadwozia Metody: Zatankuj();

Zarówno rower jak i samochód potrafią się poruszać, ale robią to w odmienny sposób (mimo, iż ogólna zasada jest taka sama). Musi być zatem znany obiekt, dla którego metoda poliformiczna jedź() ma zadziałać. Rower Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); Samochód Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); ob = new Rower(); ob.jedź(); //wywołanie metody Jedź z klasy Rower ob = new Samochód(); ob.jedź(); //wywołanie metody Jedź z klasy Samochód

Przykładowa klasa będąca abstrakcją wszystkich pojazdów:

Każda składowa klasy może być zdefiniowana jako: Prywatna Dostępna jest tylko w danej klasie (private). Zaprzyjaźniona dostępna jest ze wszystkich klas danego pakietu. Mówimy wówczas o dostępie pakietowym lub domyślnym. Wszystkie składowe bez żadnego określnika poziomu dostępu mają dostęp pakietowy. Chroniona dostępna z danej klasy i wszystkich klas ją dziedziczących (protected). Publiczna dostępna skądkolwiek (public). Zalety enkapsulacji: 1. Ochrona przed zepsuciem. 2. Przejrzystość interfejsu. 3. Możliwa zmiana implementacji klasy bez wpływu na kod, który z niej korzysta, ponieważ interfejs publiczny pozostaje bez zmian.

Klasa po modyfikacjach. Czego tu brakuje? Potrzebne są jeszcze metody udostępniające i zmieniające wartość danego elementu (pola). Mówimy zatem o tzw. akcesorach (ang. getter) i mutatotach (ang. setter). Zwyczajowo akcesor to metoda udostępniająca jakieś dane, a jej nazwa rozpoczyna się od słowa get. Nazwa mutatora natomiast często rozpoczyna się od słowa set, a sama metoda najczęściej przyjmuje od jednego do wielu argumentów.

Konstruktor ma zawsze taką samą nazwę jak klasa i nie ma żadnego typu wyniku. Słowo kluczowe this powoduje odwołanie się do składowej aktualnej klasy. Konstruktor specjalna metoda, której przeznaczeniem jest tworzenie i inicjalizacja obiektów. Konstruktor jest automatycznie wywoływany podczas powoływania do życia nowego obiektu danej klasy. Konstruktora nie można używać jak normalnej publicznie dostępnej metody. Można go wywołać korzystając tylko z operatora new. Klasa może mieć więcej niż jeden konstruktor. Konstruktor może przyjmować zero lub więcej parametrów.

Klasa to tylko szkielet dla danego obiektu. Aby móc z tego schematu skorzystać należy stworzyć instancje danej klasy czyli obiekt o takiej strukturze. Aby utworzyć obiekt klasy Osoba należy użyć konstruktora tej klasy i operatora new: new Osoba( Jan Kowalski, 020212387 ); Obiekt można również przekazać do metody. Przykładowo wywołanie: System.out.println(new Osoba( Jan Kowalski, 020212387 )); spowoduje uruchomienie metody tostring() danego obiektu (ponieważ metoda println spodziewa się argumentu w postaci ciągu znaków i dokonywana jest próba automatycznej konwersji). Zazwyczaj jednak potrzebujemy się odwołać częściej do tego samego obiektu niż raz, wobec czego należy również wprowadzić zmienną obiektową: Osoba os = null; //tu nie można jeszcze wywoływać metod bo zmienna ta nie //jest obiektem. Jest to tylko referencja do obiektu. os = new Osoba( Jan Kowalski, 020212387 ); //konieczna jest inicjacja zmiennej os. Albo nowo powstałym obiektem, albo już istniejącym. System.out.println(os.getImie()); //teraz już można korzystać z metod obiektu. Osoba os Referencja na obiekt pola metody Istniejący obiekt klasy osoba

Dlaczego to marnotrawstwo pamięci?

Składowe statyczne deklarujemy przy użyciu specyfikatora static. Mogą one być używane, gdy nie istnieje żaden obiekt danej klasy. Składowe statyczne przynależą do określonej klasy a nie do instancji jakiegoś obiektu. Pola statyczne są współdzielone przez wszystkie obiekty danej klasy. Ważne jest to, aby nie odwoływać się ze statycznych metod do niestatycznych składowych klasy (może to spowodować błąd, bo egzemplarz danej klasy może nie istnieć). Metody statyczne mają 2 zastosowania: Gdy metoda nie wymaga dostępu do stanu obiektu, bo wszystkie potrzebne jej parametry są dostarczane w postaci jawnych argumentów Math.pow(a, b). Kiedy metoda potrzebuje dostępu tylko do pól statycznych. Spoza klasy do jej statycznych składowych można się odwoływać na dwa sposoby: NazwaKlasy.NazwaSkładowej Tak samo jak do składowych niestatycznych, jeśli istnieje jakiś obiekt danej klasy.

Wykorzystanie (w innej klasie):

Podczas tworzenia obiektu pola klasy jeśli mają zagwarantowaną wartość domyślną (0 dla typów liczbowych, false typ boolean, null referencje, w tym stringi). Nie należy jednak polegać na wartościach domyślnych i samemu dokonywać inicjacji pól. Można to zrobić na kilka sposobów: Dodać konstruktor domyślny, który to nie przyjmuje żadnych parametrów: Wykorzystując jawną inicjację pól przypisując każdemu polu w jego definicji jakąś wartość: Wykorzystując bloki inicjujące.

Bloki inicjujące. Wywoływanie innego konstruktora. Jeśli pierwsza instrukcja konstruktora ma postać this( ) to konstruktor ten wywołuje inny konstruktor danej klasy.

1. Pierwsze odwołanie do klasy inicjuje najpierw pola statyczne. Pierwszym odwołaniem może być odwołanie do składowej statycznej [Pojazd.getLiczba()] lub utworzenie obiektu [Pojazd p = new Pojazd()]. 2. Tworzenie obiektu za pomocą operatora new inicjuje pola niestatyczne, po czym wykonywany jest konstruktor. 3. Pola są inicjowane według ich kolejności w definicji klasy (zachowując podział na statyczne i niestatyczne).

W klasie można zdefiniować metody o tej samej nazwie, różniące się liczbą i/lub typami argumentów. Mechanizm ten nosi nazwę przeciążania metod. Przykładowo w klasie pojazd moglibyśmy mieć dwie metody: public int getstan() {return stan;} public static String getstan(int stan) { return stany[stan]; }

W Javie nie ma pojęcia destruktora! Jest to spowodowane występowaniem mechanizmu garbage collector. Czasem jednak trzeba zwolnić zasób tuż po jego wykorzystaniu (n. odwowania do plików). Do każdej klasy można dodać metodę finalize. Jest ona wywoływana przed usunięciem obiektu przez zbieracza śmieci. Nie należy jednak polegać na tej metodzie, bo standard nie specyfikuje kiedy zostanie ona wywołana. Dlatego też programista nie ma wiedzy o tym kiedy nastąpi jej wywołanie. Jeśli dany zasób musi zostać zamknięty natychmiast po zakończeniu jego używania, musi o tym zadbać sam programista. Najczęściej tworzone są metody dispose() czy close(), które służą do tego celu.

1. Załóżmy, że gromadzimy wodę mineralną. Są trzy rodzaje butelek o pojemności 2l (duże), średnie o pojemności 1l oraz małe o pojemności 0.5 litra. Stworzyć klasę MyWater z metodami: void addlarge(int) dodaje do zapasu wody podaną jako argument liczbę dużych butelek. void addmedium(int) dodaje do zapasu wody podaną jako argument liczbę średnich butelek. void addsmall(int) dodaje do zapasu wody podaną jako argument liczbę małych butelek. Dodatkowo należy zaimplementować metody umożliwiające uzyskanie informacji o tym ile jest każdego rodzaju butelek, oraz jaka jest łączna pojemność zgromadzonej wody. Pojemności butelek (dużych, małych, średnich) przedstawić jako pola statyczne. Dostarczyć metod pozwalających uzyskiwać informacje o tych pojemnościach oraz je zmieniać. Klasę przetestować wyprowadzając dane na ekran w stylu: Mam teraz 6.5 litrów wody. Dużych butelek: 2 Małych butelek: 3 Średnich butelek: 1

Stwórz książkę adresową do przechowywania danych osób, opartą na obiektach. Program ma posiadać następujące menu: 1. Dodaj nową osobę. 2. Edytuj/usuń osoby. 3. Wyszukaj osoby. 4. Wyświetl osoby. 5. Importuj dane z pliku. 6. Eksportuj dane do pliku. 7. Zakończ program. Dodaj nową osobę umożliwia dodanie nowej osoby do bazy danych na podstawie parametrów takich jak: Imię i nazwisko, data urodzenia, pełny adres, oraz opcjonalnie: numer gg, adres e-mail, adres www. Edycja powoduje wyświetlenie wszystkich dostępnych osób i na podstawie tej listy ma być możliwość wyboru konkretnej osoby do edycji lub do usunięcia. Usunięcie osoby ma być potwierdzane komunikatem Czy jesteś pewien?. Wyszukiwanie osób ma być możliwe po nazwisku, dacie urodzenia lub mieście zamieszkania. Wyświetl osoby wyświetla wszystkie osoby z książki z możliwością sortowania według imienia, nazwiska, roku urodzenia lub miasta. Import i eksport kolejno wczytują lub zapisują dane do pliku tekstowego. Ma być też możliwość wyświetlenia liczby zapisanych osób. Dodatkowo każda osoba powinna mieć swój unikalny identyfikator. Każda osoba to obiekt danej klasy. Książka adresowa agreguje obiekty klasy osoba. Należy wykorzystać pola i 1 metodę statyczną, co najmniej 2 konstruktory oraz pamiętać o hermetyzacji.