2.2 Klasyczne konstrukcje programowania imperatywnego w Javie

Wewn�trzne typy danych

J�zyk Java udost�pnia programi�cie szereg standardowych typ�w warto�ci, z kt�rych wi�kszo�� mo�na spotka� tak�e w innych j�zykach programowania. Typy te nazywane s� w oryginale 'intrinsic types', co przet�umaczyli�my jako "typy wewn�trzne". W poni�szej tabeli zawarto opis wewn�trznych typ�w danych, zawieraj�cy dla ka�dego typu jego nazw� oraz wielko�� pami�ci zajmowanej przez poszczeg�lne warto�ci typu.

Typ danych Rozmiar

(w bitach)

boolean 8
byte 8
char 16
short 16
int 32
long 64
float 32
double 64

Tabela 2-1 Zestawienie typ�w wewn�trznych w Javie

Zmienne typu char s� reprezentowane na 16 bitach poniewa� mo�emy jako warto�� zmiennej typu char u�y� dowolnego znaku ze zbioru znak�w Unicode.

Litera�y

W Javie mamy do dyspozycji nast�puj�cy zbi�r litera��w: litera�y ca�kowite (dziesi�tne, �semkowe i szesnastkowe), odpowiadaj�ce typom int i long, litera�y rzeczywiste (sta�oprzecinkowe i zmiennoprzecinkowe), odpowiadaj�ce typom float i double, litera�y znakowe i �a�cuchowe, zwi�zane z typem char i String oraz litera�y logiczne reprezentuj�ce dwie warto�ci logiczne typu boolean.

Dziesi�tne litera�y ca�kowite nale��ce do typu int s� ci�gami cyfr dziesi�tnych, ewentualnie poprzedzonymi znakiem. Umieszczenie na ko�cu litera�u ca�kowitego znaku 'L' lub 'l' wskazuje, �e mamy do czynienia z litera�em typu long. Litera�y o warto�ciach wi�kszych ni� '2.147.483.647' dziesi�tnie automatycznie przyjmuj� posta� liczby typu long.

Litera�y rozpoczynaj�ce si� znakiem '0' s� liczbami �semkowymi, natomiast litera�y zaczynaj�ce si� sekwencj� '0x' lub '0X' stanowi� liczby szesnastkowe. Do zapisu cyfr szesnastkowych mo�na u�ywa� zar�wno ma�ych jak i wielkich liter alfabetu (od A do F).

Litera�y rzeczywiste traktowane s� jako liczby typu double. Mo�emy jednak zmieni� to standardowe przypisanie i wymusi� interpretacj� liczby jako warto�ci typu float przez dodanie na ko�cu litera�u litery 'F' (lub 'f'). Mo�liwe jest tak�e jawne przypisanie litera�owi typu double poprzez dodanie litery 'D' lub 'd'.

Poni�ej prezentujemy litera�y numeryczne: ca�kowite i rzeczywiste:

169, 0251, 0xA9, 0XA9, 0xa9 - litera�y ca�kowite typu int i long

4.565556, 0.2, 50.0, 30.5E-11 - litera�y rzeczywiste typu double

4.565556f, 0.2F, 50.0f, 30.5E-11f - litera�y rzeczywiste typu float

4.565556d, 0.2D, 50.0d, 30.5E-11d - litera�y rzeczywiste typu double

Istniej� dwa litera�y typu boolean- s� nimi sta�e true i false , reprezentuj�ce warto�ci "prawda" i "fa�sz". Nale�y zauwa�y�, �e odmiennie, ni� w j�zyku C, nie mo�na dokonywa� konwersji warto�ci typu boolean do warto�ci typu int.

Zwyk�e litera�y znakowe zapisujemy w apostrofach. Mo�na definiowa� tak�e litera�y reprezentuj�ce znaki w standardzie Unicode. W tym celu u�ywamy notacji '\xNN', gdzie NN jest warto�ci� Unicode znaku.

W Tabeli 2-2 zestawiono litera�y s�u��ce do zapisu znak�w specjalnych

Opis Litera�
New line (znak nowej linii) \n
Horizontal tab (tabulacja pionowa) \t
Backspace \b
Carriage return (powr�t karetki) \r
From feed (znak nowej strony) \f
Single quote (apostrof) \'
Double quote (cudzys��w) \"
Backslash (lewy uko�nik) \\

Tabela 2-2 Litera�y znak�w steruj�cych

Litera�y �a�cuchowe s� sekwencjami znak�w uj�tymi w cudzys��w. Litera�y tego typu w Javie nie s�, jak to ma miejsce w C/C++, tablicami znak�w zako�czonymi znakiem pustym.

Przyk�ady definicji litera��w znakowych:

' ' - spacja,

'\\' - lewy uko�nik,

'K' - znak K,

'\x20' - spacja.

Napis:

 "To litera�"

jest przyk�adem litera�u �a�cuchowego.

Wyra�enia

Do tworzenia wyra�e�, opr�cz zmiennych i wywo�a� funkcji, s�u�� operatory, z kt�rych wi�kszo�� zaczerpni�to z j�zyk�w C i C++. Jednak�e, w Javie wprowadzono szereg zmian dotycz�cych operator�w - om�wimy je kolejno.

Po pierwsze, udost�pniono nowy operator '>>>', oznaczaj�cy przesuni�cie bitowe w prawo, bez znaku (postaci: op1>>>op2, gdzie op2 liczb� okre�laj�c� o ile pozycji nast�pi przesuni�cie). Przyj�to tak�e zasad�, �e operatory nie mog� by� przeci��ane. Ponadto, je�li argumentami operator�w: '&', '|' oraz '^' s� liczby, to traktuje si� je jako operatory bitowe, odpowiednio: bitowej sumy, iloczynu i "wy��czaj�cego ALBO", natomiast dla argument�w typu boolean, wymienione operatory s� operatorami: sumy logicznej, iloczynu logicznego i wy��czaj�cego ALBO logicznego (ang. "exclusive or" XOR).

Zastosowanie operator�w logicznych '&' i ' |' r�ni si� od u�ycia dost�pnych tak�e operator�w '&&' i '||' tym, �e podczas ich warto�ciowania nie jest stosowana zasada "short-circuit evaluation", polegaj�ca, w og�lno�ci, na obliczaniu warto�ci sk�adowych wyra�enia logicznego tylko wtedy, gdy wp�ywaj� one na warto�� ca�ego wyra�enia, na przyk�ad w wyra�eniu:

 (6 > 2) | true

po obliczeniu warto�ci '6>2' znana jest warto�� ca�ego wyra�enia i nie ma potrzeby dalszego warto�ciowania. Gdy jednak chcemy, aby drugi argument operatora '|' nie by� wyliczany, stosujemy operator '||'.

Poni�sza tabela zawiera zestawienie operator�w j�zyka Java.

Priorytet Operator Priorytet Operator
1 . [] () 9 ^
2 ++ -- ! ~ instanceof 10 |
3 * / % 11 &&
4 + - 12 ||
5 << >> >>> 13 ?:
6 < > <= >= 14 = op=
7 == != 15 ,
8 &    

Tabela 2-3 Zestawienie operator�w Javy w porz�dku wzrastaj�cych priorytet�w

Wyra�enie 'op=', gdzie 'op' jest jednym z operator�w: ( '+', '-', '*', '/', '%', '&', '|', '^', '<<', '>>', '>>>') , stanowi definicj� zbioru operator�w z�o�onych, ��cz�cych operator binarny 'op' i operator przypisania '=', w nast�puj�cy spos�b:

a op= b; jest r�wnowa�ne a = a op b;

Warto�ciami wyra�e� zawieraj�cych operatory relacyjne: '>', '<', '>=', '<=', '== 'i '!=' s� sta�e typu boolean, kt�re nie mog� by� przekszta�cane, jak to ma miejsce w j�zyku C, do warto�ci typu ca�kowitego.

Dla operator�w binarnych, w wi�kszo�ci przypadk�w, wyst�puje w Javie zjawisko automatycznej konwersji zmiennych, zadeklarowanych jako: byte, char i short do typu int, co cz�sto prowadzi do wyst�pienia b��du w instrukcji przypisania.

Dla zmiennych a, b, c typu byte, zadeklarowanych np. tak:

byte a;
byte b=2;
byte c=3;

w poni�szej instrukcji wyst�puje b��d przypisania, spowodowany automatyczn� konwersj� typu zmiennych.

a=b*c; // b��d przypisania wyniku typu int do zmiennej typu byte! 

Przyczyn� wyst�pienia b��du w instrukcji przypisania jest dokonanie, przed wykonaniem operacji mno�enia, automatycznej konwersji typu zmiennych b i c do typu int. Aby unikn�� tego b��du, musimy zastosowa� konwersj� wyniku operacji (typu int) do typu byte:

a=(byte)(b*c); //to wyra�enie jest poprawne.

Zmienne

Wszystkie zmienne w Javie musz� by� zadeklarowane, zanim zostan� u�yte. Deklaracja zmiennej mo�e znajdowa� si� w dowolnym miejscu definiowanej metody (poj�cie metody jest r�wnowa�ne identycznemu poj�ciu w j�zyku C++).

Deklaracja zmiennej sk�ada si� z nazwy typu zmiennej, za kt�r� znajduje si� nazwa zmiennej oraz, opcjonalnie, wyra�enie nadaj�ce warto�� pocz�tkow� zmiennej. Ca�y napis zako�czony jest �rednikiem. Deklaracj� t� mo�emy przedstawi� schematycznie w nast�puj�cy spos�b:

NazwaTypu NazwaZmiennej [ = Warto��Pocz�tkowa ];

gdzie napis w nawiasach '[' i ']' oznacza cz�� opcjonaln� deklaracji.

Nazwa musi zaczyna� si� liter� alfabetu, znakiem podkre�lenia '�_�' lub znakiem dolara�'$'. Dalej, identyfikator mo�e zawiera� cyfry lub litery alfabetu. W sk�ad alfabetu wchodz� znaki:

Oznacza to zatem, �e napisy 'M�ka' i 'T�m�o' s� poprawnymi identyfikatorami Javy.

W Javie zastosowano mechanizm nadawania zmiennym wewn�trznym domy�lnych warto�ci pocz�tkowych - w Tabeli 2-4 zestawiono te warto�ci.

Typ danych Warto�� domy�lna
boolean false
byte 0
char 'x0'
short 0
int 0
long 0
float 0.0F
double 0.0D

Tabela 2-4 Zestawienie warto�ci domy�lnych dla typ�w wewn�trznych

Przyk�adowe deklaracje zmiennych:

//deklaracja zmiennej typu ca�kowitego z nadaniem jej
// warto�ci pocz�tkowej '5'
int nLiczbaPowrotow = 5; 
// deklaracja zmiennej typu boolean z nadaniem jej 'true'
boolean bMozna = true;
// deklaracja zmiennej typu boolean bez nadania warto�ci 
// pocz�tkowej, zostanie wi�c przypisana domy�lna warto�� 'false'
boolean bKoniec; 

W rozdziale tym om�wiono zmienne typ�w wewn�trznych, deklaracja zmiennych typ�w obiektowych wygl�da podobnie z tym, �e w opcjonalnej cz�ci deklaracji zmiennej (wyra�eniu nadaj�cym warto�� pocz�tkow�), mo�e zosta� utworzony nowy obiekt, odpowiedniego typu obiektowego. Deklarowanie zmiennych obiektowych om�wione zosta�o w punkcie 2.3.6.

Instrukcje

Wprowadzenie

Zbi�r instrukcji j�zyka Java, wzorowany na zbiorze instrukcji j�zyka C, zawiera:

W kolejnych podpunktach, om�wimy postaci sk�adniowe i semantyk� wymienionych instrukcji.

W Javie do dyspozycji mamy nast�puj�ce instrukcje steruj�ce: if, for, while, switch.

Instrukcje warunkowe

Instrukcja warunkowa if przyjmuje posta�:

if (wyra�enie_logiczne) instrukcja  else instrukcja ;    

lub

if (wyra�enie_logiczne) instrukcja

Wykonanie instrukcji polega na obliczeniu warto�ci wyra�enia_logicznego i, je�li jest ona r�wna true, to wykonaniu podlega pierwsza instrukcja, w przeciwnym przypadku (dla warto�ci r�wnej false), wykonywana jest instrukcja umieszczona po s�owie kluczowym else (je�li wyst�puje) lub nast�pna instrukcja programu.

W Javie istnieje tak�e mo�liwo�� �atwego programowania warunk�w, przyjmuj�cych warto�ci ze zbioru wi�kszego, ni� dwuelementowy (jak to ma miejsce w instrukcji if). Stosujemy wtedy instrukcj� wyboru switch o postaci:

switch(wyra�enie_warunkowe)
{
	case sta�a1: instrukcja	
	case sta�a2: instrukcja
	...
	case sta�aN: instrukcja
	[default: instrukcja]
}   

W pierwszym kroku wykonania instrukcji obliczana jest warto�� wyra�enia_warunkowego (kt�re przyjmuje warto�ci ca�kowite), a nast�pnie por�wnywana jest ona kolejno z warto�ciami sta�ych umieszczonych po s�owach case. Sterowanie jest przekazywane do tej instrukcji, w kt�rej warto�� sta�ej jest r�wna warto�ci wyra�enia_warunkowego. Je�li �adna sta�a nie ma warto�ci identycznej z warto�ci� wyra�enia, to wykonywana jest instrukcja umieszczona po s�owie default (je�li jest zdefiniowane) lub nast�pna instrukcja w programie.

Instrukcje iteracyjne

W Javie mamy do dyspozycji klasyczny zestaw instrukcji iteracyjnych:

Instrukcja while przyjmuje posta�:

while (wyra�enie_logiczne) instrukcja

Najpierw obliczana jest warto�� wyra�enia_logicznego. Je�li jest ona r�wna true, to wykonywana jest instrukcja, gdy za� warto�� ta r�wna jest false - sterowanie przekazywane jest do nast�pnej instrukcji programu. Po wykonaniu instrukcji, ponownie sprawdzana jest warto�� wyra�enia_logicznego i procedura powtarza si�.

Instrukcj� do...while mo�na zapisa�:

do instrukcja
while (wyra�enie_logiczne);

Wykonanie tej instrukcji r�ni si� od wykonania poprzedniej tym, �e warunek wyra�enie_logiczne jest sprawdzany po ka�dym wykonaniu instrukcji, a nie przed, jak to ma miejsce w przypadku instrukcji while.

Nale�y zauwa�y�, �e jest mo�liwa zmiana opisanego wy�ej trybu wykonania instrukcji iteracyjnych poprzez zastosowanie instrukcji steruj�cych break i continue, kt�re om�wimy p�niej .

Na koniec, zajmiemy si� instrukcj� for o nast�puj�cej sk�adni:

for (wyra�enie_1; wyra�enie_logiczne; wyra�enie_3) instrukcja

Wykonanie instrukcji for przebiega w nast�puj�cy spos�b:

  1. Obliczana jest warto�� wyra�enia_1
    1. Obliczana jest warto�� wyra�enia_logicznego. Je�li warto�� obliczona jest r�wna true, to wykonywane jest instrukcja, w przeciwnym przypadku, sterowanie przekazywane jest do nast�pnej instrukcji programu
    2. Obliczana jest warto�� wyra�enia_3
  2. Powr�t do kroku 2.

Zmienne zadeklarowane w wyra�eniu_1 s� widoczne tylko w ciele instrukcji for - po wykonaniu p�tli, nie mog� by� one ponownie u�yte. Ta cecha deklaracji zmiennych wykazuje istotn� r�nic� z analogiczn� deklaracj� w j�zyku C++, gdzie zmienne zadeklarowane w instrukcji for s� widoczne s� poza ni�.

Instrukcje steruj�ce

Instrukcje break i continue pozwalaj� na wcze�niejsze opuszczenie p�tli. Je�li break wyst�puje bez etykiety (ang. label) to sterowanie programem przekazywane jest poza instrukcj� while lub for. Je�li instrukcja break posiada etykiet� to sterowanie przekazywane jest poza blok instrukcji oznaczonych etykiet�.

Przyk�ad 2.1 U�ycie instrukcji break z etykiet�
Przyk�ad ten ilustruje zastosowanie instrukcji break z etykiet� do sterowania wykonaniem programu w Javie:

int i=0;
int k=10;
NaszBlok:
	{	
		while(i++<10)
		{	
			if (--k==0)
				break NaszBlok;
			System.out.println(i/k); 
			// wy�wietlenie na ekranie wyniku dzielenia
		}
		//Tu zosta�oby przekazane sterowanie gdyby instrukcja 	
		//break nie mia�a etykiety NaszBlok.
	} //koniec bloku instrukcji NaszBlok 
	//Tu zostaje przekazane sterowanie programem po wykonaniu 	
	//instrukcji break NaszBlok

U�ycie instrukcji break z etykiet� pozwala na natychmiastowe opuszczenie wielu zagnie�d�onych instrukcji while.

Instrukcja continue nie powoduje opuszczenia p�tli ale natychmiastowe przej�cie do nast�pnego kroku iteracji. Je�li u�yjemy instrukcji continue z etykiet� sterowanie przekazywane jest do nawiasu otwieraj�cego blok instrukcji oznaczonych etykiet�.

Blok instrukcji

Instrukcja z�o�ona to ci�g instrukcji pomi�dzy nawiasami { i }, nazywana blokiem instrukcji.

Je�li zadeklarujemy w bloku zmienn� to b�dzie ona widoczna tylko w tym bloku.

Przyk�ad 2.2 Widoczno�� zmiennych w bloku instrukcji
Zmienna ta zosta�a zadeklarowana tu dwukrotnie, dodatkowo jeszcze jako zmienna r�nych typ�w:

{
	{
		int i = 10;
	}
	{
		long i = 5; // mo�emy tu ponowanie zadeklarowa� zmienn� 
			// nazwie 'i', poniewa� nie jest tu widoczna zadeklarowana 
			// we wcze�niejszym bloku zmienna o tej samej nazwie
	}
}