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 moc jasność Żarówka zapal() zgaś() rozjaśnij() przyciemnij() zr : Żarówka moc = 100 {W jasność = 90 {% z2 : Żarówka moc = 60 {W jasność = 50 {% z3 : Żarówka moc = 200 {W jasność = 0 {% Klasa 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 Pola Metody moc jasność Żarówka 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; // pusty uchwyt zr.zapal(); // BŁĄD!!! // utworzenie obiektu i przypisanie do uchwytu zr = new Żarówka(100); zr.zapal(); // OK. Żarówka zr2 = new Żarówka(60); // utworzenie z przypisaniem zr2.rozjaśnij();
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 waga Zwierzę wydajdźwięk() jedz() śpij() obudźsię() Klasa bazowa (ew. klasa rodzicielska, nadklasa, superclass) <<extends>> Słoń wydajdźwięk() jedz() dziedziczenie 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 waga Zwierzę wydajdźwięk() jedz() śpij() obudźsię() <<Interface>> Domowy głaskanie() Interfejs <<extends>> Klasa abstrakcyjna <<implements>> Kotek wydajdźwięk() jedz() głaskanie() implementacja interfejsu 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); // stary sposób przypisania int j = x.intvalue(); // 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 Boolean Character Byte Short Integer Long Float Double Tablice Napisy (String) 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 + - * / % += -= *= /= %= Logiczne &&! Bitowe & ^ = &= ^= << >> >>> Relacyjne ==!= > >= < <= 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);