Podstawy otwartych języków programowania Język Java

advertisement
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);
}
}
Download