Menu

Typy danych w Javie: typy proste, referencyjne i wartości domyślne

Typy danych w Javie w praktyce: osiem typów prostych, typy referencyjne, wartości domyślne, literały i sufiksy, przepełnienie oraz wybór właściwego typu liczbowego.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Dwie rodziny: typy proste i referencje

Każda wartość w Javie ma typ, a ten typ należy do jednej z dwóch rodzin. Typy proste (prymitywne) przechowują surową wartość bezpośrednio: liczbę, pojedynczy znak albo prawdę/fałsz. Typy referencyjne przechowują referencję (wskaźnik) do obiektu, który znajduje się gdzie indziej w pamięci: String, tablice i każda klasa zdefiniowana przez ciebie lub biblioteki.

To rozróżnienie ma znaczenie, bo typy proste są lekkie i kopiowane przez wartość, a zmienne referencyjne wskazują na współdzielone obiekty. Zacznij od ośmiu typów prostych: to fundament, na którym zbudowane jest wszystko inne.

Osiem typów prostych

Java ma dokładnie osiem wbudowanych typów prostych. Sześć to liczby, jeden to znak i jeden to wartość logiczna:

Kilka rzeczy wartych uwagi od razu: podkreślenia w 2_000_000 to tylko wizualne separatory, które kompilator ignoruje, sufiksy L i f są wymagane (więcej o tym niżej), a char używa pojedynczych cudzysłowów, podczas gdy String używałby podwójnych.

Wybór typu liczbowego

Prawie nigdy nie potrzebujesz byte ani short: oszczędzają pamięć tylko w ogromnych tablicach. Prawdziwe decyzje to wybór między int/long dla liczb całkowitych i float/double dla liczb dziesiętnych.

TypRozmiarKiedy używać
int32 bityDomyślny dla liczb całkowitych (do ok. 2,1 miliarda)
long64 bityWartości powyżej ok. 2 miliardów: znaczniki czasu w milisekundach, rozmiary plików
double64 bityDomyślny dla liczb dziesiętnych, dobra precyzja
float32 bityTylko gdy brakuje pamięci, a precyzja może ucierpieć

Pułapką jest przepełnienie. int po przekroczeniu zakresu po cichu „przekręca się”: bez błędu, po prostu z błędnym wynikiem:

maxInt + 1 przepełnia się do -2147483648, bo oba operandy są typu int i wynik też pozostaje int. Rzutowanie jednej strony na long sprawia, że obliczenie odbywa się na 64 bitach. Gdy wartość może być duża, zwłaszcza liczba milisekund od 1970 roku, sięgaj po long.

Literały i ich sufiksy

Sam literał liczbowy ma typ domyślny i to często zaskakuje. 100 to int, a 3.14 to double. Aby zapisać literał long lub float, musisz dodać sufiks:

Usuń L z 8_000_000_000L, a kod się nie skompiluje, bo literał przekracza zakres int, zanim w ogóle trafi do zmiennej long. Usuń f z 0.5f, a Java zgłosi, że double nie można przypisać do float bez rzutowania. Wielkość liter sufiksu nie ma znaczenia, ale używaj wielkiego L: małe l wygląda dokładnie jak cyfra 1.

char to przebrana liczba

char przechowuje 16-bitową jednostkę kodu Unicode, co oznacza, że działa też jak mała liczba całkowita bez znaku. Możesz wykonywać na nim działania arytmetyczne i konwertować go w obie strony rzutowaniem:

Czasem przydaje się to do przesuwania liter, ale nie opieraj na tym pracy z tekstem: do tego służy String. Zauważ, że char używa pojedynczych cudzysłowów ('A'), a podwójne ("A") tworzą jednoznakowy String, który jest zupełnie innym typem.

Wartości domyślne (i pułapka zmiennych lokalnych)

Pola i elementy tablic, których nie zainicjalizujesz, dostają sensowną wartość domyślną. Dotyczy to jednak tylko pól i elementów tablic: zmienne lokalne nie mają wartości domyślnej, a użycie takiej zmiennej przed przypisaniem wartości to błąd kompilacji, a nie niespodzianka w czasie działania.

Gdybyś zamiast tego napisał w main kod int x; System.out.println(x);, kompilator odrzuciłby go z komunikatem „variable x might not have been initialized”. Ta surowość to zaleta: nie pozwala odczytać śmieci. Wartości domyślne do zapamiętania: typy liczbowe 0, boolean false, char '�' i każdy typ referencyjny null.

Dalej: napisy

String to typ referencyjny, z którego będziesz korzystać najczęściej: tekst, łączone wartości, dane od użytkownika. Zachowuje się inaczej niż omówione tu typy proste: jest obiektem, jest niezmienny, a porównywanie napisów ma własne pułapki. Omawia go następna strona.

Najczęściej zadawane pytania

Ile typów danych jest w Javie?

Java ma osiem typów prostych: byte, short, int, long, float, double, char i boolean. Wszystko inne, czyli String, tablice i dowolne obiekty, to typy referencyjne. Liczba wbudowanych typów prostych jest więc stała i wynosi osiem, a typów referencyjnych może być dowolnie wiele, bo ty (i biblioteki) definiujecie nowe klasy.

Czym różni się int od long w Javie?

Oba przechowują liczby całkowite, ale int ma 32 bity (zakres około ±2,1 miliarda), a long ma 64 bity (zakres około ±9,2 tryliona). Domyślnie używaj int; przejdź na long, gdy wartość może przekroczyć dwa miliardy: znaczniki czasu w milisekundach, rozmiary plików, duże liczniki. Literał long wymaga sufiksu L, na przykład long big = 10000000000L;.

Jaka jest domyślna wartość int w Javie?

Pole typu int ma domyślnie 0, ale wartości domyślne dostają tylko pola i elementy tablic. long ma domyślnie 0L, double ma 0.0, boolean ma false, char ma '\u0000', a każdy typ referencyjny ma null. Zmienne lokalne w ogóle nie mają wartości domyślnej: musisz przypisać im wartość przed użyciem, inaczej kod się nie skompiluje.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ