Czym jest zmienna
Zmienna to nazwane pudełko, które przechowuje wartość. W Javie każda zmienna ma stały typ, ustalany przy deklaracji, i ten typ nigdy się nie zmienia. To właśnie sprawia, że Java jest językiem statycznie typowanym: kompilator zna typ każdej zmiennej, zanim program się uruchomi, i odmówi skompilowania kodu, który wkłada do pudełka wartość niewłaściwego rodzaju.
Deklaracja składa się z trzech części: typu, nazwy i (zwykle) wartości początkowej.
Czytaj int age = 30; jako "utwórz int o nazwie age i włóż do niego 30". Średnik kończy instrukcję, tak jak każdą instrukcję, co pokazała strona o komentarzach.
Najpierw deklaracja, przypisanie później
Deklarację można oddzielić od pierwszego przypisania. Typ podajesz raz, przy deklaracji; potem przypisujesz już tylko przez nazwę i =:
Jedna reguła, na której potykają się początkujący: zmiennej lokalnej trzeba przypisać wartość, zanim się ją odczyta. Kompilator to śledzi i odrzuca kod, który odczytuje niezainicjalizowaną zmienną lokalną:
int score;
System.out.println(score); // compile error: variable score might not have been initialized
To zaleta, a nie utrudnienie: wyłapuje całą klasę błędów, zanim program w ogóle się uruchomi.
Zasady i konwencje nazewnictwa
Java narzuca kilka twardych reguł, a na nie nakłada konwencje. Reguły: nazwa może zawierać litery, cyfry, _ i $, ale nie może zaczynać się od cyfry, nie może być słowem zarezerwowanym (takim jak int czy class) i rozróżnia wielkość liter (age i Age to dwie różne zmienne).
Konwencje, których wszyscy się trzymają:
- Zmienne i metody zapisuje się w
camelCase:firstName,totalScore. - Stałe zapisuje się w
UPPER_SNAKE_CASE:MAX_USERS. - Nazwy powinny opisywać wartość:
count, a niec;userEmail, a niex.
Czytelne nazwy to nie ozdoba: to dzięki nim za kilka miesięcy nadal zrozumiesz ten kod. totalPrice = itemCount * pricePerItem tłumaczy się samo, czego t = c * p nigdy nie osiągnie.
Bezpieczeństwo typów: pudełko zachowuje swój typ
Ponieważ typ jest ustalany przy deklaracji, nie włożysz do zmiennej wartości niewłaściwego typu. Takie pomyłki są wyłapywane w czasie kompilacji:
int age = 30;
age = "thirty"; // compile error: incompatible types - String cannot become int
Przypisywanie między typami liczbowymi podlega regułom poszerzania (widening): mniejszy typ automatycznie przechodzi w większy, ale nie odwrotnie. Dokładnie omówimy to na stronach o typach danych i rzutowaniu typów; na razie wystarczy wiedzieć, że kompilator pilnuje.
Słowo kluczowe var
Od Javy 10 możesz napisać var zamiast typu i pozwolić kompilatorowi wywnioskować go z wartości po prawej stronie:
var to nie typowanie dynamiczne: name jest tak samo String, jak gdyby napisać String name, i nadal nie przypiszesz do niej później int. To tylko oszczędność pisania. Haczyk: var potrzebuje inicjalizatora, z którego wywnioskuje typ, więc var x; jest niedozwolone, a działa wyłącznie dla zmiennych lokalnych, nigdy dla pól, parametrów metod ani typów zwracanych. Używaj go tam, gdzie typ jest oczywisty z prawej strony; wypisz typ wprost, gdy to poprawia czytelność.
Stałe z final
Gdy wartość nie powinna się zmienić po ustawieniu, oznacz ją jako final. Każda próba ponownego przypisania staje się błędem kompilacji:
final komunikuje zamiar ("to stała wartość") i pozwala kompilatorowi jej pilnować. Sięgaj po nie zawsze, gdy wartość jest z natury stałą, np. stawki, limity czy klucze konfiguracji, żeby przypadkowe ponowne przypisanie zostało wyłapane, a nie po cichu trafiło do produkcji jako błąd.
Zasięg zmiennych
Zmienna istnieje tylko wewnątrz bloku, czyli { ... }, w którym została zadeklarowana, i znika przy nawiasie zamykającym. To jej zasięg (scope). Zmienna zadeklarowana wewnątrz pętli for albo bloku if jest poza nim niewidoczna:
Zarówno i, jak i square należą do pętli i znikają, gdy się kończy; total jest zadeklarowana w bloku zewnętrznym, więc przetrwa. Wniosek praktyczny: deklaruj każdą zmienną w najmniejszym bloku, który jej potrzebuje. Wąski zasięg to mniej nazw walczących o twoją uwagę i mniej okazji, by źle użyć wartości daleko od miejsca, w którym ją ustawiono.
Dalej: typy danych
Każda zmienna na tej stronie zaczynała się od typu: int, double, String, boolean. Następna strona szczegółowo omawia typy danych w Javie: osiem typów prostych, rozmiar każdego z nich, różnicę między typami prostymi a obiektami i to, po który typ sięgnąć w danej sytuacji.
Najczęściej zadawane pytania
Jak zadeklarować zmienną w Javie?
Napisz typ, potem nazwę i opcjonalnie przypisz wartość: int age = 30;. Typ (int) jest stały przez całe życie zmiennej; nazwa (age) to sposób, w jaki się do niej odwołujesz. Możesz rozdzielić to na deklarację i późniejsze przypisanie, int age; age = 30;, ale zanim odczytasz zmienną lokalną, musisz przypisać jej wartość.
Czym jest słowo kluczowe var w Javie?
Od Javy 10 var pozwala kompilatorowi wywnioskować typ zmiennej lokalnej z przypisywanej wartości: var name = "Ada"; sprawia, że name jest typu String. To nadal typowanie statyczne: typ jest ustalany w czasie kompilacji, a nie dynamicznie. var działa tylko dla zmiennych lokalnych z inicjalizatorem, nigdy dla pól, parametrów ani deklaracji bez wartości początkowej.
Jak utworzyć stałą w Javie?
Dodaj słowo kluczowe final: final double PI = 3.14159;. Po przypisaniu zmiennej final nie da się przypisać ponownie: kompilator odrzuci każdą taką próbę. Zgodnie z konwencją stałe zapisuje się w stylu UPPER_SNAKE_CASE, żeby odróżniały się od zwykłych zmiennych.