Przeczytaj
Napisz program, który będzie przechowywał cztery zmienne zgodnie ze specyfikacją.
Specyfikacja:
Dane:
znakZodiaku
– zmienna typuString
; informuje o znaku zodiaku użytkownika,liczbaBraci
– zmienna typuint
; przechowuje dane o liczbie braci użytkownika,waga
– zmienna typudouble
; informuje o wyrażonej w kilogramach wadze użytkownika,czySamochod
– zmienna typubool
; zawiera informację, czy użytkownik ma samochód.
Wynik:
Stworzone na podstawie specyfikacji zmienne, zainicjowane wybraną wartością początkową.
Porównaj swoje rozwiązanie z filmem.
Kod programu zaprezentowanego w filmie:
Podsumowanie informacji na temat zmiennych w języku Java
Typy danych w języku Java
Ponieważ zmienne są używane do przechowywania danych, niezbędne jest omówienie typów danych w języku Java. Należą do nich liczby, znaki lub ciągi znaków o różnym zakresie oraz długości, zajmujące różną ilość miejsca w pamięci komputera, co wpływa na wydajność programów. Typy danych dzielimy na:
proste (prymitywne),
złożone (obiektowe), które w uproszczeniu opiszemy jako składające się z typów prostych.
Do typów prostych zaliczamy typy numeryczne (mieszczące dane liczbowe):
liczby całkowite:
byte
( bajt) – zakres od do ,short
( bajty) – zakres od do ,int
( bajty) – zakres od do ,long
( bajtów) – zakres od do (mają przyrostekL
lubl
)
float
( bajty) – maksymalnie liczb po przecinku,double
( bajtów) – maksymalnie cyfr po przecinku.
Float
i double
oprócz tego, że różnią się ilością zajmowanego miejsca w pamięci, są typami o różnej precyzji; double
jest dokładniejszy.
Zazwyczaj w programach tworzonych w języku Java dla typów całkowitych używany jest int
, a dla typów zmiennoprzecinkowych double
. Typ int
jest na tyle duży, że w większości przypadków pomieści potrzebne wartości, a jednocześnie nie spowolni działania programu; double
natomiast jest dostatecznie precyzyjny.
Przy deklarowaniu zmiennych niektórych typów konieczne jest dodanie przyrostka:
L
lubl
dla zmiennejlong
:long l = 6L;
F
lubf
dla zmiennejfloat
:float f = 6.89f;
D
lubd
dla zmiennejdouble
:double d = 34.77d;
Z double
większość IDE sobie poradzi bez przyrostka d
, jednak zawsze warto go dodać dla bezpieczeństwa i większej czytelności kodu.
Wartości liczb zmiennoprzecinkowych zapisujemy z użyciem kropki, a nie – jak w języku polskim – przecinka. Próba użycia przecinka spowoduje błąd.
Kolejnym typem prostym jest char
(z ang. character) – znak. Mieści on w sobie pojedynczy znak, który musi być umieszczony pomiędzy apostrofami, np. 'c'
. Może także być zapisany w postaci liczby szesnastkowej lub dziesiętnej odpowiadającej kodowi danego znaku z tabeli unikodu, np. to 'c'
w unikodzie.
Pierwszy sposób zapisu zmiennych typu char
jest zdecydowanie prostszy i dużo częściej stosowany przez programistów.
Istnieją także znaki specjalne, które deklarujemy z użyciem znaku backslash (\). Jest to znak ucieczki (ang. escape character), który zmienia interpretację kolejnego znaku. Dzięki temu możemy zapisać poniższe znaki specjalne:
\n
– nowa linia,\t
– tabulacja,\r
– powrót karetki.
Znak \ pozwala również zapisać w zmiennej znaki, które pełnią specjalne znaczenie w języku programowania:
\
– backslash,\'
– apostrof,\"
– cudzysłów.
Do zmiennych typu prymitywnego zaliczamy także wartości logiczne (boolowskie) boolean
, które mogą przyjmować tylko true
i false
. Możemy zarówno zapisać w nich wartość logiczną (prawda
lub fałsz
), jak również z ich pomocą sprawdzać, czy dane wyrażenie jest prawdziwe. Do tego celu używamy operatora porównania.
Kolejnym typem danych jest ciąg znaków, czyli String
.
W odróżnieniu od wszystkich poprzednich String
nie jest typem prymitywnym, a obiektowym – język Java jest obiektowy i to właśnie takie dane są jego główną składową.
String
łatwo odróżnić od innych typów danych choćby dlatego, że jak wszystkie typy klasowe (obiektowe) jest zapisywany wielką literą. Przechowuje on ciągi dowolnych znaków, a jego wartość musi być umieszczona w cudzysłowie.
Jak już wiemy, wartość zmiennej typu String
musi być zapisana w cudzysłowie. Jeśli jednak chcemy, aby w ciągu znaków znalazł się cudzysłów, musimy go poprzedzić znakiem ucieczki backslash: "Cytuję: \"znak ucieczki jest potrzebny\"."
.
Jak tworzymy zmienne?
Zmienne w języku Java, niezależnie od typu, tworzymy według schematu:
W przykładowej linii kodu utworzyliśmy zmienną w jednym kroku, dokonując jednoczesnej deklaracji i inicjalizacji.
Natomiast faktycznie najpierw następuje deklaracja zmiennej:
kiedy zostaje zarezerwowane miejsce w pamięci komputera dla zmiennej x
, a następnie następuje inicjalizacja zmiennej:
kiedy zostaje jej przypisana podana wartość.
Najczęściej deklaracja i inicjalizacja zmiennej następują w jednym kroku. Czasem przydaje się możliwość wcześniejszej deklaracji zmiennej i użycie jej w dalszej części programu.
Dla zmiennej typu float
będzie to wyglądało w następujący sposób:
Analogicznie dla zmiennej przechowującej wartość logiczną:
W celu sprawdzenia wartości logicznej przy pomocy zmiennej boolean
, możemy napisać:
Jeśli wypiszemy wynik do konsoli:
otrzymamy oczywiście false
.
Aby zmienna została zainicjowana, musimy pamiętać o średniku – taka jest składnia języka Java.
Java jest językiem o ścisłej kontroli typów, dlatego tworzenie w niej zmiennych jest bardziej skomplikowane pod względem zapisu niż np. w języku Python. Podajemy zawsze typ deklarowanej zmiennej, a w niektórych typach danych dodajemy przyrostki. W ten sposób kompilator dowiaduje się, że typ zmiennej jest zgodny z przypisaną wartością. Jeśli nie podamy typu lub przypiszemy wartość innego typu, program wyrzuci błąd type mismatch
, czyli niezgodność typów.
W języku Java od wersji pojawiła się funkcjonalność o nazwie var
. W przeciwieństwie do innych języków, np. JavaScript, nie ma ona w tym wypadku nic wspólnego z dynamicznym typowaniem. Jest to jedynie nowa funkcjonalność języka Java, skracająca zapis, np. przy tworzeniu zmiennych obiektowych.
Jeśli potrzebujemy zadeklarować wiele zmiennych tego samego rodzaju, możemy to zrobić w jednej linijce, np.
Może to skrócić kod o kilka linijek. Wartości oczywiście musimy przypisać do każdej zmiennej indywidualnie.
Jeśli musimy zadeklarować zmienną numeryczną o bardzo dużej wartości, to dopuszczalny jest zapis z użyciem znaku podkreślenia, np.
co zwiększa czytelność kodu – należy jednak pamiętać, że nie można w tym celu stosować kropki (jak w języku polskim), ponieważ kropka w języku Java oddziela część całkowitą liczby od ułamkowej.
Zmienne „niezmienne”
W języku Java zmienne domyślnie są modyfikowalne, np. gdy stworzymy zmienną:
następnie zmienimy ją na:
i wydrukujemy metodą println()
;
to w konsoli zobaczymy , a nie . Do zmiennej możemy przypisywać wartości dowolną liczbę razy. Oczywiście typ wartości musi odpowiadać typowi zmiennej. Natomiast nie możemy napisać:
ponieważ w ten sposób dwa razy deklarujemy zmienną o takiej samej nazwie, a tego – jak już wiadomo – robić nam nie wolno. W takim wypadku pojawi się komunikat Duplicate local variable wiek
:
czyli wyjątek (błąd) mówiący o powtórnym zadeklarowaniu zmiennej wiek
.
Istnieje natomiast mechanizm, który pozwala tworzyć zmienne niemodyfikowalne (niezmienne), czyli tzw. stałe. Należy użyć słowa kluczowego final
:
Dla przykładu:
Zmienne finalne, czy też stałe, możemy zainicjować w programie tylko raz. Za każdym razem, kiedy będziemy próbowali zmienić wartość takiej zmiennej, otrzymamy błąd.
Zmienne finalne mogą być przydatne w sytuacjach, w których chcemy mieć pewność, że określona wartość nie została i nie zostanie zmieniona. Zmienne finalne wykorzystuje się przy pisaniu programu, który korzysta z pewnych stałych wartości w obliczeniach. Przykładem może być program, który wykorzysta liczbę i pobrane od użytkownika dane, by obliczyć pole koła.
Działania na zmiennych
Jak wspomnieliśmy, na zmiennych, oprócz przypisywania im wartości, wykonujemy różne operacje. Możemy je dodawać, odejmować, mnożyć, dzielić. Możemy też zapisywać w nich wyniki działań arytmetycznych. Oczywiście wszystko to z zachowaniem odpowiednich typów zmiennych i ich wartości.
Co prawda mamy możliwość wykonania działań na różnych typach liczbowych, jednak trzeba przy tym przestrzegać pewnych zasad. Należy teraz wspomnieć o dwóch ważnych pojęciach: konwersji rozszerzającej i zawężającej.
Konwersja rozszerzająca i zawężająca
Konwersję typów w języku Java nazywa się także rzutowaniem (używa się także spolszczonego sformułowania kastowanie, od ang. cast)
Co się stanie, gdy spróbujemy wykonać takie działanie?
Otrzymamy błąd. Aby móc zapisać wynik takiego działania w zmiennej wynik
, musi być ona zadeklarowana jako zmienna typu bardziej ogólnego dla działania; takiego, który „pomieści” obie strony działania, w tym wynik. W tym przypadku jest to double
, a nie int
. Jeśli chcemy, aby program zadziałał, musimy napisać:
Nastąpi wtedy niejawna konwersja rozszerzająca zmiennej int liczba1
do typu double
. Mówimy o konwersji niejawnej, ponieważ nie napisaliśmy jej sami w kodzie programu, tylko język Java wykonał ją automatycznie.
Typy zmiennoprzecinkowe są bardziej ogólne niż całkowite i konwersja niejawna (automatyczna) następuje tylko z typów całkowitoliczbowych do zmiennoprzecinkowych.
Jeśli chcemy, aby wynikiem działania na liczbach typu int
oraz double
był typ int
(czyli aby wynikiem działania liczby o szerszym typie i zakresie oraz liczby o węższym typie była liczba o węższym typie), to wtedy musimy samodzielnie jawnie wykonać konwersję zawężającą, o ile oczywiście wynik będzie w zakresie typu węższego. Czyli:
W konsoli ukaże się napis „Wynik to 0
”.
Musimy pamiętać, że w powyższym przykładzie nie następuje żadne zaokrąglenie. Część ułamkowa wyniku jest po prostu obcinana, kiedy rzutujemy double
do int
. Najpierw liczba2
jest redukowana do , a następnie wynik działania liczba1
/ (int)liczba2
(czyli / ) jest redukowany o część ułamkową. Jako wynik otrzymujemy wartość obciętą do części całkowitej, czyli .
Gdybyśmy napisali program następująco:
i nie zapisali uprzednio wyniku w zmiennej wynik
, tylko od razu wypisali ją do konsoli, język Java również przeprowadziłby konwersję niejawną zmiennej liczba2
i w konsoli wyświetliłoby się .
Zmiennym można również przypisywać wartości innych zmiennych:
jest jak najbardziej poprawny, a w konsoli wydrukuje się wartość , nie . Musimy jednak pamiętać, że typy zmiennych muszą się zgadzać. Zatem kod skomplikuje się:
Java wykona rzutowanie rozszerzające (z int
na double
) na wartość x
. Natomiast ten kod:
nie skompiluje się, ponieważ Java nie wykona samodzielnie rzutowania zawężającego z wartości double
do int
i wyrzuci błąd z rodzaju type mismatch
.
Aby program zadziałał, musielibyśmy wykonać jawną konwersję, czyli napisać w ostatniej linijce:
Język Java posiada kilka podstawowych typów danych i odpowiadających im typów zmiennych. Typy te określają, jaki rodzaj operacji może być wykonywany na zmiennych. Typy muszą być ze sobą zgodne, a Java może wykonać jedynie konwersję rozszerzającą (czyli z typu „węższego” do bardziej ogólnego).
Oczywiście ta ścisła kontrola typów ma swoje niewątpliwe zalety, dlatego język Java jest od lat tak popularny.
Słownik
CRLF (CR, ang. carriage return + LF, ang. line feed) – ciąg dwóch znaków o wartościach ASCII równych i (szesnastkowo i ), oznaczający koniec bieżącej linii tekstu.
(ang. keyword); w językach programowania są to słowa specjalnego rodzaju, ponieważ są interpretowane przez kompilator i spełniają określoną funkcję, np. float
język programowania, w którym typy są przypisywane do wartości (danych) przechowywanych w zmiennych w momencie kompilacji programu, w odróżnieniu od typowania dynamicznego, kiedy typy są przypisywane dopiero w momencie uruchomienia programu; typowanie statyczne pociąga za sobą ścisłą (silną) kontrolę typów
podstawowa cecha zdania określająca jego stosunek do faktów; w logice klasycznej każde zdanie może przyjąć tylko jedną z dwóch wartości logicznych: prawda czyli zgodność zdania ze zbiorem faktów, oznaczana tradycyjnie znakiem „”, fałsz czyli niezgodność zdania ze zbiorem faktów, oznaczana tradycyjnie znakiem „”