Aplikacje w środowisku Java - wykład 1
Java-wprowadzenie (typy proste, operatory, instrukcje sterujące)
Treści prezentowane w wykładzie zostały oparte o:● Barteczko, JAVA Programowanie praktyczne od podstaw,
PWN, 2014● http://docs.oracle.com/javase/8/docs/● http://docs.oracle.com/javase/10/docs/● C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice
2013● C. S. Horstmann, Java, Techniki zaawansowane(wydanie10),
Helion, Gliwice 2017
Dorota Pylak
BIBLIOGRAFIA
Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014
C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice 2013
C. S. Horstmann, Java. Techniki zaawansowane, Helion, Gliwice 2017
The Java Tutorials, http://download.oracle.com/javase/tutorial/
http://docs.oracle.com/javase/8/docs/
http://docs.oracle.com/javase/10/docs/
3
WstępW 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
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
5
Charakterystyka języka JavaPRZENOŚ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.
6
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
Java 11 daje możliwość uruchamiania programów zdefiniowanych w pojedynczym pliku źródłowym (bez jawnej kompilacji) jednolinijkową komendąjava MojaKlasa.java
Charakterystyka Javy
7
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
Charakterystyka Javy
8
Charakterystyka Javy
OBIEKTOWOŚĆ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.
9
Charakterystyka Javy
BEZPIECZEŃSTWOBezpieczeń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))
10
Charakterystyka Javy
Bezpieczeństwo transmisji danych oraz ochrona informacjiJava 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) np. algorytmy ChaCha20 i Poly1305 czy TLS 1.3 dodane w Java 11
– 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
11
Charakterystyka Javy
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.
12
Charakterystyka Javy
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
● Oracle kończy z wydawaniem Oracle JDK za darmo do użytku komercyjnego na początku 2019 (do użytku osobistego nadal będzie za free). Na szczęście jest rozwiązanie tej sytuacji - OpenJDK wydawane na licencji GPL. Dodatkowo Oracle zobowiązało się, że od wersji 11 OpenJDK i Oracle JDK będą wymienne.
13
PIERWSZY PROGRAM
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. IntelliJ Idea, 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)
14
PIERWSZY PROGRAM
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.
15
PIERWSZY PROGRAM
public static void main(String[] args)
Jest to nagłówek funkcji o nazwie main i następujących modyfikatorach:● public – oznacza, że 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”.
16
PIERWSZY PROGRAM
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
17
PIERWSZY PROGRAM
● 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)
18
KOMENTARZE
●//komentarz jednowierszowy●/*komentarzwielowierszowy*/
●/**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 znaki _ i $, przy czym nie mogą zaczynać się od cyfry (i od Javy 9 sam znak "-" nie może być identyfikatorem).
19
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
20
LITERAŁY
● 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
21
LITERAŁY c.d.
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.
22
ZMIENNE
Zmienna to nazwana część pamięci służąca do przechowywania informacji
Deklaracja zmiennejnazwa_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
ZMIENNE var
Od Java 10 w przypadku deklaracji zmiennej lokalnej występującej razem z inicjalizacją można zastosować mechanizm konkludowania typów i zamiast nazwa_typu wpisać słowo kluczowe var
var mojfajnyObiekt = new MojaSuperFajnaKlasa();
//zamiast
MojaSuperFajnaKlasa mojfajnyObiekt = new MojaSuperFajnaKlasa();
Typ jest konkludowany na podstawie wyrażenia inicjującego
var value = "abcd"; //value jest Stringiem
24
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
25
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
= przypisanieop= złożony operator przypisania
26
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;
27
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"
28
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
29
OPERATORY c.d.
● Przykład 2
class Test {
public int i;
public static void main(String[] args) {
Test t1, t2;t1 = new Test(); // inicjalizacjat2 = 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.
30
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"
31
OPERATOR KONWERSJI TYPU● Zmiana typu wyrażenia- konwersja (rzutowanie)● Operator konwersji (rzutowania) ma postać:
(nazwa_typu) wyrażeniegdzie 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
32
INSTRUKCJE STERUJĄCE
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.
33
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.
34
while, do-while
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.
35
for
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
36
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.
37
break, continue
● 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. Wykonanie instrukcji break powoduje skok do pierwszej instrukcji za przerwaną pętlą czy instrukcją wyboru.
● Instrukcja continue natomiast rozpoczyna następną iterację tej pętli (nie dokańczając aktualnie wykonywanej). Wykonanie bieżącej iteracji jest przerwane, nie zaś wykonanie całej pętli.
● W przypadku umieszczenia instrukcji break lub continue w pętli zagnieżdżonej w innej pętli mają one skutek tylko dla pętli w której bezpośrednio się znajdują, ale możliwe jest wskazanie – poprzez etykietę – pętli bardziej zewnętrznej.
● Etykieta jest identyfikatorem występującym przed instrukcją i oddzielonym od niej dwukropkiem.
38
Polecenia : continue i break z etykietami
● break z etykietą - wyjście z pętli w dowolnym momencie
ZewnetrznaPetla://etykieta for (...) { for(...){ ... break ZewnetrznaPetla; ... } }Jeżeli instrukcja break wymienia etykietę, to przerwane zostanie wykonywanie iteracji tej pętli, przed którą umieszczono etykietę. Efekt ten stosowany jest do przerywania wykonania zewnętrznych pętli w przypadku zajścia określonego warunku testowanego w pętli zagnieżdżonej.
39
Polecenia : continue i break z etykietami
● continue z etykietą – ominięcie części poleceń pętli
etykieta:
while (...) {
...
continue etykieta;
...
}
Instrukcja continue z etykietą pozwala na zaniechanie i kontynuację instrukcji iteracyjnej oznaczonej tą etykietą (na ogół jest to jedna z pętli zewnętrznych w stosunku do pętli, w której użyto instrukcji continue).
40
switch
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;}