Podstawy otwartych języków programowania Język Java Wiktor Wandachowicz Platforma Java ● ● ● ● ● Stworzona przez Sun Microsystems, Inc. J2SE – Java 2 Standard Edition (platforma ogólnego przeznaczenia/desktop) J2EE – Java 2 Enterprise Edition (specyfikacja bibliotek do pracy na serwerze) J2ME – Java 2 Micro Edition (platforma dla urządzeń przenośnych) Dostępna dla systemów Solaris, Linux, Mac OS, Windows, *BSD i innycha JVM (Java Virtual Machine) ● ● ● ● Java jest językiem kompilowanym (np. kompilatorem javac), gdzie kodem wynikowym jest tzw. kod bajtowy (bytecode). Kod bajtowy jest interpretowanyprzez maszynę wirtualną Javy (np. program java). Jest on również przenośny, ponieważ nie zależy od systemu operacyjnego, typu procesora, itp. Write Once, Run Anywhere Obowiązki JVM ● ● ● ● ● ● ● Izolacja od systemu operacyjnego. Ładowanie klas do pamięci (dynamicznie). Przydzielanie pamięci. Automatyczne zwalnianie pamięci, odśmiecanie (garbage collection). Zarządzanie wątkami. Zarządzanie abstrakcjami systemu operacyjnego (pliki, strumienie we/wy). Integracja z systemem okienkowania (GUI). Biblioteki Javy ● ● ● Mnóstwo gotowych elementów. Możliwość łatwego użycia dodatkowych bibliotek. Podział na pakiety, np. – – – – – – – – elementy podstawowe w pakiecie java.lang elementy pomocnicze w pakiecie java.util obsługa GUI w java.awt, java.awt.event, javax.swing obsługa appletów w pakiecie java.applet strumienie we/wy w pakiecie java.io obsługa JDBC w pakiecie java.sql obsługa XML w pakiecie java.xml obsługa sieci w pakiecie java.net JRE i JDK ● ● Java Runtime Environment – JVM oraz biblioteki uruchomieniowe zależne od systemu operacyjnego, pozwalające na uruchamianie gotowych programów Javy. Java Development Kit – podstawowe narzędzia programistyczne (kompilator, debugger, narzędzia tworzenia dokumentacji, oraz wiele innych), pozwalające na tworzenie aplikacji. Tradycyjny model aplikacji JVM Aplikacja konsoli Aplikacja GUI System operacyjny Aplikacje: konsolowa, GUI public class MyClass { public static void main( String[] args ){ // start applikacji System.out.println("Hello!"); } } -------------------------------------------------------import javax.swing.*; public class MyGuiClass { public static void main( String[] args ){ // start applikacji JFrame mainFrame = new MyGuiFrame(); mainFrame.show(true); } } Model działania apletu Przeglądarka WWW JVM SecurityManager Applet System operacyjny Applet <applet code="BasicApplet.class" width="300" height="200"> </applet> -------------------------------------------------------public class BasicApplet extends java.applet.Applet { public BasicApplet(){ // konstruktor – minimalny zbiór operacji } public void init(){ // kontekst apletu gotowy, wykonanie // jednorazowo całej inicjalizacji } public void start(){ // aplet jest wyświetlany przez przeglądarkę } public void stop(){ // aplet jest ukrywany przez przeglądarkę } public void destroy(){ // zwolnienie wszystkich zasobów } } Model działania midletu JVM Aplikacja MIDP application-management software (AMS) Midlet import javax.microedition.midlet.*; public class BasicMIDlet extends MIDlet { public BasicMIDlet(){ // konstruktor – minimalny zbiór operacji } protected void startApp() throws MIDletStateChangeException { // wywoływana przy aktywacji MIDletu przez system } protected void pauseApp() { // wywoływana gdy system wstrzymuje MIDlet } } protected void destroyApp( boolean unconditional ) throws MIDletStateChangeException { // wywoływana gdy system usuwa MIDlet } Aplikacja na serwerze JEE JVM Kontener JSP i serwletów Serwlet Strona JSP Kontener J2EE Sesyjny EJB Encyjny EJB System operacyjny Podstawy otwartych języków programowania Elementy obiektowe Javy Wiktor Wandachowicz Elementy obiektowe ● ● ● ● ● ● ● ● Klasy Interfejsy Hermetyzacja Dziedziczenie Polimorfizm Metody i klasy abstrakcyjne Wyjątki Boxing, unboxing (Java 5,6) W bibliotekach: ● Kolekcje ● Obsługa zdarzeń (AWT/Swing) ● Graficzny interfejs użytkownika ● Strumienie wejścia / wyjścia ● ... Programowanie obiektowe ● Reprezentacja pojęć z dziedziny problemu ● Cechy podejścia obiektowego: 1. Wszystko jest obiektem 2. Program jest zbiorem obiektów, które poprzez wysyłanie komunikatów mówią sobie co robić 3. Każdy obiekt posiada własną pamięć, na którą składają się inne obiekty 4. Każdy obiekt posiada swój typ 5. Wszystkie obiekty tego samego typu mogą otrzymywać te same komunikaty Klasy Klasa jest abstrakcyjnym typem danych, definiowanym przez programistę. Jej celem jest reprezentowanie w programie pojęcia istniejącego w dziedzinie problemu, nie zmuszając do używania języka specyficznego dla maszyny. * W programach często potrzebne są również klasy, które nie mają odpowiedników w dziedzinie problemu. Mają charakter pomocniczy (i są bardzo przydatne!) Obiekt posiada interfejs Nazwa typu Interfejs publiczny Żarówka zapal() zgaś() rozjaśnij() przyciemnij() Interfejs publiczny ustala, jakie żądania można kierować do danego obiektu. Razem z kodem realizującym żądania składa się to na implementację. Żarówka zr = new Żarówka(); zr.zapal(); Obiekt – egzemplarz klasy Żarówka moc jasność zapal() zgaś() rozjaśnij() przyciemnij() Klasa ● ● ● zr : Żarówka moc = 100 {W} jasność = 90 {%} z3 : Żarówka z2 : Żarówka moc = 60 {W} jasność = 50 {%} moc = 200 {W} jasność = 0 {%} Obiekty Każdy obiekt przechowuje swój własny stan. Kod obsługujący wszystkie obiekty tej samej klasy jest wspólny. Obiekt „wie” gdzie jest kod, który go obsługuje. Nazewnictwo Klasa Żarówka Pola Metody moc jasność zapal() zgaś() rozjaśnij() przyciemnij() Składowe klasy INACZEJ:Pola – dane, zmienne składowe (ang. member variables) Metody – funkcje składowe (ang. member functionas) Przykład – klasa Żarówka public class Żarówka { private int moc; private double jasność; } public Żarówka(double moc) { this.moc = moc; } public void zapal() { jasność = 90; } public void zgaś() { jasność = 0; } public void rozjaśnij() { jasność = (jasność + 10 > 100) ? 100 : jasność + 10; } public void przyciemnij() { jasność = (jasność - 10 < 0) ? 0 : jasność - 10; } Przechowywanie obiektów ● ● Obiekty identyfikowane są przez uchwyt (ang. handle), nazywany także referencją (ang. reference). Każdy obiekt musi zostać utworzony, zanim będzie można go użyć (stąd użycie pustego uchwytu powoduje błąd – wyjątek). Żarówka zr; zr.zapal(); // pusty uchwyt // BŁĄD !!! // utworzenie obiektu i przypisanie do uchwytu zr = new Żarówka(100); zr.zapal(); // OK. Żarówka zr2 = new Żarówka(60); zr2.rozjaśnij(); // utworzenie z przypisaniem Ukrywanie implementacji (kontrola dostępu) ● ● ● Kontrola tego co jest dostępne z zewnątrz. Zabezpieczenie przed błędami (popsuciem). Słowa kluczowe: private protected public brak – – – – składowe niedostępne z zewnątrz klasy dostępne dla klas pochodnych dostępne dla wszystkich dostęp pakietowy („friendly”) Hermetyzacja ● Grupowanie danych i metod w klasy jest często nazywane enkapsulacją. Dane + Zachowanie = enkapsulacja ● W połączeniu z ukrywaniem danych jest często nazywane hermetyzacją. Klasa + Kontrola dostępu = hermetyzacja Dziedziczenie ● ● ● ● Pozwala na stworzenie nowej klasy w oparciu o już istniejącą. Rozbudowa o nowe elementy (rozszerzenie funkcjonalności). Zastąpienie niektórych definicji nowymi (zmiana zachowania). Wprowadza relację „bycia czymś” (np. Okrąg jest Figurą). Nazewnictwo i oznaczenia Zwierzę waga wydajDźwięk() jedz() śpij() obudźSię() <<extends>> Klasa bazowa (ew. klasa rodzicielska, nadklasa, superclass) dziedziczenie Słoń wydajDźwięk() jedz() Klasa pochodna (podklasa, subclass) Metody i klasy abstrakcyjne ● ● ● ● ● Metoda w klasie może być abstrakcyjna, czyli nie na w klasie treści (ciała) tej metody. Oznaczenie: słowo kluczowe abstract Jeśli choć jedna metoda w klasie jest abstrakcyjna, także i klasa jest abstrakcyjna (również trzeba dodać abstract). Metoda abstrakcyjna musi być zdefiniowana w klasie pochodnej (dziedziczenie). Nie można tworzyć obiektów na podstawie klas abstrakcyjnych. Interfejsy ● ● ● ● Interfejs jest podobny do klasy, ale nie zawiera implementacji (ciała) metod, tylko ich zapowiedzi (klasa czysto abstrakcyjna). Interfejsy rozwiązują w Javie problem dziedziczenia jednobazowego Klasa implementuje interfejs przez zdefiniowanie wszystkich metod w nim zawartych. Podobnie jak przy dziedziczeniu: wszędzie gdzie potrzebny jest obiekt typu takiego jak dany interfejs, można użyć obiektu, który ma ten interfejs zaimplementowany. Nazewnictwo i oznaczenia Zwierzę waga <<Interface>> Domowy wydajDźwięk() jedz() śpij() obudźSię() głaskanie() <<implements>> <<extends>> Klasa abstrakcyjna Interfejs implementacja interfejsu Kotek wydajDźwięk() jedz() głaskanie() Klasa konkretna Polimorfizm ● ● ● ● Zmiana zachowania w klasie pochodnej przez przesłonięcie definicji metody bazowej nową wersją. Pozwala traktować obiekt klasy pochodnej jak obiekt obiekt klasy bazowej (wymienialność). Umożliwia pisanie ogólnego kodu działającego niezależnie od konkretnego typu (abstrakcja). Na kod taki nie ma wpływu dodawanie nowych typów (rozszerzalność). Wyjątki ● ● ● ● ● Zintegrowana z językiem obsługa błędów. Można specyfikować różne rodzaje błędów poprzez użycie dziedziczenia pomiędzy klasami wyjątków. Podstawową klasą związaną z obsługą błędów jest java.lang.Throwable Istnieją jej dwie główne klasy pochodne: java.lang.Exception (najczęściej używana) oraz java.lang.Error Obsługa wyjątków poprzez słowa kluczowe throw, catch, finally, throws. Autoboxing, uboxing (Java 5,6) ● ● ● Automatyczne stosowanie typów opakowujących zamiast typów prostych. Przypisanie wyrażenia typu podstawowego (np. int, double) do zmiennej referencyjnej (np. Integer, Double) nie wymaga ręcznego tworzenia obiektów. Przy odczycie wartości wystarczy zwykłe rzutowanie na typ podstawowy (np. int, double). int i = 5; Integer x = new Integer(i); int j = x.intValue(); // stary sposób przypisania // stary odczyt wartości Integer y = i; int k = (int) y; // nowy sposób przypisania // nowy odczyt wartości Podstawy otwartych języków programowania Elementy języka Wiktor Wandachowicz Typy podstawowe ● ● ● ● ● ● ● ● ● ● boolean char byte short int long float double Tablice Napisy (String) ● ● ● ● ● ● ● ● Boolean Character Byte Short Integer Long Float Double Równoważne im obiektowe typy opakowujące (ang. wrapper types) Struktury kontrolne ● Pętle for (inicjalizacja; warunek; zmiana) { ... } for (obiekt : kolekcja) { ... } do { ... } while (warunek); while (warunek) { ... } ● Operacje warunkowe if (warunek) { ... } if (warunek) { ... } else { ... } operator „?” (warunek ? gdy_prawda : gdy_fałsz) ● Instrukcja wyboru switch (wyrażenie) { case wartość: ... ; break; default: ... ; } ● Obsługa wyjątków try { ... } catch (wyjątek) { ... } finally { ... } Instrukcje ● Deklaracja zmiennej, przypisanie int x = 5, y, z = 6; ● y = x * z; Tworzenie obiektów java.util.Random r = new java.util.Random(); Osoba o = new Osoba("Jan", "Kowalski"); ● Wywołanie metody double wynik = Math.pow(2.1, 4); new Obliczenia().run(); ● Blok instrukcji { } ● /* instrukcje proste */ Komentarze // jednoliniowe /* wieloliniowe */ /** dokumentacyjne – Javadoc */ Operatory ● Matematyczne + ● * / && -= *= /= %= Bitowe &= ^= Relacyjne == ● += ! | & ^ |= << >> >>> ● % Logiczne || ● - != > >= < <= Porównanie dla obiektów (w tym napisy) – equals Osoba osoba1 = ... ; Osoba osoba2 = ... ; if (osoba1.equals(osoba2)) ... ; String s = "abcd"; if ("defg".equals(s)) ... ; Metody ● ● ● ● ● ● Metody statyczne (zawsze dostępne, z poziomu klasy). Metody wirtualne (wymagany obiekt aby móc wywołać). Deklaracja metody: – specyfikator dostępu (public, protected, private) – typ wyniku (podstawowy, obiektowy – klasa, lub void) – nazwa – parametry (postaci: typ parametru i nazwa) – specyfikacja rzucanych wyjątków Wszystkie metody niestatyczne są wirtualne (mogą być dziedziczone i przedefiniowywane w klasach pochodnych). Nie ma czegoś takiego jak „wskaźnik do metody”. Java 5,6 – metody mogą mieć otwartą listę parametrów. Klasy ● ● ● ● ● ● Podstawowy element organizacji kodu programu. Umieszczane w pakietach (równoważne z podkatalogami). Mogą zawierać klasy wewnętrzne. Na podstawie klas tworzone są obiekty. Typowo nazwa pliku źródłowego (bez rozszerzenia) jest taka sama jak nazwa klasy tam zawartego. Klasa o dostępie publicznym musi być w pliku o takiej samej nazwie i może być tam tylko jedna taka klasa (klasa publiczna). Tablice ● ● ● ● ● ● ● ● Każda tablica jest traktowana jak obiekt. Mogą zawierać dane typów podstawowych jak również typów obiektowych. Mogą być jedno- lub wielowymiarowe. Tablice wielowymiarowe zawierają podtablice mniejszego wymiaru. Każdy wymiar tablicy indeksowany jest od [0] (zera). Dla każdego wymiaru tablicy dostępne jest pole length zawierające ilość elementów. Nie można dynamicznie zmieniać rozmiaru tablicy, za każdym razem trzeba tworzyć nową tablicę żądanego rozmiaru (i ewentualnie kopiować dane). Tablica obiektów po utworzeniu zawiera uchwyty puste (null), trzeba więc pamiętać o jej wypełnieniu. Przykład package biblioteka.dane; public class Autor { private String nazwisko; private Książka[] książki; private int ilośćKsiążek = 0; public Autor(String nazwisko, int maxKsiążek) { this.nazwisko = nazwisko; książki = new Książka[maxKsiążek]; } public void dodajKsiążkę(Książka k) throws IllegalArgumentException { if (ilośćKsiążek < książki.length) { książki[ilośćKsiążek++] = k; } else { throw new IllegalArgumentException( "przekroczony limit książek: " + książki.length); } }