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 zapisujemy w postaci stałoprzecinkowej lub zmiennoprzecinkowej (z wykładnikiem). Domyślnie literały rzeczywiste mają typ double. Umieszczenie na końcu literału znaku ‘F’ lub ‘f’ wskazuje, że mamy do czynienia z literałem typu float. Można także użyć znaku ‘D’ lub ’d’ dla podkreślenia, że literał ma typ double.
Literały znakowe umieszcza się w apostrofach. Wewnątrz apostrofów można umieścić dowolny znak lub sekwencję ucieczki (escape sequence). Java obsługuje następujące sekwencje ucieczki:
\n- nowa linia\t- tabulator\b- backspace\r- powrót karetki\f- nowa strona\"- cudzysłów\'- apostrof\\- ukośnik wsteczny\ooo- znak o kodzie ósemkowym ooo (do 3 cyfr)\uxxxx- znak Unicode o kodzie szesnastkowym xxxx
Literały łańcuchowe zapisuje się między cudzysłowami. Wewnątrz cudzysłowów można używać tych samych sekwencji ucieczki co w literałach znakowych.
Literały logiczne to true i false odpowiadające wartościom logicznym prawda i fałsz.
Wyrażenia#
Wyrażenia w Javie składają się ze zmiennych, literałów oraz operatorów. Java udostępnia następujące operatory:
Operatory arytmetyczne#
| Operator | Znaczenie | Pierwszeństwo |
|---|---|---|
+ | dodawanie | 4 |
- | odejmowanie | 4 |
* | mnożenie | 3 |
/ | dzielenie | 3 |
% | reszta z dzielenia | 3 |
Operatory logiczne#
| Operator | Znaczenie | Pierwszeństwo |
|---|---|---|
! | negacja | 1 |
&& | iloczyn logiczny | 11 |
| ` | ` |
Operatory relacyjne#
| Operator | Znaczenie | Pierwszeństwo |
|---|---|---|
< | mniejsze niż | 6 |
<= | mniejsze lub równe | 6 |
> | większe niż | 6 |
>= | większe lub równe | 6 |
== | równe | 7 |
!= | różne | 7 |
Operatory bitowe#
| Operator | Znaczenie | Pierwszeństwo |
|---|---|---|
~ | negacja bitowa | 1 |
& | iloczyn bitowy | 8 |
| ` | ` | suma bitowa |
^ | różnica symetryczna | 9 |
<< | przesunięcie w lewo | 5 |
>> | przesunięcie w prawo ze znakiem | 5 |
>>> | przesunięcie w prawo bez znaku | 5 |
Operatory przypisania#
| Operator | Znaczenie | Pierwszeństwo |
|---|---|---|
= | przypisanie | 13 |
+= | dodaj i przypisz | 13 |
-= | odejmij i przypisz | 13 |
*= | pomnóż i przypisz | 13 |
/= | podziel i przypisz | 13 |
%= | reszta z dzielenia i przypisz | 13 |
&= | iloczyn bitowy i przypisz | 13 |
| ` | =` | suma bitowa i przypisz |
^= | różnica symetryczna i przypisz | 13 |
<<= | przesuń w lewo i przypisz | 13 |
>>= | przesuń w prawo ze znakiem i przypisz | 13 |
>>>= | przesuń w prawo bez znaku i przypisz | 13 |
Tabela 2-2 Zestawienie operatorów pierwszeństwa
Zmienne#
Zmienne w Javie muszą być zadeklarowane przed pierwszym użyciem. Deklaracja zmiennej składa się z typu i nazwy zmiennej:
int liczba;
double temperatura;
boolean flaga;
Można również inicjalizować zmienne podczas deklaracji:
int x = 10;
double pi = 3.14159;
boolean prawda = true;
Nazwy zmiennych#
Nazwy zmiennych w Javie muszą spełniać następujące zasady:
- Mogą zawierać litery, cyfry, znak podkreślenia (_) i znak dolara ($)
- Muszą zaczynać się od litery, znaku podkreślenia lub znaku dolara
- Nie mogą być słowami kluczowymi Java
- Rozróżniane są małe i wielkie litery
Konwencja nazewnictwa w Javie:
- Zmienne i metody:
nazwaZmiennej(camelCase) - Klasy:
NazwaKlasy(PascalCase) - Stałe:
NAZWA_STALEJ(wielkie litery z podkreśleniami)
Instrukcje#
Wprowadzenie#
Instrukcje są podstawowymi jednostkami wykonania programu. Java oferuje różne typy instrukcji dla kontroli przepływu programu.
Instrukcje warunkowe#
Instrukcja if#
if (warunek) {
// instrukcje wykonywane gdy warunek jest prawdziwy
}
Instrukcja if-else#
if (warunek) {
// instrukcje wykonywane gdy warunek jest prawdziwy
} else {
// instrukcje wykonywane gdy warunek jest fałszywy
}
Instrukcja switch#
switch (wyrażenie) {
case wartość1:
// instrukcje
break;
case wartość2:
// instrukcje
break;
default:
// instrukcje domyślne
break;
}
Instrukcje iteracyjne#
Pętla for#
for (inicjalizacja; warunek; inkrementacja) {
// ciało pętli
}
Pętla while#
while (warunek) {
// ciało pętli
}
Pętla do-while#
do {
// ciało pętli
} while (warunek);
Instrukcje sterujące#
Instrukcja break#
Instrukcja break służy do przerwania wykonywania pętli lub instrukcji switch:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // przerwij pętlę gdy i = 5
}
System.out.println(i);
}
Instrukcja continue#
Instrukcja continue powoduje przejście do następnej iteracji pętli:
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // pomiń parzyste liczby
}
System.out.println(i);
}
Instrukcja return#
Instrukcja return kończy wykonywanie metody i opcjonalnie zwraca wartość:
public int dodaj(int a, int b) {
return a + b;
}
Blok instrukcji#
Blok instrukcji to grupa instrukcji otoczona nawiasami klamrowymi {}. Bloki definiują zakres widoczności zmiennych:
{
int x = 10; // x jest widoczne tylko w tym bloku
System.out.println(x);
} // koniec zakresu zmiennej x
Zmienne zadeklarowane wewnątrz bloku są widoczne tylko w tym bloku i jego podblokach. Po opuszczeniu bloku zmienne są automatycznie usuwane z pamięci.