Java-wykład Dorota Pylak
BIBLIOGRAFIA Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014 C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice 2008 C.S. Horstmann, G. Cornell, Core. Java. Techniki zaawansowane, Helion, Gliwice 2009 B. Eckel, Thinking in Java, 4th Edition, Prentice Hall, Upper Saddle River, NJ, 2006 A. Zoła, Programowanie w języku Java, 2004 http://fatcat.ftj.agh.edu.pl/~palka/public/java_pl.pdf The Java Tutorials, http://download.oracle.com/javase/tutorial/
3 Wstęp W 1995 roku firma Sun Microsystems wprowadziła na rynek nowy język programowania Javę. Java to uniwersalny język programowania składniowo podobny do C/C++ Dziś Java to nie tylko język programowania, ale cały olbrzymi zbiór technologii i produktów z nim powiązanych. Programy napisane w Javie działają na przeróżnych maszynach i systemach poczynając od telefonów komórkowych poprzez komputery PC, a kończąc na wysokowydajnych serwerach.
4 Charakterystyka języka Java PRZENOŚNOŚĆ-WIELOPLATFORMOWOŚĆ Java jest językiem, w którym w przeciwieństwie do standardowych języków kompilowanych, gdzie program źródłowy jest tłumaczony przez kompilator wprost na kod maszynowy, kod źródłowy jest kompilowany na tzw. kod bajtowy (pośredni) i w takiej postaci jest dystrybuowany. Programy Javy w postaci kodu bajtowego nie są związane z żadną konkretną platformą i mogą być uruchamiane na różnych procesorach i systemach operacyjnych.
Charakterystyka Javy 5 KOD ŹRÓDŁOWY (pliki z rozszerzeniem.java) kompilator Javy javac KOD BAJTOWY (B-kod.class) Wirtualna maszyna Javy JVM (program java wraz z odpowiednimi bibliotekami dynamicznymi) zainstalowana na danej platformie systemowej
Charakterystyka Javy 6 Biblioteki standardowe i narzędziowe interfejsy programistyczne (API) JAVY pozwalają w jednolity i niezależny od platformy sposób programować: Graficzne interfejsy użytkownika (GUI) Dostęp do baz danych Działania w sieci Aplikacje WEB Aplikacje rozproszone Grafikę, gry, multimedia Aplikacje na urządzenia mobilne
7 Zestaw standardowych bibliotek wraz z kompilatorem, debuggerem, narzędziami tworzenia dokumentacji JDK (Java Development Kit) JDK uzupełniany w zależności od zastosowań tworzy platformę Javy podzieloną na edycje: Standardowa - JavaStandard Edition (Java SE) Biznesowa - Java Enterprise Edition (Java EE) Mikro - JavaMicro Edition (Java ME) - do programowania urządzeń mobilnych
OBIEKTOWOŚĆ Charakterystyka Javy Java jest językiem obiektowym. Wszystko, z czym mamy do czynienia w programie jest obiektem jakiejś klasy (poza kilkoma typami podstawowymi). W ten sposób podejście obiektowe do programu jest niejako wymuszone. Obiekty w programie odzwierciedlają rzeczywiste obiekty (konkretne lub abstrakcyjne) i charakteryzują się cechami (atrybutami, polami) operacjami, które można na nich wykonywać (metodami) KLASA to opis cech grupy podobnych obiektów, które są dla nich niezmienne. 8
BEZPIECZEŃSTWO Charakterystyka Javy Bezpieczeństwo konstrukcji językowych Automatyczne odśmiecanie (garbage collection) - automatyczne usuwanie przydzielonych wcześniej, a nie używanych już obszarów pamięci (Język Java nie udostępnia w ogóle pojęcia wskaźników. Operujemy na referencjach do obiektów, nie martwiąc się o przydzielanie pamięci czyni to konstruktor, ani o zwalnianie zasobów czyni to Garbage Collector) Kontrola zgodności typów na etapie kompilacji Wymuszona przez kompilator obsługa niektórych wyjątków (obsługa błędów w Javie jest realizowana za pomocą wyjątków, przy czym jeżeli w wywoływanej metodzie może zostać wyrzucony wyjątek, jego obsłużenie jest wymuszone (poza RuntimeExceptions)) 9
10 Charakterystyka Javy Bezpieczeństwo transmisji danych oraz ochrona informacji Java posiada zintegrowane z językiem mechanizmy pozwalające na wszechstronne zabezpieczanie pisanych programów np.: pakiety JAAS (Java Authentication and Authorization Services) pozwalają na elastyczne uwierzytelnianie użytkowników chcących pracować w systemie, a następnie kontrolowanie jakie operacje mogą być wykonywane w trakcie działania programu na rzecz uwierzytelnionego już użytkownika wbudowane mechanizmy szyfrowania przesyłanych danych (jak np. SecureSocket) oraz cała gama zaimplementowanych i gotowych rozwiązań kryptografii (uwierzytelnianie poprzez certyfikaty, podpisy cyfrowe) pliki security.policy pozwalają decydować, które klasy pochodzące z jakich lokalizacji i podpisane cyfrowo przez kogo maja mieć dostęp do zasobów
Charakterystyka Javy 11 SIECIOWOŚĆ Język Java był od początku projektowany jako język programowania dla Internetu. Stąd mamy w nim wbudowane wygodne w obsłudze mechanizmy obsługi sieci, np. czytanie z gniazda sieciowego jest realizowane, z punktu widzenia programu, tak samo jak z klawiatury, a pomiędzy korzystaniem z pliku znajdującego się na dysku i na serwerze sieciowym nie ma praktycznie żadnej różnicy.
Charakterystyka Javy 12 OTWARTOŚĆ Dzięki temu, że standard języka jest otwarty, a JDK dostępny za darmo, tysiące ludzi na całym świecie pracuje, by wnieść swój wkład w rozwój tego języka. Dlatego język jest żywy, a jego rozwój nie ogranicza się tylko do kilkudziesięciu osób z firmy produkującej kompilator, ale jego twórcy mogą czerpać z doświadczeń wielu profesjonalistów i naukowców, by wybrać i zaadoptować w następnych wersjach najlepsze rozwiązania
PIERWSZY PROGRAM 13 Pierwszy program Pobieramy z internetu aktualną wersję JDK wraz z dokumentacją (http://java.sun.com) Do pisania programów możemy używać zintegrowanych środowisk programowania IDE (np. NetBeans, Eclipse) lub nawet wybranego edytora tekstowego Program źródłowy zapisujemy w pliku lub plikach z rozszerzeniem.java (każdy musi zawierać pełną definicję jednej lub więcej klas) Nazwa pliku musi być taka sama jak nazwa klasy publicznej występującej w tym pliku (ze specyfikatorem public) (rozróżniamy wielkość liter)
PIERWSZY PROGRAM 14 public class Test{ public static void main(string[] args){ System.out.println( Witaj Javo ); } } Zauważmy, że program w Javie zawsze składa się z definicji klasy. Do definiowania klas służy słowo kluczowe class, po nim podajemy nazwę klasy. Definicję klasy (pola i metody) podajemy w występujących potem nawiasach {}. W klasie Test zdefiniowano metodę main, wykonanie programu zaczyna się właśnie od tej metody.
PIERWSZY PROGRAM public static void main(string[] args) Jest to nagłówek funkcji o nazwie main i następujących modyfikatorach: public oznacza, ze funkcja jest publiczna, tzn. dostępna z zewnątrz klasy. Musi taka być, aby JVM działająca na zewnątrz klasy mogła ją uruchomić static funkcja jest statyczna, tzn. może być wywołana dla klasy, nie tylko dla konkretnego jej obiektu. Dzięki temu JVM nie musi tworzyć obiektu naszej klasy, może po prostu wywołać jej metodę main. Tę właśnie metodę JVM próbuje wywołać zawsze kiedy uruchamiamy ją poleceniem java JakasKlasa. Słowo void nie jest modyfikatorem, ale typem zwracanym przez funkcję. Oznacza ono pusty, bez wyniku. 15
PIERWSZY PROGRAM 16 public static void main(string[] args){ System.out.println( Witaj Javo );} W nawiasach widzimy String[]. Jest to tablica elementów klasy String służącej do przechowywania łańcuchów znakowych (napisów). Tablica ta zawiera parametry wywołania programu (np. z linii poleceń) Za wypisywanie na standardowe wyjście odpowiadają metody obiektu out będącego polem statycznym standardowej klasy System odpowiadającej za komunikację z systemem. Obiekt out posiada m.in. metodę println(string s), która wypisuje przekazany jej obiekt klasy String, po czym przechodzi do nowej linii Witaj Javo to stała łańcuchowa typu String
PIERWSZY PROGRAM 17 Zapisujemy program w pliku źródłowym Test.java Zapisany program kompilujemy za pomocą javac Test.java (lub w IDE) Otrzymujemy plik binarny Test.class Uruchamiamy program w IDE lub pisząc java Test (uruchamiając maszynę wirtualną polecenie java, podajemy jako argument samą nazwę klasy w której zdefiniowana jest metoda main, bez rozszerzenia.class)
KOMENTARZE //komentarz jednowierszowy /*komentarz wielowierszowy*/ /**komentarz dokumentacyjny*/ (komentarze dokumentacyjne są przetwarzane przez oprogramowanie tworzące dokumentacje np. javadoc ) Nazwy zmiennych, metod, klas mogą zawierać litery (duże lub małe), cyfry oraz znali _ i $, przy czym nie mogą zaczynać się od cyfry. 18
TYPY PODSTAWOWE TYP Rozmiar Zakres Klasa opakowująca Całkowitoliczbowe byte 8 bitów -128 : 127 Byte short 16-32768 : 32767 Short int 32-2 mld : 2 mld Integer long 64-9 tryl. : 9 tryl. Long Zmiennoprzecinkowe float 32-3.4E38...+3.4E38 Float double 64-1.7E308...1.7E308 Double Znakowy char 16 \u0000 : \u8fff Character Logiczny boolean - true:false Boolean Pusty void - - Void 19
LITERAŁY 20 LITERAŁ to napis w programie reprezentujący w sposób bezpośredni wartość danej. Tak, więc: 1, 1.5,'a', tekst są literałami odpowiednio liczbowymi, znakowymi i łańcuchowymi. Wszystkie literały całkowitoliczbowe są typu int. Każda liczba rzeczywista zapisana literalnie (zapisana z. lub w notacji naukowej) jest typu double. Aby zdefiniować liczbę typu long dodajemy L lub l na końcu. Użycie f lub F, powoduje traktowanie liczby jako typu float Napis true lub false to literał typu boolean Liczby całkowite możemy zapisać np. w systemie szesnastkowym, poprzedzając liczbę frazą 0x lub 0X
LITERAŁY c.d. 21 Pojedyncze znaki w apostrofach to literały znakowe typu char. Zwróćmy uwagę, że znaki w Javie zapisywane są w Unicodzie (z Basic Multilingual Plane) i zajmują 2 bajty. Przy pomocy backslasha \ zapisujemy znaki specjalne np.\n,\t, \b, \', \, \\ \unnnn dowolny znak o kodzie NNNN (N-cyfra szesnastkowa) Literały łańcuchowe oznaczają obiekty klasy String (String nie jest typem podstawowym), np. Witaj. Wszystkie inne dane poza danymi typów prostych reprezentują obiekty, których atrybuty i funkcjonalność definiują określone klasy. Są to typy zwane referencyjnymi.
ZMIENNE 22 Zmienna to nazwana część pamięci służąca do przechowywania informacji Deklaracja zmiennej nazwa_typu nazwa_zmiennej; Inicjacja zmiennej nazwa_typu nazwa_zmiennej=wyrażenie; Deklaracja stałych. (Wartość stałej można ustalić tylko raz) final nazwa_typu nazwa_stałej[=wyrażenie]; Konwencje nazewnicze nazwy zmiennych, metod zaczynamy mała literą, a następnie każdy składnik wyróżniamy dużą literą np. polefigury nazwy klas każdy składnik dużą literą np. StringBuilder nazwy stałych kapitalikami np. PI
23 OPERATORY W Javie dysponujemy zestawem operatorów podobnym do tego z C/C++: Jednoargumentowe - zmiana znaku + potwierdzenie znaku (nic nie robi) ++ pre/postinkrementacja (zwiększenie o 1) -- pre/postdekrementacja (zmniejszenie o 1) Arytmetyczne * mnożenie / dzielenie (całkowite lub zmiennopozycyjne!) % modulo (reszta z dzielenia) + dodawanie - odejmowanie
OPERATORY c.d. Przesunięcia >> przesuniecie bitowe w prawo << przesuniecie bitowe w lewo >>> przesuniecie bitowe w prawo z uzupełnianiem zerami Relacji == równe!= różne < mniejsze > większe <= mniejsze lub równe >= większe lub równe Operator warunkowy? : arytmetyczne if-else Operatory przypisania = przypisanie op= złożony operator przypisania 24
25 OPERATORY c.d. Logiczne i bitowe && logiczne i logiczne lub & logiczne i bitowe i logiczne i bitowe lub ^ logiczne i bitowe XOR Uwaga. W przypadku pojedynczych & oraz obliczane są zawsze obie strony wyrażenia, natomiast w wersji && oraz następuje pewna optymalizacja, tzn. jeśli po obliczeniu lewej strony znany jest wynik całego wyrażenia, wówczas prawa strona nie jest obliczana. Uwaga 2. Złożony operator przypisania ma następujące działanie: a op= b; jest równoważne: a = a op b;
26 OPERATORY c.d. Uwaga 3. Operator? : ma następująca składnie: wyrazenielogiczne? wartosc1 : wartosc2 gdzie zmienne (lub wyrażenia) wartosc1 i wartosc2 muszą być wyrażeniami tego samego typu. Jeśli wyrazenielogiczne ma wartość true operator zwraca wartosc1 w przeciwnym wypadku wartosc2. Uwaga 4. Dla obiektów działają tylko operatory = (przypisanie), == (równe) oraz!= (rożne). Działają one jednak na referencjach, a nie na zawartości obiektów. Uwaga 5. Dla klasy String działają również operatory + i += i to z dowolnymi argumentami. Uwaga jednak na kolejność Np.: String s = "a"; int a = 1, b = 2; System.out.println(s + a + b); // wypisze "a12" System.out.println(a + b + s); // wypisze "3a"
27 OPERATORY c.d. Przypisania i porównania działają nie bezpośrednio na obiektach, ale na referencjach. Przykład 1 String s1 = "coś", s2 = "co"; s2 += "ś"; System.out.println(s1 + " == " + s2 + ": " + (s1 == s2)); // wypisze "coś == coś: false" //s1 i s2 to takie same napisy, //ale operator == sprawdza, //czy są to te same napisy
28 OPERATORY c.d. Przykład 2 class Test { } public int i; public static void main(string[] args) { Test t1, t2; t1 = new Test(); // inicjalizacja t2 = t1; t1.i = 1; t2.i = 2; System.out.println(t1.i); // wypisze 2 } Po przypisaniu t2 = t1 zmienne t1 i t2 reprezentują ten sam obiekt. Jeden obiekt.
29 OPERATORY c.d. Do porównywania obiektów (wartości, nie referencji) służy metoda equals(). Przypisanie wartości jest bardziej skomplikowaną sprawą. Przykład użycia metody equals(): String s1 = "coś", s2 = "co"; s2 += "ś"; System.out.println(s1 + "==" + s2 + (s1.equals(s2))); // wypisze "coś == coś: true"
OPERATOR KONWERSJI TYPU Zmiana typu wyrażenia- konwersja (rzutowanie) Operator konwersji (rzutowania) ma postać: (nazwa_typu) wyrażenie gdzie nazwa_typu oznacza typ do jakiego jest przekształcany aktualny typ wyrażenia int n=7; double x=(double)n/5;//dzielenie rzeczywiste W trakcie obliczania wartości wyrażeń arytmetycznych dokonywane są automatyczne konwersje (promocje numeryczne) Dla operatorów dwuargumentowych: Jeśli jeden z argumentów jest typu double, to drugi jest przekształcany do double W przeciwnym razie, jeśli jeden jest float, to drugi konwertuje się do float W przeciwnym razie, jeśli jeden jest long, to drugi do long W przeciwnym razie, oba argumenty są konwertowane do int 30
INSTRUKCJE STERUJĄCE 31 Instrukcje sterujące występujące w Javie są bardzo podobne do tych znanych z języka C/C++. Istnieje właściwie tylko jedna ważna różnica: Java nie pozwala na użycie liczby tam, gdzie oczekuje wartości logicznej. Każde wyrażenie logiczne, (np. a==b) jest typu boolean.
32 if-else if (wyrazenie) instrukcja1; lub if (wyrazenie) instrukcja1; else instrukcja2; Wyrażenie musi być typu logicznego (boolean), a poprzez instrukcje rozumiemy dowolną instrukcję, czyli w szczególności złożoną tj. instrukcję postaci: {instrukcja_1;... instrukcja_n;} Jeżeli wyrażenie jest prawdziwe (ma wartość true) to wykonywana jest instrukcja1. W przeciwnym przypadku wykonywana jest instrukcja znajdująca się po else, o ile istnieje.
while, do-while 33 while(wyrazenie_logiczne) instrukcja; instrukcja jest powtarzana, dopóki wyrażenie_ logiczne jest prawdziwe. Obliczenie wartości wyrażenia następuje przed każdym kolejnym wykonaniem instrukcji. (Czyli możliwa jest sytuacja, gdy instrukcja nie zostanie wykonana ani razu) do instrukcja while(wyrazenie_logiczne) Pętla różniąca się od poprzedniej tylko tym, ze najpierw wykonywana jest instrukcja, a dopiero później liczona wartość wyrażenia logicznego. (Czyli instrukcja zostaje wykonana co najmniej jeden raz). Pętla jest powtarzana dopóki wyrazenie_logiczne ma wartość true.
for 34 for(inicjalizacja; wyr_log; krok) instrukcja; inicjalizacja zostaje wykonana raz, przed rozpoczęciem działania pętli. Następnie, przed każdym obrotem pętli obliczana jest wartość wyr_log. Jeśli jest ono prawdziwe wykonywana jest instrukcja, a po niej krok. W przeciwnym wypadku następuje wyjście z pętli. Każde z pól: inicjalizacja,wyr_log, krok może być puste. Dodatkowo pola inicjalizacja i krok mogą zawierać kilka instrukcji oddzielonych przecinkami. Zasięg zmiennych deklarowanych w części inicjacyjnej kończy się wraz z końcem instrukcji for
35 for-each for(typ zm : zestaw) instrukcja; Pętla for-each wykonuje instrukcje, dla każdego elementu zestawu. Pętla ta służy do przebiegania po zestawach danych (np. kolekcjach, tablicach, plikach). Przykład: String[]alfabet={ a, b, c, d, e }; for(string s: alfabet) System.out.println(s); //wypisze w kolejnych wierszach a,b,c,d,e.
break, continue 36 Wewnątrz każdej pętli możemy zastosować instrukcje break oraz continue. Służą one do sterowaniem wykonania pętli z jej środka. Instrukcja break powoduje natychmiastowe wyjście z pętli Instrukcja continue natomiast rozpoczyna następną iterację tej pętli (nie dokańczając aktualnie wykonywanej).
Polecenia : continue i break z etykietami break z etykietą - wyjście z pętli w dowolnym momencie ZewnetrznaPetla;//etykieta for (...) {... break ZewnetrznaPetla;... } continue z etykietą ominięcie części poleceń pętli etykieta; while (...) {... continue etykieta;... } 37
switch 38 Instrukcja switch zwana czasem instrukcją wielokrotnego wyboru. Na podstawie wartości wyrażenia wyr wybiera i wykonuje odpowiedni fragment kodu. Wyrażenie wyr może być jednego z typów całkowitych lub typu char, Character, String lub dowolnego typu wyliczeniowego (enum). (Jeśli wyr jest typu referencyjnego, to do porównania używana jest metoda equals()) switch(wyr){ case wyr_stale_1: instrukcja1; break; case wyr_stale_2: instrukcja2; break;... case wyr_stale_k: instrukcjak; break; default: instrukcja_domyslna;}