920 likes | 1.37k Views
Przemysław Pardel , Listopad 200 7. Podstawy programowania obiektowego (Java). Agenda. Historia i geneza programowania obiektowego, Programowanie obiektowe, Obiekty i typy podstawowe, Klasy, Metody, Pola i metody statyczne, Konstruktory, Pakiety, Polimorfizm,
E N D
Przemysław Pardel, Listopad 2007 Podstawy programowania obiektowego (Java)
Agenda • Historia i geneza programowania obiektowego, • Programowanie obiektowe, • Obiekty i typy podstawowe, • Klasy, • Metody, • Pola i metody statyczne, • Konstruktory, • Pakiety, • Polimorfizm, • Metody i klasy abstrakcyjne, • Interfejsy, • Inne.
Historia programowania obiektowego • Simuli 67 – Ole-Johan Dahl i Kristen Nygaard z Norsk Regnesentral w Oslo - pogrupowano typy statków w różne klasy obiektów, a każda z klas sama odpowiadała za określanie własnych danych i zachowań • Smalltalk - stworzony w Simuli w Xerox PARC - w pełni dynamiczny system, w którym obiekty mogą być tworzone i modyfikowane "w locie„ • C++ - połowa lat 80 - W tym okresie cechy obiektowe dodano do wielu języków programowania, w tym Ady, BASIC-a, Lisp-a, Pascal-a i innych, • Eiffel - Bertrand Meyer - obecnie został on w zasadzie całkowicie zastąpiony przez Javę • Obiektowość rozprzestrzeniła się dość znacznie, jednak zwykle w systemach hybrydowych, w połączeniu z programowaniem niskopoziomowym (C++), funkcyjnym (Ocaml, niektóre dialekty Lisp-a), sieciowym (Java), skryptowym (Perl, Python, Ruby) itd. Systemy czysto obiektowe typu Smalltalk-a nie znalazły zbyt szerokiego zastosowania.
Programowanie obiektowe a rzeczywistość • Zgodność podejścia z rzeczywistością – największy atut programowania, projektowania oraz analizy obiektowej. • Arystoteles – forma (odpowiednik platońskiej idei) i materia (Formie w programowaniu obiektowym odpowiada Klasa, materii - instancja - obiekt). • Podstawową cechą mózgu ludzkiego jest klasyfikacja - łączenie występujących w rzeczywistości obiektów w grupy – klasy. • Podstawowy postulat: Tym lepszy jest model, im bardziej jest zgodny z rzeczywistością.
Programowanie obiektowe • Definicja: Programowanie obiektowe - (ang. object-oriented programming) – metodyka tworzenia programów komputerowych, która definiuje programy za pomocą obiektów – elementów łączących stan (czyli dane) i zachowanie (czyli procedury, metody) • Obiektowy program komputerowy wyrażony jest jako zbiór obiektów komunikujących się pomiędzy sobą w celu wykonywania określonych zadań.
Podejście obiektowe • Wszystko jest obiektem. • Program jest zbiorem obiektów, które wysyłają sobie komunikaty. • Każdy obiekt posiada pamięć, na którą składają się inne obiekty. • Każdy obiekt posiada swój typ. • Wszystkie obiekty tego samego typu mogą otrzymywać te same komunikaty.
Obiekty • Definicja: Obiekt: Podstawowa jednostka abstrakcji modelu obiektowego • Główne cechy obiektu: • Stan – dane wewnętrzne, • zachowanie – zestaw metod do wykonania, • tożsamość – każdy obiekt można w sposób jednoznaczny odróżnić od innych obiektów.
Tworzenie obiektów • Metoda statyczna • Na stosie lub w obszarze statycznym: • Metoda szybka, • Programista musi sam zwolnić pamięć. • Kompilator wyznacza czas trwania obiektu, i sam go niszczy. • Metody dynamiczna (Java) • Tworzenie dynamiczne obiektów nastercie: • Ilość i czas życia obiektównieznany do czasu wykonania. • Java używa odśmiecacz pamięci (garbage collector), bywykrywać i usuwać obiekty nieużywane.
Implementacja obiektu • Definicja: Implementacja to kod umożliwiający wykonanie żądań przez obiekt • np. Utworzenie obiektu klasy: Autobus aut = new Autobus(); Żądanie pod kierunkiem obiektu: aut.Uruchom();
Program - Obiekt jako Usługodawca • Program dostarczausługi, • Program składa się ze zbioru obiektów, • Realizuje usługi wykorzystując usługi wykonywane przez składowe obiekty, • Usługowy model ułatwia projektowanie, analizę i ponowne użytkowanie obiektów.
Obiekty cd… • Wszystko w Javie jest obiektem JAVA: Deklaracja tworzy odwołanie do obiektu stypu/klasy String: String s Obiekt wskazywany przez s nie istnieje zatem: s.length() – ŹLE Deklaracja oraz inicjacja odwołania do obiektu s typu/klasy String: String s = new String(“abc”); Teraz s wskazuje na konkrety obiekt utworzony w pamięci, o wartości “abc” s.length() - DOBRZE
Przechowywanie danych • Rejestry – szybka pamięć wewnątrzprocesora, ograniczona liczba,niedostępne z programu, • Stos - część RAM, szybki dostęp,rozmiar i czas życia danych znane wczasie kompilacji, odwołania doobiektów, • Sterta – część RAM, rozmiar i czas życiadanych nieznane w czasie kompilacji,składowanie obiektów, wolniejszy dostęp, • Obszar statyczny – część RAM, danedostępne w dowolnym momencie zprogramu, słowo kluczowe static, • Obszar stałych – w kodzie programu,ewentualnie w pamięci ROM, • Obszar spoza RAM – obiekty trwałe(zachowują stan między wywołaniamiprogramu), zamiana obiektów wstrumień bajtów (do przesłania/zapisu).
Typy podstawowe • Czasami tworzenie obiektów na stercie(przez operator new) nie jest efektywne: Integer i = new Integer(1); • Typ podstawowy: int i = 1; Tworzy się zmienna która nie jestodwołaniem doobiektu, a wartością.
Typy podstawowe Java • boolean(Boolean), char(Character), byte(Byte), short(Short), int(Integer), long(Long), float(Float), double (Double), void(Void), • Rozmiar każdego typu jest niezmienny –programy są przenośne, • Wszystkie typy numeryczne są zeznakiem, • Klasa opakowująca typ podstawowypozwala umieszczać dane na stercie: Integer i = new Integer(1);
Zasięg i przesłanianie zmiennych • Zasięg przez położenie nawiasów: { int i = 1; // dostepny i { int j = 2; // dostepne i, j } i = j // dostepny i } • Niedozwolone przesłanianie { int i = 1; { int i = 2; // niedozwolone, Komunikat błędu – zmienna już istnieje } }
Zasięg obiektów • Życie obiektów jest inne od życia zmiennych typów podstawowych. { String str = new String(“abc”); } • Odwołanie str nie istnieje poza zasięgiemdeklaracji, natomiast obiekt wskazanyprzez str będzie nadal istniał.
Klasy • Obiekty które są identyczne z wyjątkiem stanu są grupowane w klasy, Klasa bytów (class) określa opis bytu (stałe, zmienne, pola) oraz jego zachowanie (metody) Klasa: interfejs i implementacja. • Obiekty klasy mają tą samą: • charakterystykę – elementy składowe • zachowanie – operacje na stanie • Różnią się wartością stanu, i tożsamością.
Klasy w języku Java • Każda klasa dziedziczy z klasy Object - przynajmniej pośrednio. • Klasa zadeklarowana jako final nie może być już niczyją nadklasą. • Za inicjalizowanie obiektów danej klasy odpowiadają konstruktory (Java tworzy domyślny - bezargumentowy).
Tworzenie typów • Nowe typy obiektów zawarte są w klasach. • Deklaracja klasy: class NazwaTypu { ... } • Utworzenie obiektów klasy: NazwaTypu a = new NazwaTypu(); • Klasa zawiera dwa rodzaje elementów: • pola – obiekty dowolnego typu lubzmienne typów podstawowych • metody – komunikaty które możeotrzymać dany obiekt
Pola klas • Każdy obiekt uzyskuje własny obszarpamięci dla swoich zmiennych: class Dane { int i; float f; Double d; } • Obiekty nie dzielą zmiennych między sobą.
Odwołanie do pól • Utworzenie obiektu klasy: Dane da = new Dane(); • Odwołanie do pól obiektu da: da.i = 47; da.f = 1.1f; da.d = new Double(1.0d);
Wartości pól • Gdy pole jest typu podstawowego, jeśli niezainicjowane, to otrzyma wartośćdomyślną: • boolean false, char '\u0000‘, byte (byte)0, short (short)0, int 0, long 0L, float 0.0f • Inicjalizacja jest gwarantowana dlazmiennych: • typu podstawowego • deklarowanych jako składowe klas • Inicjalizacja nie dotyczy zmiennychlokalnych, które nie są polami w klasie.
Korzystanie z ‘’innych’’ klas Położenie klasy ? • W tym samy pliku źródłowym – po prostu używamy • Inne położenie np. • klasa ArrayList import java.util.ArrayList; • Wszystkie klasy w pakiecie java.util import java.util.*;
Metody • Definicja: Metoda - Nazwane zachowanie obiektu jakie jest on zobowiązany przejawić; określona funkcjonalność jaką przejawiają obiekty danej klasy • W Javie rozróżniamy dwa rodzaje metod: • Metoda klasowa (static) istnieje jedna dla wszystkich obiektów danej klasy, nawet, gdy żaden z nich jeszcze nie został powołany do życia, • Metoda instancyjna - jest tyle kopii ile obiektów, czyli do każdego obiektu przypisana jest kopia metody instancyjnej.
Metody Klas • Metoda określa komunikat które możeotrzymać dany obiekt: typZwracany nazwaMetody(/*argumenty*/) { ciało metody } • Deklarowane tylko jako części składoweklas, i wywoływane na rzecz obiektu. • typZwracany to typ wartości zwracanychprzez metodę. • argumenty to typy i nazwy; listaargumentów przekazywanych metodzie. • ciało metody to definicja metody.
Wywoływanie metod • Podanie nazwy obiektu, kropki, nazwymetody, i jej listy argumentów (wysyłanie komunikatu do obiektu): nazwaObiektu.nazwaMetody(arg1,arg2) • Lista obiektów i ich klas, które mogą byćprzekazane metodzie: int pamiec(String str) { return str.length(); } • strjest referencją do obiektu. • length() jest jedną z metod łańcucha str.
Wynik metody • return pełni dwie funkcje: • określa opuszczenie metody • określa wartość zwracaną (jeśli jest) • Typ void - metoda nie zwraca wartości: void nic_return() { return; } void nic2_bez_return() { }
Przeciążanie Metod • Klasa posiada dwie lub więcej metod o tej samejnazwie ale różnych deklaracjach parametrów. • Java używa liczby i typów argumentów by ustalić, którą wersję metody należy wywołać. • Przeciążanie metod plus dziedziczenie to sposóbnaimplementację polimorfizmu.
Przykład class Metody { void test() { System.out.println("Brak parametrow"); } void test(int a) { System.out.println("a: " + a); } void test(int a, int b) { System.out.println("a i b: " + a + " " + b); } double test(double a) { System.out.println("double a: " + a); return a*a; } }
Przeciążanie i konwersja typów • Automatyczna kowersja typów gdy nie istnieje metodao dokładnym typie wywołania: void test() { System.out.println("Brak parametrow”); } void test(double a) { System.out.println("double a: " + a); } int i = 88; test(); test(i); • Następuje konwersja int na double
Przeciążanie i polimorfizm • Java umożliwia wystąpienie powiązanych metod podjedną nazwą: jeden interfejs, wiele metod. static int abs(int i) static long abs(long i) static float abs(float i)
Pola statyczne • Deklaracja pól statycznych: class StaticTest { static int i = 47; } • st1.i i st2.i są te same: StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest(); • Odwołanie przez obiekty klasy: st1.i++; • Odwołanie bez obiektu klasy: StaticTest.i++;
Metody statyczne • Możliwość wywołania metody bezkonieczności tworzenia obiektu (np. main): class StaticFun { static void incr() { StaticTest.i++ } } • Przez obiekt: StaticFunction sf = new StaticFunction(); sf.incr(); • Przez klasę: StaticFunction.incr();
Przykłady Program wyświetlający na ekranie słowo ‘’Hello World’’ i bieżącą datę: //HelloWorld.java- Komentarz import java.util.*;//???? public class HelloWorld { public static void main(String [] args) { System.out.println(“’Hello World , “); System.out.println(new Date()); } } • Nazwy klas rozpoczynają się od dużejlitery, każdy kolejny wyraz też z dużejlitery. • Nazwy zmiennych/pól/metod podobnie,ale pierwsza litera jest mała.
Konstruktor • Konstruktor realizuje automatyczną inicjację obiektuzaraz po jego utworzeniu, • Konstruktor posiada tą samą nazwę jak klasa, wktórej się znajduje, • Konstruktor piszemy bez typu wyniku: domyślnymtypem konstruktora klasy jest ta sama klasa, • Gdy klasa nie posiada konstruktora, domyślnykonstruktor automatycznie inicjuje pola zerami.
Konstruktor przykład class Pudelko { double szerokosc, wysokosc, glebokosc; //konstruktor pudelka Pudelko() { System.out.println(“Budujemy pudelko”); szerokosc = 10; wysokosc = 10; glebokosc = 10; } //oblicza objetosc pudelka double objetosc() { return szerokosc * wysokosc * glebokosc; } }
Parametryzowany Konstruktor class Pudelko { double szerokosc, wysokosc, glebokosc; //parametryzowany konstruktor pudelka Pudelko(double s, double w, double g) { szerokosc = s; wysokosc = w; glebokosc = g; } ... }
Słowo kluczowe this • Odwołanie z metody do obiektu który ją wywołał, • Przesłanianie Pól: • Nielegalne jest deklarowanie dwóch zmiennych o tejsamej nazwie wewnątrz zawierających się bloków, • Legalne jest deklarowanie zmiennych lokalnych i parametrów o tej samej nazwie jak pola klasy, • Następuje przesłonięcie pól przez zmienne lokalne: Pudelko(double szerokosc, double wysokosc,double glebokosc) { this.szerokosc = szerokosc; this.wysokosc = wysokosc; this.glebokosc = glebokosc; }
Metoda finalize() • Dodatkowe czynności do wykonania gdy obiekt jestusuwany z pamięci, np. zwolnienie dostępu do pliku wykonywane są przez metodę finalize(): protected void finalize() { ... } • Metoda wywoływana jest przez odśmiecacz pamięcigdy ten usuwa niepotrzebny obiekt ze sterty.
Pakiety • Definicja: Pakiety - Służą organizacji modelu przez łączenie elementów specyfikacji w grupy. • Pliki są grupowane w pakiety, które tworzą swoją integralną przestrzeń nazw, • Klasy mogą mieć te same nazwy wewnątrz innych pakietów, a do pełnej identyfikacji używa się złożenia nazwy pakietu i nazwy własnej klasy • Pakiet - zbiornik na klasy: • dzieli przestrzeń nazw na rozłączne zbiory • kontroluje widoczność klas i składowych klas
Pakiety cd… • Instrukcja pakietu umieszczona jako pierwsza komenda pliku źródłowego: package MojPakiet; • Wszystkie klasy w pliku należą do pakietu MojPakiet. • Inne pliki mogą posiadać tą samą instrukcję: pakiet rozkłada się na wiele plików. • Wszystkie pliki .class w pakiecie MojPakiet są zapisywane w katalogu MojPakiet. • Pakiet wielo-poziomowy: package pakiet1.pakiet11.pakiet111;
Importowanie pakietów Dodatkowe klasy/pakiety, które będąpotrzebne w kodzie programu importujemy słowem kluczowym import: import java.util.*; • java.lang- pakiet automatyczniewłączany do każdego pliku Java • Pakiet java.lang zawiera klasę System • Klasa System zawiera pole:static PrintStream out; • Klasa PrintStream zawiera metodę:void println(String x)