Wewnętrzne typy danych
Język Java udostępnia szereg standardowych typów zmiennych i literałów, z których większość można spotkać również
w innych językach programowania. Typy te nazywane są po angielsku
intrinsic types, co można przetłumaczyć jako
typy wewnętrzne. Poniższa tabela zawarta listę wewnętrznych typów danych, podając dla każdego z nich
nazwę oraz wielkość pamięci zajmowanej przez zmienne danego typu (w bitach).
Typ | Pamięć (w bitach) | Opis |
boolean | 8 | wartość logiczne true lub false |
char | 16 | kod znaku ze zbioru znaków Unicode |
byte | 8 | liczba całkowita ze znakiem |
short | 16 | liczba całkowita ze znakiem |
int | 32 | liczba całkowita ze znakiem |
long | 64 | liczba całkowita ze znakiem |
float | 32 | liczba zmiennoprzecinkowa |
double | 64 | liczba zmiennoprzecinkowa |
Tablice
Deklaracja tablic w Javie jest bardzo podobna do deklaracji w C++. Z jednym, ale bardzo istotnym wyjątkiem:
w Javie każda tablica musi być deklarowana dynamicznie, z użyciem operatora
new, który przydziela
w pamięci miejsce niezbędne dla tablicy.
Przykłady deklaracji tablic w Javie:
//tablica jednowymiarowa
int mojatablica [] = new int [100];
int [] mojatablica = new int [100];
//tablica dwuwymiarowa
int mojatablica [] = new int [10] [10];
int [] [] mojatablica = new int [10] [10];
Literały
W Javie możemy używać literałów:
- całkowitych (dziesiętnie, ósemkowo i szesnastkowo) odpowiadających typom int i long
- Ciąg cyfr poprzedzony ewentualnie znakiem automatycznie traktowany jest jako literał całkowity typu int.
Umieszczenie na końcu takiego literału znaku L lub l wskazuje, że mamy do czynienia z literałem typu long.
Literały o wartości bezwzględnej większej niż 2.147.483.647 automatycznie przyjmują postać liczby typu long.
- Literały całkowite rozpoczynające się znakiem 0 (zero) są liczbami ósemkowymi.
- Literały całkowite zaczynające się sekwencją 0x lub 0X traktowane są jako liczby szesnastkowe. Do zapisu cyfr szesnastkowych można używać zarówno małych jak i wielkich liter alfabetu (od A do F).
- rzeczywistych (stałoprzecinkowych i zmiennoprzecinkowych) odpowiadających typom float i double
- Literały rzeczywiste traktowane są jako liczby typu double.
- Aby zmienić standardowe przypisanie i wymusić interpretację liczby jako typu float należy dodać na końcu literału litery F lub f.
- Można też jawne przypisać literałowi typu double poprzez dodanie litery D lub d.
- znakowych i łańcuchowych związanych z typem char i String
- logicznych reprezentujące 2 wartości logiczne typu boolean: true i false reprezentujące wartości prawda i fałsz.
Odmiennie niż w języku C++, nie można dokonywać konwersji wartości typu boolean do wartości typu int.
Przykłady literałów:
123, 123L, 0456, 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
' ' spacja
'\\' lewy ukośnik
'G' znak G
'\x20' spacja
"To jest tekst" łańcuch znaków
Zmienne
W Javie każda zmienna musi być jawnie zadeklarowana, zanim zostanie użyta.
Deklaracja zmiennej może znajdować się w dowolnym miejscu
metody (pojęcie metody jest równoważne pojęciu funkcji w strukturalnych językach programowania).
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 zapis kończymy średnikiem. Deklarację możemy przedstawić schematycznie w następujący sposób:
NazwaTypu NazwaZmiennej [ = WartośćPoczątkowa ];
gdzie napis w nawiasach [ ] oznacza opcjonalną część deklaracji.
NazwaZmiennej musi zaczynać się
literą,
znakiem podkreślenia lub
znakiem dolara.
Dalej,
NazwaZmiennej może zawierać
cyfry lub
litery alfabetu. W skład alfabetu wchodzą znaki:
- a do z
- A do Z
- zbiór znaków Unicode.
Oznacza to zatem, że napisy
Łódź i
Wartość są poprawnymi identyfikatorami Javy.
Należy pamiętać, że Java odróżnia wielkość liter w nazwach identyfikatorów.
Oznacza to, że np.:
ala,
ALA i
Ala są trzema zupełnie niezależnymi identyfikatorami.
W Javie zastosowano mechanizm nadawania deklarowanym zmiennym domyślnych wartości początkowych:
Typ danych | Wartość domyślna |
boolean | false |
byte | 0 |
char | 0X0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0F |
double | 0.0D |
Przykładowe deklaracje zmiennych:
//zmienna typu całkowitego z nadaniem wartości początkowej 10
int x = 10;
// zmienna typu logicznego z przypisaniem domyślna wartość false
boolean koniec;
// zmienna typu logicznego z nadaniem jej wartości true
boolean start = true;
// zmienna znakowej z nadaniem jej wartości Z
char znak = 'Z';
Wyrażenia
Do tworzenia wyrażeń służą:
zmienne, wywołania
funkcji i
operatory, z których większość zaczerpnięto z
języka C++. W Javie wprowadzono jednak szereg zmian dotyczących operatorów.
- Udostępniono nowy operator >>>, oznaczający przesunięcie bitowe w prawo, bez znaku
(postaci: op1 >>> op2, gdzie op2 jest liczbą określającą o ile pozycji nastąpi przesunięcie).
- Przyjęto zasadę, że operatory nie mogą być przeciążane.
- Jeśli argumentami operatorów: &, | lub ^ 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 logicznej: sumy, iloczynu i wyłączającego ALBO (ang. "exclusive or", XOR).
- Zastosowanie operatorów logicznych & i | różni się od użycia dostępnych operatorów && i ||
tym, że podczas ich wartościowania nie jest stosowana zasada "short-circuit evaluation", polegająca
na obliczaniu wartości składowych wyrażenia logicznego tylko wtedy, gdy wpływają one na wartość całego wyrażenia.
- 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 w języku C++, do wartości typu całkowitego.
- Dla operatorów binarnych, w większości przypadków, występuje w Javie automatyczna konwersja zmiennych zadeklarowanych jako:
byte, char i short do typu int, co może prowadzić do wystąpienia błędu w instrukcji przypisania.
Dla zmiennych x, y, z typu byte, zadeklarowanych np. tak:
byte x;
byte y = 2;
byte z = 3;
w poniższej instrukcji wystąpi błąd przypisania,
spowodowany automatyczną konwersją typu zmiennych.
x = y * z; // błąd przypisania wyniku typu int
// do zmiennej typu byte
Przyczyną błędu jest dokonanie, przed wykonaniem operacji mnożenia,
automatycznej konwersji typu zmiennych y i z do typu int.
Aby uniknąć tego błędu, musimy zastosować
konwersję wyniku operacji do typu byte:
x = (byte)(y * z); //to wyrażenie jest poprawne