Język programowania Java. Marek Wojciechowski

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

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Programowanie obiektowe. Wprowadzenie

Programowanie obiektowe

Zaprojektowana "od zera", początkowo pod nazwą Oak Początkowo pomyślana do zastosowań w urządzeniach. elektronicznych codziennego użytku

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Programowanie obiektowe

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

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Multimedia JAVA. Historia

Programowanie obiektowe

2. Składnia, środowisko i konwencje w Javie

Programowanie w języku Java. Kolekcje

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

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

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Programowanie obiektowe

Programowanie obiektowe

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Programowanie w Internecie. Java

Java jako język programowania

Kolekcje mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

1 Atrybuty i metody klasowe

Platformy Programistyczne Podstawy języka Java

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

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

Dokumentacja do API Javy.

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie obiektowe zastosowanie języka Java SE

Spis treści. O autorze (11) O redaktorze technicznym (11) Wstęp (13) Rozdział 1. Podstawy Javy (19)

Podstawy otwartych języków programowania Przechowywanie danych

Kolekcje. Na podstawie:

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Programowanie w Javie cz. 1 Wstęp. Łódź, 24 luty 2014 r.

Programowanie obiektowe

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

Java Język programowania

Język programowania Java. Marek Wojciechowski

Język programowania Java. Marek Wojciechowski

Tworzenie aplikacji w języku Java

Programowanie i projektowanie obiektowe

Programowanie obiektowe - 1.

Kolekcja (kontener) to po prostu obiekt, który grupuje wiele elementów w jeden twór.

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Java w 21 dni / Rogers Cadenhead. Gliwice, cop Spis treści. O autorze 11. Wprowadzenie 13 TYDZIEŃ I JĘZYK JAVA

Wykład 7: Pakiety i Interfejsy

Dziedziczenie. dr Jarosław Skaruz

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

Wykład 2: Podstawy Języka

Podstawy programowania skrót z wykładów:

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie wieloplatformowe w Java

java.util.* :Kolekcje Tomasz Borzyszkowski

Programowanie obiektowe

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

Podstawowe części projektu w Javie

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

Programowanie w języku Java 7 z biblioteką SWING

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

Dawid Gierszewski Adam Hanasko

Java EE produkcja oprogramowania

Wykład 8: Obsługa Wyjątków

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

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Wprowadzenie do języka Java

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

1 Podstawy c++ w pigułce.

Wykład 6: Dziedziczenie

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Programowanie Obiektowe (Java)

Programowanie w języku Java (OCA+OCP)

Ćwiczenie 1. Przygotowanie środowiska JAVA

Definicje klas i obiektów. Tomasz Borzyszkowski

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Kurs WWW. Paweł Rajba.

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

Kolekcje - pakiet Java Collections Framework

Kurs programowania. Wykład 9. Wojciech Macyna

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Microsoft IT Academy kurs programowania

Język programowania Scala / Grzegorz Balcerek. Wyd. 2. Poznań, cop Spis treści

WPROWADZENIE DO JĘZYKA JAVA

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

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Język C++ Programowanie obiektowe

Operatory. Składnia. Typy proste. Znaki specjalne

Programowanie obiektowe i język Java

1 Podstawy c++ w pigułce.

KOTLIN. Język programowania dla Androida

Transkrypt:

1 Język programowania Java Marek Wojciechowski

2 Czym jest Java? Język programowania prosty zorientowany obiektowo rozproszony interpretowany wydajny Platforma bezpieczny wielowątkowy przenaszalny dynamiczny Rozumiana jako środowisko do uruchamiania programów Platforma software owa Oparta o maszynę wirtualną Java (JVM)

Edycje Javy (wersje środowisk programistycznych) 3 Java Platform, Standard Edition (Java SE, dawniej J2SE) Trzon technologii Java Wyznacza wersje języka Java Wczesne wersje (JDK): 1.0, 1.1 Java 2 (2nd generation, J2SE): 1.2, 1.3, 1.4, 5.0 (1.5) Java SE: 6 (1.6), 7 (1.7), 8 (1.8) Kompilator, maszyna wirtualna, narzędzia pomocnicze Java Development Kit (JDK) Java Runtime Environment (JRE) Java Platform, Enterprise Edition (Java EE, dawniej J2EE) Platforma do tworzenia aplikacji dla serwerów aplikacji Java SE + serwer aplikacji, narzędzia do prototypowania aplikacji Java Platform, Micro Edition (Java ME, dawniej J2ME) Dla zastosowań w urządzeniach mobilnych (telefony, PDA) Java Card Dla zastosowań w kartach chipowych (ang. smart cards)

4 Język programowania Java Zorientowany obiektowo język programowania prosta składnia rozbudowane biblioteki Zaprojektowana przez firmę Sun (twórca: James Gosling) Obecnie Java należy do Oracle Specyfikacje techniczne tworzone w ramach Java Community Process (JCP) Język o składni podobnej do C++ Podobieństwo składni, inna filozofia (bliższa np. językowi Smalltalk) Zaprojektowana "od zera", początkowo pod nazwą Oak Początkowo pomyślana do zastosowań w urządzeniach elektronicznych codziennego użytku Przyjęła się jako język do zastosowań sieciowych (aplikacje intra- i internetowe, szczególnie korporacyjne)

5 Charakterystyka języka Java (1) Java jest prosta składnia podobna do C++ nie ma w Javie: przeciążania operatorów (poza jednym wyjątkiem) plików nagłówkowych i preprocesora operacji arytmetycznych na wskaźnikach struktur i unii dziedziczenia wielobazowego wzorców niejawnej konwersji typów Java jest zorientowana obiektowo klasy i interfejsy

6 Charakterystyka języka Java (2) Java jest kompilowana, ale niezależna od architektury kompilacja do kodu pośredniego - bajtkodu (ang. byte code) kod pośredni jest interpretowany przez Java Virtual Machine (JVM) definicja języka i maszyna wirtualna są w pełni wyspecyfikowane nie ma elementów niezdefiniowanych lub zależnych od implementacji (np. typy proste są takie same na wszystkich maszynach) pełna przenaszalność kodu źródłowego i wynikowego: "Write Once, Run Anywhere" (WORA) Java jest wielowątkowa wątki Javy w miarę możliwości przekładane są na wątki systemu operacyjnego możliwość synchronizacji

7 Charakterystyka języka Java (3) Java nadzoruje pamięć nie ma wskaźników takich jak w C++ dostęp do obiektów przez referencje referencje zachowują się jak "bezpieczne wskaźniki" każdy dostęp do pamięci jest kontrolowany odśmiecanie pamięci (ang. garbage collection) Java jest odporna na błędy i bezpieczna ściśle określona forma kodu pośredniego kontrola dostępów do pamięci obsługa błędów w oparciu o wyjątki ograniczenie dostępu do zasobów (Security Manager)

8 Charakterystyka języka Java (4) Java jest niewielka pomyślana dla małych systemów Java jest stosunkowo szybka szybka w porównaniu z innymi językami interpretowanymi wolniejsza od C (może to nie mieć znaczenia w programach wykorzystujących komunikację sieciową lub często oczekujących na reakcję użytkownika) JVM może wykorzystywać kompilatory typu Just-In-Time, aby poprawić efektywność przetwarzania Java jest rozszerzalna istnieje możliwość wykorzystywania bibliotek napisanych w innych językach Java jest dynamiczna np. możliwość pobierania klas z Internetu w trakcie pracy programu

9 Uruchamianie programów w języku Java Kod źródłowy *.java Kod wynikowy *.class Kompilator języka Java Maszyna wirtualna Javy (JVM)

10 Maszyna wirtualna Javy (JVM) Zachowuje się jak "wirtualny komputer" interpretujący bajtkod Javy Stanowi bezpieczne środowisko do uruchamiania programów Musi być zaimplementowana dla konkretnej platformy JVM może wykorzystywać kompilację Just-In-Time (JIT) kompilacja "w locie" bajtkodu do instrukcji maszynowych szczególnie efektywna w przypadku powtarzalnych fragmentów kodu (np. pętle) JVM może stanowić samodzielną aplikację lub być wbudowana w inny program np. przeglądarkę

11 Inne języki dla JVM Początkowo Java była jedynym językiem kompilowanym do bajtkodu uruchamianego na JVM Z czasem pojawiły się kompilatory dla innych języków generujące bajtkod dla JVM Interpretery istniejących języków: JRuby (Ruby) Jython (Python) Rhino (JavaScript) Nowe języki dla JVM: Groovy (dynamiczny język skryptowy) Scala (łączy programowanie obiektowe z funkcyjnym) Closure (dialekt języka LISP)

12 Java vs..net Microsoft.NET Framework oparty o podobne koncepcje Wirtualne środowisko uruchomieniowe (CLR vs. JVM) Podstawowy język C#, podobny koncepcyjnie i składniowo do Javy (choć występują w obu tych obszarach różnice), również nawiązujący do C++, ale o bardziej rozbudowanej składni niż Java Java dostępna na wiele platform,.net w pełni dostępny tylko pod Windows.NET od początku zorientowany na wiele języków kompilowanych do tego samego formatu kodu pośredniego, Java przez wiele lat jako jedyny język platformy Java

13 Typy programów Java Samodzielne aplikacje graficzne pracujące w trybie tekstowym Aplety małe aplikacje zagnieżdżane w dokumentach HTML w dużym stopniu przyczyniły się do popularności Javy Serwlety aplikacje pracujące po stronie serwera mogą stanowić alternatywę dla CGI w serwerach WWW JavaBeans komponenty języka Java, zbudowane wg ustalonego wzorca, tworzone z myślą o ich wielokrotnym wykorzystaniu Enterprise JavaBeans komponenty języka Java wykorzystujące architekturę rozproszoną

14 Programowanie obiektowe (1) Abstrakcja identyfikacja obiektów i operacji na nich klasyfikacja podobnych obiektów za pomocą klas zdefiniowanie atrybutów i dopuszczalnych operacji dla poszczególnych klas Hermetyczność ukrycie wewnętrznej implementacji klas dostęp do obiektów poprzez wyspecyfikowany interfejs interakcja z obiektami przez wysyłanie komunikatów (wywołania publicznych metod) zalety: ochrona i elastyczność kodu

15 Programowanie obiektowe (2) Dziedziczenie technika wykorzystania istniejących fragmentów kodu polega na tworzeniu nowych klas na bazie już istniejących cechy wspólne dla wszystkich podklas definiowane są w nadklasie podklasa może korzystać z cech nadklasy nadpisywać zachowanie nadklasy dodawać nowe atrybuty i zachowania Polimorfizm pozwala w jednolity sposób traktować obiekty klas z hierarchii dziedziczenia przy zachowaniu ich charakterystycznego zachowania od strony technicznej sprowadza się do tzw. późnego wiązania metod przy ich wywołaniu (wybór metody na podstawie typu obiektu) w Javie wszystkie metody zachowują się jak metody wirtualne w C++

16 Aplikacje w języku Java Kod programu w języku Java jest pogrupowany w klasy Aplikacje Java posiadają w jednej z klas wyróżnioną metodę o nazwie main(), od której rozpoczyna się wykonanie programu Hello.java public class Hello { public static void main(string[] args) { System.out.println("Hello world");

Przekazywanie parametrów wywołania aplikacjom Java 17 Parametry przekazywane jako tablica obiektów klasy String Tablica w Javie jest pełnoprawnym obiektem Hello.java public class Hello { public static void main(string[] args) { if (args.length > 0) else System.out.println("1st parameter: " + args[0]); System.out.println("No parameters");

18 Java Developer s Kit (JDK) / Java SE Środowisko do tworzenia i uruchamiania aplikacji Java Zbiór narzędzi wywoływanych z linii poleceń: javac - kompilator java java - maszyna wirtualna Javy appletviewer - przeglądarka apletów jdb - debugger klas Java javadoc - generator dokumentacji klas w formacie HTML Dostępne również jest Java Runtime Environment (JRE) Wyłącznie środowisko uruchomieniowe Dostępnych wiele środowisk IDE: NetBeans, Eclipse, Oracle JDeveloper, IntelliJ IDEA

19 Kompilacja i uruchomienie programu public class SayHello { public static void main(string[] args) { System.out.println("Hello world"); C:> javac SayHello.java C:> java SayHello Hello world Plik SayHello.java Kompilacja pliku.java do pliku.class Uruchomienie programu Wielkość znaków jest istotna Maszyna wirtualna Javy szuka wywoływanych klas w katalogach i archiwach wymienionych w zmiennej środowiskowej CLASSPATH, np.: CLASSPATH=.;c:\klasy;c:\lib\biblioteka.jar Kropka oznacza katalog bieżący, separatorem w Win jest ; a w UNIX :

Składnia języka Java 20

Typy proste 21 Liczby, znaki i wartości logiczne w Javie nie są obiektami (w odróżnieniu od w pełni obiektowych języków") Java oferuje 8 typów prostych: boolean (true lub false) char (16-bitowy Unicode) byte (8-bitowy typ całkowity, ze znakiem, U2) short (16-bitowy typ całkowity, ze znakiem, U2) int (32-bitowy typ całkowity, ze znakiem, U2) long (64-bitowy typ całkowity, ze znakiem, U2) float (32-bitowy typ zmiennoprzecinkowy, IEEE 754) double (64-bitowy typ zmiennoprzecinkowy, IEEE 754) W przypadku gdy istnieje konieczność traktowania wartości prostych jak obiektów należy (jawnie lub niejawnie od 1.5) skorzystać z tzw. klas opakowujących (ang. wrapper) np. by przypisać im null, umieścić w kolekcjach

22 Komentarze /* Komentarz wielowierszowy (jak w C i C++). */ // Komentarz jednowierszowy (jak w C++) /** Komentarz wykorzystywany przez narzędzie javadoc do automatycznego generowania dokumentacji. */

23 Zmienne Każda zmienna posiada typ typ prosty (int, float, boolean,...) typ obiektowy typ tablicowy typ wyliczeniowy (od 1.5) Zmienne muszą być deklarowane przed użyciem Deklaracja może być połączona z nadaniem wartości Java jest językiem o ścisłej kontroli typów int age; double pi = 3.14; boolean prawda = true, falsz = false;

24 Nazwy zmiennych Zaczynają się od litery, znaku podkreślenia lub $ Na kolejnych pozycjach mogą występować również cyfry Wielkość liter w języku Java ma znaczenie! Nazwy zmiennych nie mogą pokrywać się z zastrzeżonymi słowami kluczowymi języka Java: boolean, byte, char, double, float, int, long, short, void false, null, true abstract, final, native, private, protected, public, static, synchronized, transient, volatile break, case, catch, continue, default, do, else, finally, for, if, return, switch, throw, try, while class, extends, implements, interface, throws import, package, instanceof, new, super, this strictfp, assert, enum

25 Literały Całkowitoliczbowe 12, -12, 0123, 0x12f, 0X7A3, 15L Zmiennoprzecinkowe 8.31, 3.00e+8, 8.31F, 3.00e+8f Logiczne true, false Znakowe 'a', '\n', '\u00ff', '\077' Tekstowe "Hello\n"

26 Operator przypisania = Operator o wiązaniu prawostronnym Przypisania można łączyć (instrukcja przypisania zwraca wartość) int myage, yourage; double pi; boolean prawda; pi = 3.14; prawda = true; myage = yourage = 28;

27 Jawna i niejawna konwersja typów Niejawna konwersja dokonywana jest z mniejszych do większych typów całkowitoliczbowych (byte -> short -> int -> long) W innych przypadkach konieczna jest jawna konwersja przez operację rzutowania int i = 1; short s = 3; byte b; i = s; // OK b = s; // Błąd b = (byte) s; // OK, ale możliwość utraty informacji

28 Operatory (1) Arytmetyczne +, -, *, /, % (modulo) Inkrementacja, dekrementacja ++, -- 2 warianty: przedrostkowy, przyrostkowy Porównania >, <, >=, <=, ==,!= ich wynikiem jest wartość typu boolean Logiczne &&, & (and z/bez krótkiego wartościowania), (or z/bez krótkiego wartościowania) ^ (xor)! (not)

29 Operatory (2) Przypisanie złożone op=, gdzie op jest operatorem dwuargumentowym np. +=, -= Konkatenacja łańcuchów znaków (obiektów klasy String) +, += (jedyny przeciążony operator w Javie) Priorytet operatorów Priorytet 1 2 3 4 5 6 7 8 9 10 11 12 13 Operatory ++ -- + - ~! (typ) * / % + - + << >> >>> < > <= >= instanceof ==!= & ^ &&?: = op= Wiązanie R L L L L L L L L L L L R

30 Blok kodu Sekwencja instrukcji ograniczona nawiasami klamrowymi Może wystąpić w instrukcjach warunkowych i pętlach zamiast pojedynczej instrukcji { int i = 1; short s = 3; byte b; i = s; b = (byte) s;

31 Instrukcja if if ( boolean_expr ) statement1; else statement2; if ( a > 10 ) b = 1; else b = 2; Operator?: boolean_expr? expr1 : expr2 b = (a>10? 1 : 2);

32 Instrukcja switch int, byte, short i char oraz typy opakowujące dla nich, enum (od 1.5), String (od 1.7) switch (expr ) { case constant_expr1: statement1; break; case constant_expr2: statement2; break; default: statement3; break; char c = 'a'; switch ( c ) { case 'a': System.out.println('A'); break; case 'b': System.out.println('B'); break; default: System.out.println('?'); break; char c = 'a'; switch ( c ) { case 'a': System.out.println('A'); case 'b': System.out.println('B'); default: System.out.println('?'); A A B?

Pętla while 33 while ( boolean_expr ) statement; int[] tab = {10,20,30,40; int i = 0; while ( i < tab.length ) { System.out.println(tab[i]); i++; Pętla do-while do statement; while ( boolean_expr ); int[] tab = {10,20,30,40; int i = 0; do { System.out.println(tab[i]); i++; while ( i < tab.length );

Pętla for 34 for ( init_expr; boolean_expr; update_expr ) statement; int[] tab = {10,20,30,40; for (int i = 0; i < tab.length; i++ ) System.out.println(tab[i]); Pętla for : wersja for-each (od 1.5) for ( variable : array/collection ) statement; int[] tab = {10,20,30,40; for (int elem : tab ) System.out.println(elem);

Instrukcje break i continue 35 break służy do opuszczenia pętli lub instrukcji switch continue służy do przejścia do następnej iteracji pętli Powyższe instrukcje domyślnie "wyskakują" z najbardziej zagnieżdżonej pętli Powyższe instrukcje mogą posiadać etykiety możliwość wyskoku z kilku zagnieżdżonych pętli kompensacja braku instrukcji goto w Javie outer_loop: for (int i = 0; i < 10; i++) { for (int j = 0; j < 5; j++) { System.out.println(i, j); if (i + j > 7) break outer_loop;

36 Tablice Tablice są obiektami tworzone dynamicznie (new) zmienne tablicowe są referencjami Rozmiar tablic specyfikowany przy tworzeniu Indeksowanie tablicy od zera Elementy są automatycznie inicjalizowane (dla liczb: zerami, dla obiektów: referencjami pustymi null) Odwołanie się poprzez niewłaściwy indeks generuje wyjątek Rozmiar tablicy dostępny jako pole o nazwie length Tablice wielowymiarowe jako tablice tablic

37 Korzystanie z tablic int [] tab = new int[10]; for (int i=0; i < tab.length; i++) tab[i] = i; for (int elem : tab) // od 1.5 System.out.println(elem); int [][] chessboard; chessboard = new int[8][8]; int [] primes = {1,2,3,5,5+2; String [] verbs = {"go", "sleep";

38 Typy wyliczeniowe (od 1.5) Typy wyliczeniowe w Javie są klasami Mogą posiadać metody Każdy typ wyliczeniowy posiada kilka predefiniowanych metod, np. values() enum PLEC {KOBIETA, MEZCZYZNA; class Student { PLEC plec; public Student(PLEC p) { plec = p; public Student() { plec = PLEC.KOBIETA; for (PLEC p : PLEC.values()) System.out.println(p); KOBIETA MEZCZYZNA

39 Klasy [ModyfikatorKlasy] class NazwaKlasy [extends Nadklasa] [implements ListaInterfejsów] { // Lista metod i pól ModyfikatorKlasy może być kombinacją wyrażeń: abstract - klasa zawiera metody abstrakcyjne final - nie może posiadać podklas public - może być używana w dowolnym miejscu jedna klasa publiczna w pliku (nazwa pliku = nazwa klasy) <puste> - dostęp w ramach pakietu, w którym występuje private, protected - tylko dla klas wewnętrznych, znaczenie jak dla innych składowych klasy zewnętrznej

Metody 40 [ModyfikatorMetody] TypZwrotny Nazwa (Typ arg1,...) { // implementacja metody ModyfikatorMetody może być kombinacją wyrażeń: modyfikator widzialności public - dostępna dla metod spoza klasy protected - dostępna w klasach z pakietu i wszystkich podklasach <puste> - dostępna w klasach z pakietu, w którym występuje private - dostępna tylko dla metod z tej samej klasy final - metoda nie może zostać przesłonięta w podklasie static - metoda wołana na rzecz klasy, a nie konkretnego jej obiektu nie może bezpośrednio odwoływać się do składowych instancji (a jedynie do innych składowych statycznych) synchronized - blokuje dostęp do obiektu na czas wykonywania native - zaimplementowana w innym języku abstract - metoda bez implementacji

Pola 41 [ModyfikatorPola] Typ Nazwa [ = wartość]; ModyfikatorPola może być kombinacją wyrażeń: modyfikator widzialności public - dostępna dla metod spoza klasy protected - dostępna w klasach z pakietu i wszystkich podklasach <puste> - dostępna w klasach z pakietu, w którym występuje private - dostępna tylko dla metod z tej samej klasy static - pole obecne w klasie, a nie jej obiektach wspólne dla wszystkich wystąpień obiektu dostępne nawet gdy nie istnieją żadne obiekty klasy final - stała, musi być zainicjalizowana

42 Definiowanie klasy - przykład Nazwa klasy public class Konto { float stan; public void wplata(float kwota){ stan = stan + kwota; Atrybuty obiektu (zmienne instancji) Definicje metod public float pobierzsaldo() { return stan; Zwrócenie wyniku Typ zwrotny Argument wejściowy

43 Składowe statyczne klasy public class Konto { static double limitkredytu = 1000.0; public static double podajlimitkredytu() {... return limitkredytu; Zmienna klasy (statyczna) Metoda klasy (metoda statyczna) static { // złożona inicjalizacja // składowych statycznych Statyczny blok inicjalizacyjny

Przykłady składowych statycznych 44 Metoda main() Stałe w klasie Math: Math.PI, Math.E Metody klasy Math: Math.sin(), Math.cos() Zmienne klasowe w klasie System, np. System.out System.out.println() Metoda instancji w klasie strumienia Klasa Statyczna zmienna w klasie System (typu strumienia)

Organizacja kodu w języku Java 45 W jednym pliku źródłowym Java może znajdować się tylko jedna klasa publiczna Plik może zawierać wiele klas niepublicznych lub zagnieżdżonych Po kompilacji KAŻDA klasa jest umieszczana w osobnym pliku *.class Nazwa pliku MUSI być taka sama jak nazwa klasy publicznej w nim definiowanej Nie ma pojęcia programu głównego, nie ma zmiennych globalnych, cały kod jest zawarty w klasach public class Konto { float stan; public void wplata(float kwota){ stan = stan + kwota; public float pobierzsaldo() { return stan; Konto.java

Konwencje dotyczące nazw 46 Konwencje nie oznaczają wymagań! Nazwy niezgodne z przyjętymi konwencjami nie spowodują błędów kompilacji Stosowanie się do konwencji poprawia czytelność kodu Konwencje powszechnie przyjęte w języku Java: Nazwy klas z dużej litery, bez podkreśleń, kolejne człony nazwy z dużych liter MojaKlasa, Samochod, SamochodOsobowy Nazwy metod i zmiennych z małej litery, bez podkreśleń, kolejne człony nazwy z dużych liter predkosc, liczbamiejsc, podajcegle() Nazwy pakietów małymi literami politechnika.dziekanat, xml, java.lang Nazwy stałych dużymi literami, kolejne człony oddzielane podkreśleniami MIN_LENGTH, MAX_LICZBA_OSOB

Grupowanie klas w pakiety 47 Informacja o przynależności do pakietu w pierwszej linii jednostki kompilacji (przy braku - pakiet domyślny) package mytools.audio; class AudioPlayer {... Lokalizacja pliku.class w drzewie katalogów musi odpowiadać zadeklarowanej nazwie pakietu java lang util Date Vector mytools video audio AudioPlayer java mytools.audio.audioplayer Sposób uruchomienia klasy w pakiecie (z poziomu głównego katalogu klas) W praktyce, biblioteki klas i aplikacje są pakowane do plików JAR (archiwa w formacie ZIP, niekoniecznie skompresowane)

Importowanie klas 48 Odwołanie do klasy w pakiecie wymaga podania ścieżki: mytools.audio.audioplayer ap; Dzięki zastosowaniu polecenia import, możliwe jest odwoływanie się przez samą nazwę klasy domyślnie importowany jest pakiet java.lang import mytools.audio.audioplayer; import mytools.audio.*; W celu załadowania wskazywanej klasy, JVM przeszukuje wszystkie lokalizacje zapisane w zmiennej środowiskowej CLASSPATH; jeżeli CLASSPATH odwołuje się do pliku ZIP/JAR, wtedy plik ten jest automatycznie rozpakowywany w pamięci operacyjnej CLASSPATH=.:/java/lib/classes12.zip:/home/mz/mytools.jar

Statyczne importowanie klas (od 1.5) 49 Umożliwia odwołania do statycznych stałych i metod innej klasy bez konieczności prefiksowania ich nazwą klasy import static java.lang.math.pi; import static java.lang.math.sin; public class Test { public static void main(string[] args) { System.out.println(Math.PI); System.out.println(PI); System.out.println(Math.sin(0)); System.out.println(sin(PI/2)); public final class java.lang.math { public static final double PI = 3.141592653589793; public static double sin(double arg) {...... Klasa biblioteczna z funkcjami matematycznymi oraz stałymi E i PI

50 Tworzenie i korzystanie z obiektów Obiekty ZAWSZE tworzone są dynamicznie (zwykle za pomocą new) Obiekty są dostępne przez referencje Obiekty są niszczone przez garbage collection, gdy nie ma do nich referencji Niekoniecznie natychmiast i nie ma żadnych gwarancji kiedy Nie można zmusić mechanizmu aby zadziałał w określonej chwili Odwołanie do składowych obiektu odbywa się przez operator kropki (w przypadku składowych statycznych zamiast nazwy obiektu można podać nazwę klasy) Car c = new Car(); Car c1 = c; //referencje na ten sam obiekt c.move(12,34); c1 = null; c = null; // obiekt zostanie zniszczony // (ale nie wiadomo kiedy!)

51 Przekazywanie parametrów do metod Zmienne typów prostych przekazywane są przez wartość aby zmienić ich wartość w metodzie należy przekazać je w ramach otaczającego obiektu lub jako element tablicy Obiekty są przekazywane przez referencję można je zmieniać poprzez przekazaną referencję referencja jest przekazywana przez wartość (nie można podmienić obiektu) public class Testy { static void razydwa(int liczba) { liczba = liczba * 2; public static void main(string[] s) { int a = 3; razydwa(a); System.out.println(a); // 3 public class Testy { static void razydwa(int [] tab) { tab[0] = tab[0]*2; public static void main(string[] s) { int [] t = new int[1]; t[0] = 3; razydwa(t); System.out.println(t[0]); // 6

Konstruktor 52 Prosta inicjalizacja zmiennych instancji klasy możliwa przez przypisanie (jak dla statycznych) Domyślna inicjalizacja składowych domyślną wartością dla typu public class Ksiazka { String kategoria = SF ; int liczbastron; // 0 Konstruktor - metoda służącą do tworzenia obiektów klasy Umożliwia złożoną inicjalizację zmiennych instancji Jego nazwa musi pokrywać się z nazwą klasy Konstruktor nie może posiadać typu zwrotnego Konstruktory (i inne metody) mogą być przeciążane Przy braku definicji konstruktora, kompilator dostarcza domyślny, pusty konstruktor bezargumentowy

53 Konstruktor - przykład public class MyClass { String t; public MyClass(String s) { t = s; public MyClass() { t = "xyz";

54 Referencja this (1/2) Pozwala odsłonić składowe klasy przesłonięte przez argumenty metod public class MyClass { String t; public MyClass(String t) { this.t = t; public MyClass() { t = "xyz";

55 Referencja this (2/2) Umożliwia wywołanie konstruktora z innego konstruktora tej samej klasy Pozwala uniknąć duplikowania kodu public class MyClass { String t; public MyClass(String t) { this.t = t; public MyClass() { this("xyz");

56 Niszczenie obiektu Nie ma w Javie destruktora Obiekt jest niszczony przez mechanizm garbage collection Przed zniszczeniem obiektu wywoływana jest metoda finalize() Ponieważ nie wiadomo kiedy garbage collection zadziała, krytyczne zasoby należy zwalniać poprzez jawnie wołane metody, a nie w metodzie finalize() Metoda finalize() jest w zasadzie bezużyteczna Od Javy 7 dostępna jest specjalna wersja instrukcji try ułatwiająca zarządzanie zwalnianiem zasobów

57 Dziedziczenie klas public class Konto { protected float stan; public void wplata(float kwota) { stan = stan + kwota; public float pobierzsaldo() { return stan; Nazwa nowej klasy Nazwa nadklasy public class KontoDolarowe extends Konto { Nadpisanie definicji metody public void wplata(float kwota) { stan = stan + kwota * 3.10; Zawsze dokładnie jedna klasa bazowa Domyślnie java.lang.object (korzeń hierarchii klas)

58 Klasa Object W języku Java każda klasa dziedziczy bezpośrednio lub pośrednio z java.lang.object Klasa Object jest korzeniem hierarchii klas Każdy obiekt posiada implementacje metod klasy Object Metody klasy Object: clone() Do klonowania (tworzenia kopii obiektu) Działa tylko dla klas implementujących interfejs Cloneable equals() Domyślnie porównuje przez == Nadpisana w String, Integer,... hashcode() finalize() tostring() getclass() notify(), notifyall(), and wait() (do synchronizacji wątków)

Przeciążanie a nadpisywanie metod w podklasie 59 Metoda w klasie może być przeciążona (ang. overload) wiele metod o tej samej nazwie różniących się liczbą i/lub typami parametrów Metoda może zostać przeciążona w podklasie w podklasie dostępne będą obie wersje metody Metoda nadpisuje (ang. override) metodę z nadklasy gdy ma taką samą nazwę, liczbę i typy parametrów i taki sam typ zwrotny Zakres widzialności metody nadpisującej może być większy niż nadpisywanej Typ zwrotny metody nadpisującej może być podklasą typu zwrotnego nadpisywanej Nadpisująca nie może rzucać wyjątków, których nie rzuca metoda nadpisywana public class MyClass { // nadpisanie odziedziczonej z Object public String tostring() {... // przeciążenie public String tostring(string prefix) {...

Nadpisywanie i przesłanianie metod (1/2) 60 public class Animal { public static void hide() { System.out.println("The hide method in Animal."); public void override() { System.out.println("The override method in Animal."); public class Cat extends Animal { public static void hide() { System.out.println("The hide method in Cat."); public void override() { System.out.println("The override method in Cat.");

Nadpisywanie i przesłanianie metod (2/2) 61 public class Animal { public static void hide() {... public void override() {... public class Cat extends Animal { public static void hide() {... public void override() {... public static void main(string[] args) { Cat mycat = new Cat(); Animal myanimal = mycat; myanimal.hide(); // The hide method in Animal. myanimal.override(); // The override method in Cat. Metody statyczne są przesłaniane w podklasie Tylko statyczna może przesłonić statyczną Metody instancji są nadpisywane w podklasie (zawsze są wirtualne!) Tylko metoda instancji może nadpisać metodę instancji

62 Przesłanianie pól w podklasie Pole w podklasie o takiej samej nazwie jak pole w nadklasie przesłania je (niezależnie od typu danych) Dostęp do przesłoniętych zmiennych instancji przez super, np. super.weight Dostęp do zmiennych statycznych przez prefiksowanie nazwą klasy, np. Animal.maxWeight Przesłanianie pól nie jest zalecane

63 Referencja super W metodach klasy można używać referencji super Na podobnej zasadzie jak this Za pomocą super można uzyskać dostęp do przesłoniętych składowych instancji (metod i zmiennych niestatycznych) nadklasy (super.składowa) Z konstruktora klasy można wywołać konkretny konstruktor nadklasy (super(...)), w pierwszej instrukcji ciała konstruktora Gdy konstruktor nadklasy nie zostanie wywołany jawnie, to zostanie wywołany konstruktor bezargumentowy Przy jego braku w nadklasie będzie błąd kompilacji

64 Hierarchia dziedziczenia Każda klasa może posiadać jedną nadklasę Korzeniem hierarchii dziedziczenia jest klasa Object Gdy dla danej klasy nie zostanie podana jej nadklasa, domyślnie przyjmowana jest klasa Object Konwersja typów (jawna lub niejawna) możliwa jest w ramach gałęzi dziedziczenia java.lang.object... Animal Cat filemon = new Cat(); Animal a = filemon; // OK filemon = a; // error filemon = (Cat) a; // OK... Cat

65 Zastępowanie referencji do obiektów Obiekt podklasy może być użyty tam, gdzie spodziewany jest obiekt nadklasy Prawdziwy typ obiektu może być określony przy użyciu operatora instanceof Powyższe stwierdzenia odnoszą się również do interfejsów implementowanych przez klasę obiektu public void rename (Animal a) { if (a instanceof Cat) { ((Cat) a).catmethod();... Animal Cat

66 Polimorfizm Polega na dynamicznym (późnym) wiązaniu metod W przypadku wywołania metody obiektu podklasy poprzez referencję typu nadklasy, wywoływana jest metoda z jego klasy (na podstawie jego faktycznego typu) W Javie wszystkie metody instancji (niestatyczne) są wirtualne Animal [] zoo = { new Cat(...), new Fish(...),... ; for (int i=0; i < zoo.length; i++) zoo[i].feed(); Cat Animal Fish

67 Modyfikator final Dostępny dla zmiennych, metod i klas Klasa final nie może posiadać klas pochodnych Nie można z niej dziedziczyć Metody final nie można nadpisać w klasie pochodnej Zmienna final jest stałą Musi mieć nadaną wartość przy deklaracji

68 Klasy i metody abstrakcyjne Klasa abstrakcyjna to klasa, której nie można wykorzystać do tworzenia instancji Deklarowana z modyfikatorem abstract Metoda abstrakcyjna to metoda nieposiadająca implementacji Deklarowana z modyfikatorem abstract Klasa posiadająca chociaż jedną metodę abstrakcyjną musi być zadeklarowana jako abstrakcyjna abstract class Figura { abstract double obwod(); abstract double pole(); class Kwadrat extends Figura { double bok; double obwod() { return 4*bok; double pole() { return Math.pow(bok, 2);

Klasy zagnieżdżone 69 Klasy można definiować jako składowe innych klas statyczne klasy zagnieżdżone mają dostęp jedynie do składowych statycznych klasy otaczającej klasy wewnętrzne ich obiekty występują wewnątrz obiektów klasy otaczającej i mają swobodę dostępu do ich składowych class EnclosingClass{... static class AStaticNestedClass {... class InnerClass {... Statyczna klasa zagnieżdżona Klasa wewnętrzna Klasy zagnieżdżone można definiować również w metodach lub blokach kodu

Dziedziczenie i polimorfizm Przykład (1/3) 70 public class Osoba { private String nazwisko; public Osoba(String n) { nazwisko = n; public String tostring() { return "Nazwisko: "+nazwisko;

Dziedziczenie i polimorfizm Przykład (2/3) 71 public class Pracownik extends Osoba { private int staz; public Pracownik(String n, int s) { super(n); staz = s; public String tostring() { return super.tostring()+ " staz: "+staz;

Dziedziczenie i polimorfizm Przykład (3/3) 72 Osoba[] tab = new Osoba[2]; tab[0] = new Osoba("Kowalski"); tab[1] = new Pracownik("Nowak", 10); for (Osoba o : tab) System.out.println(o); Tu będzie wywołana metoda tostring() Nazwisko: Kowalski Nazwisko: Nowak staz: 10

Interfejsy 73 Interfejs przypomina w pełni abstrakcyjną klasę Wszystkie jego metody niestatyczne muszą być abstrakcyjne (domyślnie public abstract) Od Javy 8 możliwe domyślne implementacje metod niestatycznych (default) Od Javy 8 interfejs może zawierać metody statyczne (z ciałami) Nie może posiadać zmiennych wystąpień (wszystkie pola są domyślnie public static final) W pewnym stopniu kompensują brak dziedziczenia wielobazowego Korzystanie z interfejsów zwiększa elastyczność kodu aplikacji i jest generalnie zalecanym stylem programowania [public] interface NazwaInterfejsu [extends ListaInterfejsów] { // Lista metod i pól statycznych

74 Implementacja interfejsu przez klasę Klasa może implementować zero, jeden lub więcej interfejsów interface Drukowalny { void print(); class Dokument implements Drukowalny { public void print() { // implementacja specyficzna dla klasy... Drukowalny d = new Dokument(); d.print();...

Domyślne implementacje metod interfejsu (Java 8) 75 Umożliwiają dodanie nowych metod do interfejsu bez konieczności aktualizacji kodu istniejących klas implementujących interfejs interface InterfaceA { default void newmethod() { System.out.println("Domyslna metoda Interfejsu A"); public class Impl implements InterfaceA { // OK // dziedziczy domyślną implementację newmethod()

Konflikt domyślnych implementacji metod interfejsu (Java 8) 76 interface InterfaceA { void oldmethod(); default void newmethod() { System.out.println("Domyslna metoda Interfejsu A"); interface InterfaceB { void oldmethod(); default void newmethod() { System.out.println("Domyslna metoda Interfejsu B"); public class Impl implements InterfaceA, InterfaceB { public void oldmethod() { System.out.println("Metoda implementuje oba interfejsy"); // OK // Blad kompilacji - dziedziczenie konfliktowych domyslnych // implementacji domyslnych newmethod() po interfejsach

Konflikt domyślnych implementacji metod interfejsu (Java 8) - Rozwiązanie 77 interface InterfaceA { default void newmethod() { System.out.println("Domyslna metoda Interfejsu A"); interface InterfaceB { default void newmethod() { System.out.println("Domyslna metoda Interfejsu B"); public class Impl implements InterfaceA, InterfaceB { // jawna implementacja metody public void newmethod() { // można w niej wywołać odziedziczone po interfejsach implementacje InterfaceA.super.newMethod(); InterfaceB.super.newMethod();

Wyjątki 78 Stanowią wydajny i przejrzysty mechanizm obsługi błędów Przykłady (podklasy klasy Throwable) błędy (podklasy Error) np.: OutOfMemoryError,InternalError wyjątki kontrolowane (podklasy Exception), np.: MalformedURLException, IOException wyjątki czasu wykonania (podklasy RuntimeException), np.: ArrayIndexOutOfBoundsException, ArithmeticException Wszystkie wyjątki kontrolowane (poza wyjątkami czasu wykonania) muszą być obsłużone lub wymienione w klauzuli throws w deklaracji metody public void wstawdotabeli() throws SQLException {...

79 Przechwytywanie i obsługa wyjątków try { // instrukcje, w których może pojawić się wyjątek catch (ExceptionClass1 e) {... catch (ExceptionClass2 e) {...... finally { // wykonuje się zawsze (!), sekcja opcjonalna

80 Zgrupowana obsługa wyjątków (od 1.7) try { // instrukcje, w których może pojawić się wyjątek catch (ExceptionClass1 ExceptionClass2 e) {...... finally { // wykonuje się zawsze (!), sekcja opcjonalna

81 Obsługa zdarzeń wyjątkowych - Przykład File f = new File("dane.txt"); InputStream is = null; try { is = new FileInputStream(f);... catch (FileNotFoundException e) { System.err.println(e); finally { if (is!= null) { is.close();

82 Instrukcja try z zasobami (od 1.7) Ułatwia zagwarantowanie, że zasób zostanie zwolniony po jego użyciu niezależnie od tego czy wystąpi wyjątek czy nie Klasa zasobu musi implementować interfejs AutoCloseable Interfejs obejmuje jedną metodę: close() W Java 7 wiele klas bibliotecznych zmodyfikowano o implementację tego interfejsu (np. związane z plikami, bazą danych, itp.) File f = new File("dane.txt"); try (InputStream is = new FileInputStream(f)) {... catch (FileNotFoundException e) { System.err.println(e);

83 Rzucanie wyjątków Wyjątek można rzucić jawnie throw new IOException(); Metody, które mogą zgłaszać wyjątki, muszą zawierać informację o tym w deklaracji public void method1() throws IOException { //...

84 Przykład definicji wyjątku użytkownika public class TestException extends Exception { public TestException() { ; public TestException (Object o, String method, Exception e) { this(e.getclass() + " in <" + o.getclass() + "> ( " + method + ") :: " + e.getmessage()); e.printstacktrace(); public TestException(String msg) { super(msg);

85 Wątki Wątek to pojedynczy sekwencyjny przepływ sterowania w programie Java umożliwia tworzenie programów wielowątkowych Wsparcie dla wątków na poziomie języka: Klasa Thread implementująca wątek Interfejs Runnable, pozwalający na uruchomienie klasy, która go implementuje w nowym wątku (zawiera jedną metodę public void run()) Klasa Object, zawierająca metody wait, notify i notifyall do synchronizacji wątków Słowo kluczowe synchronized do oznaczania metody lub bloku kodu jako sekcji krytycznej Słowo kluczowe volatile Sposoby implementacji wątków Dziedziczenie z klasy Thread Wykorzystanie oryginalnej klasy Thread, przekazując konstruktorowi wątku obiekt klasy implementującej Runnable

86 Wątki - Przykład class Zadanie implements Runnable { public void run() { for (int i=0; i<5; i++) { try { Thread.sleep(1000); catch (InterruptedException e){ System.out.println(i); System.out.println("Zrobione!"); 0 0 1 1 2 2 3 3 4 Zrobione! 4 Zrobione! Thread t1 = new Thread(new Zadanie()); Thread t2 = new Thread(new Zadanie()); t1.start(); t2.start();

Tworzenie instancji klas wskazanych w trakcie pracy programu 87 Java jest językiem dynamicznym Umożliwia wykorzystanie klas, których nazwy nie były znane podczas tworzenia i kompilacji programu String nazwaklasy = "test.osoba"; Object ob1 = null; try { Class c = Class.forName(nazwaKlasy); ob1 = c.newinstance(); catch (InstantiationException e) { System.out.println(e); catch (IllegalAccessException e) { System.out.println(e); catch (ClassNotFoundException e) { System.out.println(e);

88 Mechanizm Java Reflection Umożliwia odczyt informacji o klasach i obiektach (konstruktory, metody, pola) w trakcie pracy programu Przydatny dla dynamicznie ładowanych klas Realizowany poprzez klasy z pakietu java.lang.reflect (np. Field, Method, Constructor) i klasę java.util.class (np. metody: getfields(), getmethods(), getconstructors(), getfield(), getmethod(), getconstructor()) Class cl = ob1.getclass(); Field f1 = cl.getfield("nazwisko"); String naz = (String) f1.get(ob1);

Java Beans 89 JavaBeans to komponenty posiadające właściwości, które można ustawiać i odczytywać Właściwość definiowana przez parę metod get/set (accessor/mutator) Implementują ideę hermetyczności obiektów (encapsulation) Początkowo koncepcja opracowana z myślą o komponentach graficznych, które miały mieć własności ustawiane przez paletę właściwości w środowisku IDE public class Fasola { private String odmiana; private boolean jadalna; public Fasola() { public String getodmiana() {return odmiana; public void setodmiana(string odmiana) { this.odmiana = odmiana; public boolean isjadalna() {return jadalna; public void setjadalna(boolean jadalna) { this. jadalna = jadalna;

Javadoc 90 Narzędzie do generowania dokumentacji kodu Java w formacie HTML w oparciu o specjalne komentarze poprzedzające klasy, metody i pola część dystrybucji Java SE (JDK, Java SDK) Domyślnie uwzględnia tylko składowe public i protected Powszechny format dokumentacji API bibliotek języka Java Przykład uruchomienia (z domyślnymi opcjami): javadoc nazwa_pakietu

Javadoc przykład komentarzy 91 package test; /** * Klasa do reprezentacji kwadratów * @author Marek */ public class Kwadrat { /** Długość boku kwadratu */ private double bok; /** Zwraca pole kwadratu */ public double pole() { return bok * bok; /** * Skaluje kwadrat * @param skala Współczynnik skalowania */ public void skaluj(double skala) { bok = bok * skala;

Javadoc przykład dokumentacji 92...

Adnotacje (od 1.5) 93 Oznaczenia kodu umożliwiające automatyczną generację kodu towarzyszącego i konfigurację aplikacji Nie wpływają bezpośrednio na semantykę programu, ale wpływają na sposób traktowania programu przez narzędzia i biblioteki Koncepcja podobna do komentarzy Javadoc, ale Javadoc służy tylko do dokumentowania kodu Predefiniowane adnotacje używane przez kompilator języka Java: @Deprecated, @Override, @SuppressWarnings Adnotację definiuje się jako specyficzną formę interfejsu W praktyce programiści aplikacji nie definiują nowych typów adnotacji, a jedynie wykorzystują adnotacje oferowane przez poszczególne biblioteki i narzędzia public @interface Copyright { String value(); @Copyright("2008 Code Masters") public class ProblemSolver {...

Przykłady popularnych adnotacji 94 Przykładowe wbudowane adnotacje JDK @Override @Deprecated Przykładowe adnotacje EJB @Stateless @Stateful Przykładowe adnotacje JPA @Entity @Table @Id @ManyToOne Przykładowe adnotacje Web Services @WebService @WebMethod

95 Klasy biblioteczne (Przykłady)

Klasa java.lang.string 96 Służy do reprezentowania niemodyfikowalnych ciągów znaków Unicode Metody klasy String length(), charat(int), equals(string), compareto(string), substring(int beginindex, int endindex),... Każda klasa posiada metodę tostring(), konwertującą jej obiekty do tekstów String s1 = "Ala"; String s2 = new String ("ma kota"); String s3 = s1 + " " + s2; String s1 = "Ala"; String s2 = "Ala"; if (s1 == s2) // false (!) {... String s1 = "Ala"; String s2 = "Ala"; if (s1.equals(s2)) // true {...

Klasa java.lang.stringbuffer 97 Zachowuje funkcjonalność String: length(),charat(int),... Reprezentuje modyfikowalne ciągi znaków: dodatkowe metody: append (String s), delete(int st, int end), insert(int offset, String s), reverse(), append(stringbuffer sb), delete(int st, int end), insert(int offset, StringBuffer sb), reverse(),... Konwersja do String: wywołanie metody tostring() przekazanie jako parametr konstruktora String Porównanie wydajności StringBuffer i String: kosztowniejsza alokacja StringBuffer operacje na StringBuffer wydajniejsze od konkatenacji String String x = "a" + 4; String y = new StringBuffer().append("a").append(4).toString(); Od Java 1.5 dostępna również klasa StringBuilder, szybsza ale bez synchronizacji

98 Klasy opakowujące (ang. wrapper) Dla każdego typu prostego w Javie istnieje odpowiadająca mu klasa "wrapper" (Integer, Float,...) Klasy "wrapper" zastępują zmienne proste w miejscach gdzie spodziewane są obiekty Zawierają metody zwracające proste wartości (intvalue(), floatvalue(),...) Zawierają przydatne metody konwersji typów np. Integer.parseInt(String) - String -> int Integer.toString(int) - int -> String

Automatyczna konwersja miedzy typami prostymi i klasami opakowującymi (od 1.5) 99 Dla wygody programistów od wersji 1.5 języka Java dokonywane są automatyczne konwersje między typem prostym i odpowiadającym mu typem opakowującym Mechanizm auto-boxing / auto-unboxing Konwersji nie widać w kodzie, ale w dalszym ciągu wiąże się z narzutem czasowym Mechanizm ten nie oznacza, że należy zaniechać używania typów prostych int x = 5; int y = 4; Integer [] tab = new Integer[3]; tab[0] = new Integer(x); tab[1] = new Integer(y); tab[2] = null; System.out.println(tab[0].intValue() +tab[1].intvalue()); int x = 5; int y = 4; Integer [] tab = new Integer[3]; tab[0] = x; tab[1] = y; tab[2] = null; System.out.println(tab[0]+tab[1]);

Klasa java.lang.math Klasa java.lang.math pełni funkcję biblioteki matematycznej; wszystkie jej metody są statyczne (nie jest konieczne tworzenie obiektów) 100 Math.abs(x) Math.acos(x) Math.asin(x) Math.atan(x) Math.ceil(x) Math.cos(x) Math.exp(x) Math.floor(x) Math.log(x) Math.max(x,y) Math.min(x,y) Math.pow(x,y) Math.random() Math.round(x) Math.sin(x) Math.sqrt(x) Math.tan(x) Klasa ta zawiera również stałe reprezentujące liczby i e Math.PI Math.E double pierwiastek; pierwiastek = Math.sqrt(2.0); double dwapi; dwapi = 2 * Math.PI;

101 Klasa java.util.date Klasa java.util.date służy do tworzenia obiektów reprezentujących datę i czas Date() konstruktor tworzący obiekt na podstawie czasu aktualnego Date(year,month,day,hour,min,sec) konstruktor tworzący obiekt dla podanej daty getyear(), setyear() odczytuje/ustawia numer roku od 1900 getmonth(), setmonth() getdate(), setdate() odczytuje/ustawia numer miesiąca odczytuje/ustawia numer dnia w miesiącu getday(), setday() gethours(), sethours() getminutes(), setminutes() getseconds(), setseconds() odczytuje/ustawia numer dnia w tygodniu (od niedzieli) odczytuje/ustawia godzinę odczytuje/ustawia minuty odczytuje/ustawia sekundy

102 Klasa java.util.date after(d) before(d) equals(d) zwraca true, jeżeli reprezentowana data jest późniejsza od d zwraca true, jeżeli reprezentowana data jest wcześniejsza od d zwraca true, jeżeli daty są równe Date teraz; Date potem; teraz = new Date(); Thread.sleep(2000); potem = new Date(); System.out.println(teraz.getHours()); if (potem.after(teraz)) System.out.println("Czas płynie");

103 Kolekcje Kolekcja to obiekt grupujący wiele elementów Przykłady: Numery telefonów klienta Pracownicy danego departamentu Java Collections Framework: zunifikowana architektura do reprezentowania kolekcji i operowania na nich Klasy i interfejsy w pakiecie java.util

104 Składniki Java Collection Framework Interfejsy Abstrakcyjne typy danych reprezentujące kolekcje Opisują sposób korzystania z kolekcji niezależny od implementacji Np. List, Set Implementacje Konkretne implementacje interfejsów (klasy użytkowe) Np. ArrayList, HashSet Algorytmy Metody realizacji przydatnych operacji na kolekcjach: Wyszukiwanie, sortowanie Algorytmy są polimorficzne, działają dla różnych implementacjach danego interfejsu kolekcji

105 Interfejsy kolekcji Collection ogólna koncepcja kolekcji elementów Nie posiada standardowych implementacji Set zbiór w sensie matematycznym (bez duplikatów) List uporządkowana kolekcja, dopuszczająca duplikaty, możliwy dostęp do elementu o danym indeksie Queue kolejka, typowo FIFO Map obiekt mapujący klucze (unikalne) na wartości SortedMap, SortedSet posortowane wersje Map i Set

Interfejs Collection 106 public interface Collection<E> extends Iterable<E> { // Basic Operations int size(); boolean isempty(); boolean contains(object element); boolean add(e element); // Optional boolean remove(object element); // Optional Iterator iterator(); // Bulk Operations boolean containsall(collection<?> c); boolean addall(collection<? extends E> c); // Optional boolean removeall(collection<?> c); // Optional boolean retainall(collection<?> c); // Optional void clear(); // Optional // Array Operations Object[] toarray(); <T> T[] toarray(t[] a); Dana implementacja kolekcji może nie obsługiwać metod opcjonalnych poprzez rzucanie wyjątku UnsupportedOperationException

107 Sposoby nawigacji po kolekcji Pętla for-each Iterator for (Object o : kolekcja) System.out.println(o); Jeśli chcemy mieć możliwość usuwania lub podmiany bieżącego elementu Interfejs Iterator public interface Iterator<E> { boolean hasnext(); E next(); void remove(); // Optional Korzystanie z iteratora for (Iterator i = kolekcja.iterator(); i.hasnext(); ) if (!cond(i.next())) i.remove();

Interfejs Set 108 public interface Set<E> extends Collection<E> { // Basic Operations int size(); boolean isempty(); boolean contains(object element); boolean add(e element); // Optional boolean remove(object element); // Optional Iterator iterator(); // Bulk Operations boolean containsall(collection<?> c); boolean addall(collection<? extends E> c); // Optional boolean removeall(collection<?> c); // Optional boolean retainall(collection<?> c); // Optional void clear(); // Optional // Array Operations Object[] toarray(); <T> T[] toarray(t[] a); Implementujące klasy biblioteczne: HashSet, TreeSet, LinkedHashSet

Interfejs List 109 public interface List<E> extends Collection<E> { // Positional Access E get(int index); E set(int index, E element); // Optional boolean add(e element); // Optional void add(int index, E element); // Optional E remove(int index); // Optional abstract boolean addall(int index, Collection<? extends E> c); //Optional // Search int indexof(object o); int lastindexof(object o); // Iteration ListIterator<E> listiterator(); ListIterator<E> listiterator(int index); // Range-view List<E> sublist(int from, int to); Implementujące klasy biblioteczne: ArrayList, LinkedList, Vector

Interfejs Queue 110 public interface Queue<E> extends Collection<E> { E element(); boolean offer(e o); E peek(); E poll(); E remove(); Implementujące klasy biblioteczne: PriorityQueue, BlockingQueue

Interfejs Map 111 public interface Map { // Basic Operations V put(k key, V value); V get(object key); V remove(object key); boolean containskey(object key); boolean containsvalue(object value); int size(); boolean isempty(); // Bulk Operations void putall(map<? extends K,? extends V> t); void clear(); // Collection Views public Set<K> keyset(); public Collection<V> values(); public Set<Map.Entry<K,V>> entryset(); // Interface for entryset elements public interface Entry { K getkey(); V getvalue(); V setvalue(v value); Implementujące klasy biblioteczne: HashMap, TreeMap, LinkedHashMap

List - Przykład 112 String ja = "Zbigniew"; String ty = "Jan"; String on = "Jerzy"; List ludzie = new ArrayList(); ludzie.add(ja); ludzie.add(ty); ludzie.add(on); Collections.sort(ludzie); System.out.println((String)ludzie.get(0)); System.out.println((String)ludzie.get(1)); System.out.println((String)ludzie.get(2)); for (Object o : ludzie) System.out.println((String)o); for (Iterator i = ludzie.iterator(); i.hasnext(); ) System.out.println((String)i.next()); Jan Jerzy Zbigniew Jan Jerzy Zbigniew Jan Jerzy Zbigniew

113 Kolekcje generyczne (Generics) (od 1.5) Pozwalają na etapie kompilacji sprawdzić czy obiekt umieszczany w kolekcji jest odpowiedniej klasy (lub jej podklasy) Upraszczają kod, gdyż nie jest konieczne rzutowanie po pobraniu obiektu z kolekcji Przypominają składniowo wzorce z C++, ale są istotne różnice String ja="zbigniew"; String ty="jan"; String on="jerzy"; List<String> ludzie = new ArrayList<String>(); ludzie.add(ja); ludzie.add(ty); ludzie.add(on); Collections.sort(ludzie); System.out.println(ludzie.get(0)); for (String o : ludzie) System.out.println(o); for (Iterator<String> i = ludzie.iterator(); i.hasnext(); ) System.out.println(i.next());

114 Klasy Vector i HashTable Starsze wersje implementacji koncepcji kolekcji Niezalecane w nowych projektach Wykorzystywane, w niektórych dostępnych bibliotekach

115 Klasa java.util.vector Klasa java.util.vector służy do tworzenia tablic o zmiennym rozmiarze; elementy tablicy mogą być obiektami dowolnych klas; pozycje tablicy są numerowane od zera addelement(x) elementat(i) remove(i) firstelement() lastelement() elements() size() dołącza na koniec tablicy nową pozycję - obiekt x zwraca obiekt znajdujący się na pozycji i usuwa z tablicy element na pozycji i zwraca pierwszy obiekt w tablicy zwraca ostatni obiekt w tablicy zwraca obiekty jako wystąpienie klasy Enumeration zwraca liczbę pozycji tablicy

116 Klasa java.util.vector String ja = "Zbigniew"; String ty = "Jan"; String on = "Jerzy" Vector ludzie = new Vector(); ludzie.addelement(ja); ludzie.addelement(ty); ludzie.addelement(on); ludzie.remove(1); System.out.println(ludzie.elementAt(1));

117 Klasa java.util.hashtable Klasa java.util.vector służy do tworzenia tablic haszowych; umożliwia odwzorowanie kluczy w wartości; klucze i wartości tablicy mogą być obiektami dowolnych klas; put(klucz, wartość) get(klucz) contains(wartość) containskey(klucz) elements() isempty() remove(klucz) size() wstawia wartość adresowaną kluczem zwraca wartość adresowaną kluczem testuje istnienie podanej wartości testuje istnienie podanego klucza zwraca wartości jako wystąpienie klasy Enumeration testuje czy tablica haszowa jest pusta usuwa wartość adresowaną kluczem zwraca liczbę kluczy

118 Klasa java.util.hashtable String ja = "Zbigniew"; String ty = "Jan"; String on = "Jerzy"; Hashtable ludzie = new Hashtable(); ludzie.put("ja", ja); ludzie.put("ty", ty); ludzie.put("on", on); ludzie.remove("ty"); System.out.println(ludzie.get("ja"));

119 Klasa java.util.enumeration Starsza koncepcja iteratora Niezalecana, ale wykorzystywana w dostępnych bibliotekach Klasa java.util.enumeration służy do iterowania po serii elementów; elementy mogą być obiektami dowolnych klas; hasmoreelements() nextelement() testuje czy są jeszcze elementy do iterowania zwraca kolejny element

120 Klasa java.util.enumeration Vector ludzie = new Vector(); ludzie.addelement("zbigniew"); ludzie.addelement("jan"); ludzie.addelement("jerzy"); Enumeration e=ludzie.elements(); while (e.hasmoreelemets()) System.out.println(e.nextElement()); Hashtable zwierzeta= new Hashtable(); ludzie.put("zbigniew", "pies"); ludzie.put("jan", "kot"); ludzie.put("jerzy", "kanarek"); e=zwierzeta.elements(); while (e.hasmoreelemets()) System.out.println(e.nextElement());

121 Pakiet java.io Pakiet java.io grupuje klasy służące do obsługi plikowego wejścia/wyjścia: java.io.fileinputstream Służy do odczytywania plików binarnych java.io.inputstreamreader Służy do odczytywania plików tekstowych; odpowiednio konwertuje bajty odczytywane przez FileInputStream na znaki zgodnie ze wskazanym zestawem znaków narodowych java.io.fileoutputstream Służy do zapisywania plików binarnych java.io.outputstreamwriter Służy do zapisywania plików tekstowych; odpowiednio konwertuje zapisywane znaki do bajtów dla FileOutputStream zgodnie ze wskazanym zestawem znaków narodowych Nazwy przykładowych metod: int read() i write(int)

122 binarnego Odczyt pliku - przykłady int value; FileInputStream fstream; fstream = new FileInputStream("/home/data.txt"); while ((value = fstream.read())!= -1) System.out.write((char)value); fstream.close(); tekstowego int value; FileInputStream fstream; InputStreamReader freader; fstream = new FileInputStream("/home/data.txt"); freader = new InputStreamReader(fStream,"ISO-8859-2"); while ((value = freader.read())!= -1) System.out.print((char)value); freader.close(); fstream.close();

123 Odczyt ze standardowego wejścia Standardowe wejście: obiekt System.in klasy InputStream strumień bajtowy wymaga opakowania dla odczytu danych znakowych BufferedReader InputStreamReader InputStream InputStreamReader isr = new InputStreamReader(System.in); BufferedReader reader = new BufferedReader(isr); String line = null; while ((line = reader.readline())!= null) { // Przetwarzaj odczytany wiersz

Aplety Java 124

Charakterystyka apletów Java Aplet jest zanurzany w dokumencie HTML Aplety mogą być ładowane z dysku lokalnego lub z serwera aplikacji (WWW) Aplet Java jest wykonywany przez przeglądarkę: przeglądarka zawiera JVM aplet nie posiada metody main() wiele punktów wejścia wykorzystywanych przez przeglądarkę, jak init() prawie zawsze charakter graficzny Aplety muszą zawierać klasę, która rozszerza klasę Applet (java.applet.applet) lub javax.swing.japplet, dla apletów opartych o nowszą bibliotekę graficzną Swing

Budowa apletu W celu zbudowania apletu, należy utworzyć podklasę klasy Applet, a następnie nadpisać pewne metody: init() start() stop() destroy() paint() update()

Cykl życia apletu Nowy aplet init() Zainicjalizowany destroy() stop() start() Martwy Pracujący paint()

Zagnieżdżanie apletu w dokumencie HTML (znacznik APPLET) W części <BODY>: <APPLET CODEBASE =. CODE > NAME WIDTH = 400 HEIGHT = 300 HSPACE = 0 VSPACE = 0 ALIGN = middle = MyApplet.class = TestApplet <PARAM NAME = speed VALUE = 10 > <PARAM NAME = header VALUE = Welcome > </APPLET> Uwaga: Od HTML 4.0 zamiast znacznika <APPLET> zalecany <OBJECT>

Odczytywanie parametrów apletu getparameter() odczytuje parametr, najczęściej wywoływane w metodzie init() public void anyappletmethod() { String c = getparameter("header"); long pop = Long.parseLong( getparameter("speed"));

Wyświetlanie z apletu metody odpowiedzialne za wyświetlanie paint() update() - domyślnie woła paint() repaint() - kolejkuje update() do wykonania update() i paint() otrzymują kontekst graficzny jako obiekt klasy Graphics w trakcie rysowania stosuje się standardowe klasy AWT (java.awt.*): Font, Color,... public void paint(graphics g) { Font f = new Font("SansSerif", Font.BOLD, 72); g.setfont(f); g.setcolor(color.red); g.drawstring("hello", 10, 100);

Przykładowy aplet import java.applet.applet; import java.awt.*; public class MyApplet extends Applet { public void paint(graphics g) { Font f = new Font("SansSerif", Font.BOLD, 72); g.setfont(f); g.setcolor(color.red); g.drawstring("hello", 10, 100);

Przykładowa strona HTML z apletem <HTML> <HEAD> <TITLE>Title</TITLE> </HEAD> <BODY> <APPLET CODE="MyApplet.class" HEIGHT="200" WIDTH="200" > This browser does not support Applets. </APPLET> </BODY> </HTML>