Java

Transkrypt

Java
Aplikacje w Javie- wykład 1
Dorota Pylak
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/
●
C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice
2008
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/
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.
3
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.
4
Charakterystyka Javy
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
5
Charakterystyka Javy
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
6
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
7
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.
8
Charakterystyka Javy
BEZPIECZEŃSTWO
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
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
10
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.
11
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
12
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. 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)
13
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.
14
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
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
16
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)
●
17
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
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
float
32
-3.4E38...+3.4E38
Float
double
64
-1.7E308...1.7E308
Double
16
\u0000 : \u8fff
Całkowitoliczbowe
Zmiennoprzecinkowe
Znakowy
char
Character
Logiczny
boolean
-
true:false
-
-
Boolean
Pusty
void
Void
19
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
20
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.
21
ZMIENNE
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
22
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
23
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
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;
25
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"
26
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
27
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.
28
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"
29
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
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.
31
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.
32
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.
33
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
34
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.
35
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
Instrukcja continue natomiast rozpoczyna następną
iterację tej pętli (nie dokańczając aktualnie wykonywanej).
36
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
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;}
38