Menu

Zmienne w Javie: deklaracja, przypisanie i zasięg

Jak działają zmienne w Javie: deklarowanie z typem, przypisywanie wartości, zasady nazewnictwa, słowo kluczowe var, stałe z final i reguły zasięgu, które decydują, gdzie żyje zmienna.

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

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 nie c; userEmail, a nie x.

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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ