Podstawowe typy danych w Javie

ByKamil

Podstawowe typy danych w Javie

Poprzedni wpis Java – wstęp i instalacja

W Javie każda zmienna ma ściśle określony typ, który może być:

  • liczbowy,
  • znakowy,
  • logiczny,
  • wyliczeniowy,
  • własny (obiekty klas).

Java jest językiem przenośnym zatem na każdej maszynie zmienne zapisywane są w ten sam sposób. Z góry znane są rozmiary każdego typu prostego i nie istnieje sytuacja znana np. z języka C, w którym zachodzi następująca relacja: short int <= int <= long. Każdy kompilator może luźno podejść do ustalenia rozmiarów zatem jest to zależne wyłącznie od człowieka, który uznał, że określona wartość najlepiej spełnia swoje zadanie na konkretnej maszynie. Podejście ukazane w Javie eliminuje te problemy z uruchamianiem programów na innych komputerach lub systemach.

Typy proste w Javie

Przygodę z danymi rozpoczniemy od najprostszych elementów jakimi są typy proste. W tej części przedstawimy wszystkie zmienne jakie są dostępne w Javie oraz podamy podstawowe informacje o nich.

Liczby całkowite

  • long 8 bajtów (-‭9 223 372 036 854 775 808‬ do ‭9 223 372 036 854 775 807).
  • int 4 bajty (-2 147 483 648 do 2 147 483 647).
  • short 2 bajty (-32 768 do 32 767).
  • byte 1 bajt (-128, 127).

Java nie posiada typu unsigned, w związku z tym nie można rozszerzyć zakresu zmiennej przez interpretację bitu znakowego jako część wartości zmiennej. Jeśli chcemy zapisać liczbę 3 miliardy musimy użyć typu long. Najczęściej wykorzystywanym typem całkowitoliczbowym jest int
i w większości zastosowań jego wartości są wystarczające – jeśli nie jest to podyktowane innymi uwarunkowaniami zalecamy korzystać z tego typu.

Liczby zmiennoprzecinkowe przechowują dodatkowo część ułamkową.

  • float 4 bajty 6-7 cyfr po przecinku (liczby pojedynczej precyzji) przyrostek f lub F,
  • double 8 bajtów 15 cyfr po przecinku (liczby podwójnej precyzji) przyrostek d lub D.

Typ logiczny

Każda zmienna logiczna posiada tylko dwie wartości – true i false. Zapisuje się ją jako boolean. Wartość logiczną może zwrócić także wyrażenie porównujące zmienne operatorami (==, <, >). Ten typ jest podstawą przepływu sterowania w programie.

Typ znakowy

Zmienna znakowa char reprezentuje pojedyncze znaki przy pomocy kodowania Unicode (więcej szczegółów o różnych sposobach kodowania znaków).

Znaki, takie jak cudzysłów zapisuje się jako \”, a ukośnik jako \\. Jest to spowodowane tym, że te znaki mają też inne zastosowanie. Dlatego należy poinformować kompilator, że chcemy umieścić znak nie jako część składni języka, a jako wartość zmiennej. Szczególnie należy zwrócić uwagę na cudzysłowy oraz ukośniki, gdyż częstym błędem jest umieszczenie ich po prostu np. w łańcuchu znakowym, który wskazuje lokalizację na dysku. Poniżej znajduje się pełna lista takich symboli.

\b \t \n \f \r \” \’ \\

Typ wyliczeniowy

Zmienna wyliczeniowa przydaje się w przypadku, gdy zbiór wartości jest dyskretny np. rozmiary pizzy w menu restauracji.

zmienna wyliczeniowa RozmiarPizzy może przyjmować tylko zadeklarowane wartości lub wartość null.

Zmienne i stałe

Zmienne i stałe mają określony typ, mają nazwę oraz wartość. Z punktu widzenia komputera ważne jest wiedzieć, gdzie znajduje się zmienna (jaki posiada adres w pamięci). Dlaczego typ jest taki ważny? Każdy typ zajmuje określoną przestrzeń w pamięci, więc komputer, aby prawidłowo odczytać wartość musi wiedzieć czy będzie to wartość o rozmiarze 4 bajtów jak int, czy też 1 bajt na znak. Na szczęście nas nie interesuje adres komórki w pamięci, a nazwa zmiennej, którą dużo łatwiej operować. Nazwę traktujemy jako etykietę, która po wpisaniu wskaże odpowiednie miejsce w pamięci komputera.

Aby użyć zmiennej należy ją zadeklarować i zainicjować, można to zrobić oddzielnie.

Lub w jednym wierszu

Podobnie używamy innych typów nadając im odpowiednie wartości. pokazuje to poniższy listing.

Słowo kluczowe final oznacza deklarację stałej. Ich nazwy zalecamy pisać wielkimi literami, a w przypadku wieloczłonowej nazwy oddzielać je znakami podkreślenia.

Nazwy zmiennych i stałych

W Javie zmienne, stałe i klasy możemy nazywać w zasadzie dowolnie pamiętając o kilku wyjątkach:

  • dopuszczane są litery, cyfry oraz znak podkreślenia (_),
  • zmienna nie może być słowem kluczowym Javy,
  • pierwszy znak nie może być cyfrą,
  • nie używamy znaków diakrytycznych.

Długość zmiennej może być dowolna, natomiast z dobrej praktyki należy dobierać nazwy zmiennych zgodnie z ich zastosowaniem. Czasami trzeba zastosować dłuższą nazwę, dlatego zalecamy używanie notacji camelCase – czyli pierwsze słowo zaczynamy małą literą, a każde następne – wielką. Poniżej znajdują się przykłady poprawnych nazw zmiennych.

W Javie miejsce inicjacji zmiennej jest dowolne (byle było przed jej użyciem), w związku z tym zaleca się, aby inicjować je jak najbliżej pierwszego użycia.

Widoczność zmiennych

Zmienne widoczne są po ich zainicjowaniu. Na tym etapie nie będziemy wchodzić w widoczność zmiennych z użyciem modyfikatorów dostępu (o tym napiszemy dokładnie w następnym artykule poświęconym klasom w Javie – wstęp do programowania obiektowego). Ważne aby pamiętać, że zmienna, która została zainicjowana wewnątrz bloku nie jest widoczna poza nim.

Natomiast sytuacja odwrotna jest jak najbardziej prawidłowa.

Komentarze w Javie

Zapewne Twojej uwadze nie umknęła treść po dwóch znakach //. Jest to komentarz czyli fragment, który kompilator całkowicie pomija. Komentarze mogą być pomocne przy opisie zmiennych np. co robią, opisywać co robi dana metoda lub wskazywać dany fragment kodu źródłowego, aby łatwiej było go później modyfikować. Występują dwa typy komentarzy:

  • krótkie po znaku // – muszą się skończyć w jednej linii,
  • blokowe po znaku /* i zakończone */ mogą zajmować wiele linii.
  •  

Konwersje i rzutowanie

Konwersje typów są konieczne w przypadku, gdy np w działaniu arytmetycznym operandy są różnego typu (np. int i float). Część z nich może odbywać się niejawnie (automatycznie), a część musi być przeprowadzona przez rzutowania (ang. cast). Podstawową cechą Javy jest zapobieganie częstym błędom programistów zatem gdy konwersja może spowodować utratę danych, wymagane jest jawne rzutowanie typów.

Najważniejsze problemy jakie mogą wyniknąć to:

  • utrata danych, jeżeli mniejszy typ jest zbyt mały, aby przechować rzutowaną wartość.
  • konwersja z typu zmiennoprzecinkowego na całkowitoliczbowy – utrata mantysy (części ułamkowej liczby).

Automatyczne rzutowanie przebiega wg. poniższych zasad zasad:

  • jeśli jeden z operandów jest typu, który potrzebuje więcej pamięci, to drugi zostanie przekonwertowany na jego typ,
  • w przypadku, gdy jeden z operandów jest typu double, to drugi zostanie przekonwertowany na niego.

Konwersje następują w taki sposób, aby nie utracić danych. W przypadku typów całkowitych występuje następująca konwersja.

automatyczna konwersja typów całkowitoliczbowych
Automatyczna konwersja typów całkowitoliczbowych

Liczby zmiennoprzecinkowe konwertują się na double.

automatyczna konwersja typów zmiennoprzecinkowych
automatyczna konwersja typów zmiennoprzecinkowych

W przypadku działania na typach zmiennoprzecinkowych i całkowitoliczbowych zawsze nastąpi konwersja na ten pierwszy typ float lub double.

Jeżeli potrzebujemy konwersji typu zmiennoprzecinkowego na typ całkowity, to należy jawnie rzutować.

Aby zaokrąglić wartości należy skorzystać z metod klasy Math (np. Math.round, Math.floor).

Uwaga! W przeciwieństwie do języka C++ w Javie nie istnieje rzutowanie typu liczbowego na logiczny!

Operatory i operandy

Operatory posiadają priorytet działania (podobnie jak kolejność wykonywania działań). Jeśli kolejne operatory mają ten sam priorytet działania, to działanie wykonywane jest od lewej strony. Jeśli nie mamy pewności najlepiej zastosować nawiasy.

  1. Najwyższy priorytet
    1. [] – operator tablicowy
    2. . – dostęp do metody lub pola obiektu
    3. () – nawiasy i wywołanie metody
  2. Manipulowanie danymi
    1. !  operator negacji
    2. ++  post/pre inkrementacja
    3.   post/pre dekrementacja
    4. ustalenie znaku operandu
    5. (rzutowanie).
    6. * – mnożenie.
    7. / – dzielenie.
    8. % – dzielenie modulo (reszta z dzielenia)
  3. Arytmetyka
    • + dodawanie.
    • odejmowanie.
  4. Relacje
    • (mniejszy)
    • <= (mniejszy lub równy)
    • > (większy)
    • >= (większy lub równy)
    • ==
    • !=
  5. Operacje na bitach
    1. & iloczyn
    2. ^ różnica symetryczna
    3. | suma bitowa
  6. Funktory logiczne
    1. && iloczyn logiczny
    2. || suma logiczna
  7. ? operator warunkowy
  8. Operatory
    1. przypisania: =
    2. sumy: += (i = i + x)
    3. różnicy: -= (i = i – x)
    4. iloczynu: *= (i = i * x)
    5. ilorazu: /= (i = i / x)
  9.  , rozdzielenie wyrażeń

W następnej części przyjrzymy się bliżej łańcuchom znakowym, klasie String oraz tablicom.

About the author

Kamil editor