Problem 1

Napisz program, który będzie przechowywał cztery zmienne zgodnie ze specyfikacją.

Specyfikacja:

Dane:

  • znakZodiaku – zmienna typu String; informuje o znaku zodiaku użytkownika,

  • liczbaBraci – zmienna typu int; przechowuje dane o liczbie braci użytkownika,

  • waga – zmienna typu double; informuje o wyrażonej w kilogramach wadze użytkownika,

  • czySamochod – zmienna typu bool; zawiera informację, czy użytkownik ma samochód.

Wynik:

Stworzone na podstawie specyfikacji zmienne, zainicjowane wybraną wartością początkową.

RjW8twLMtHY9l
Wymyśl pytanie na kartkówkę związane z tematem materiału.
Polecenie 1

Porównaj swoje rozwiązanie z filmem.

R1IODkhO0WwZH
Film nawiązujący do treści materiału podstawowe typy zmiennych.

Kod programu zaprezentowanego w filmie:

RgdnarfBObzrA

Przycisk do pobrania TXT z kodem źródłowym z filmu podstawowe typy zmiennych.

Plik TXT o rozmiarze 261.00 B w języku polskim

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:

  1. byte ( bajt) – zakres od do ,

  2. short ( bajty) – zakres od do ,

  3. int ( bajty) – zakres od do ,

  4. long ( bajtów) – zakres od do (mają przyrostek L lub l)

  1. float ( bajty) – maksymalnie liczb po przecinku,

  2. double ( bajtów) – maksymalnie cyfr po przecinku.

Floatdouble 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.

Ważne!

Przy deklarowaniu zmiennych niektórych typów konieczne jest dodanie przyrostka:

  • L lub l dla zmiennej long: long l = 6L;

  • F lub f dla zmiennej float: float f = 6.89f;

  • D lub d dla zmiennej double: double d = 34.77d;

Dla zainteresowanych

double większość IDE sobie poradzi bez przyrostka d, jednak zawsze warto go dodać dla bezpieczeństwa i większej czytelności kodu.

Ważne!

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.

Ważne!

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,

  • \rpowrót karetkipowró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 truefalse. 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.

Ważne!

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:

Linia 1. typDanych nazwaZmiennej znak równości wartość średnik.

W przykładowej linii kodu utworzyliśmy zmienną w jednym kroku, dokonując jednoczesnej deklaracji i inicjalizacji.

Linia 1. int x znak równości 10 średnik.

Natomiast faktycznie najpierw następuje deklaracja zmiennej:

Linia 1. int x średnik.

kiedy zostaje zarezerwowane miejsce w pamięci komputera dla zmiennej x, a następnie następuje inicjalizacja zmiennej:

Linia 1. x znak równości 10 średnik.

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:

Linia 1. float z znak równości 4 kropka 5f średnik. Linia 2. prawy ukośnik prawy ukośnik lub. Linia 3. float z znak równości 4 kropka 5F średnik prawy ukośnik prawy ukośnik pamiętamy o przyrostku przecinek inaczej program nie skompiluje się.

Analogicznie dla zmiennej przechowującej wartość logiczną:

Linia 1. boolean jestPelnoletni znak równości true średnik.

W celu sprawdzenia wartości logicznej przy pomocy zmiennej boolean, możemy napisać:

Linia 1. int x znak równości 4 średnik. Linia 2. int y znak równości 6 średnik. Linia 3. boolean czyJestWieksze znak równości x zamknij nawias ostrokątny y średnik.

Jeśli wypiszemy wynik do konsoli:

Linia 1. System kropka out kropka println otwórz nawias okrągły czyJestWieksze zamknij nawias okrągły średnik.

otrzymamy oczywiście false.

Ważne!

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.

RayoD5QMKY2tR
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Dla zainteresowanych

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.

Ciekawostka

Jeśli potrzebujemy zadeklarować wiele zmiennych tego samego rodzaju, możemy to zrobić w jednej linijce, np.

Linia 1. double wiek przecinek wzrost przecinek pensja średnik. Linia 3. prawy ukośnik prawy ukośnik zamiast. Linia 4. double wiek średnik. Linia 5. double wzrost średnik. Linia 6. double pensja średnik.

Może to skrócić kod o kilka linijek. Wartości oczywiście musimy przypisać do każdej zmiennej indywidualnie.

Ciekawostka

Jeśli musimy zadeklarować zmienną numeryczną o bardzo dużej wartości, to dopuszczalny jest zapis z użyciem znaku podkreślenia, np.

Linia 1. long duzaLiczba znak równości 2 podkreślnik 344 podkreślnik 334 podkreślnik 789L.

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ą:

Linia 1. int wiek znak równości 56 średnik.

następnie zmienimy ją na:

Linia 1. wiek znak równości 57 średnik.

i wydrukujemy metodą println();

Linia 1. System kropka out kropka println otwórz nawias okrągły x zamknij nawias okrągły średnik.

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ć:

Linia 1. int wiek znak równości 56 średnik. Linia 2. int wiek znak równości 57 średnik.

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:

RPagVN0aOQI57
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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:

Linia 1. final typDanych nazwaZmiennej znak równości wartość średnik.

Dla przykładu:

Linia 1. final double PI znak równości 3 kropka 14159 średnik.

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.

R1WsZPpjJd3lF
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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.

Linia 1. double x znak równości 6 średnik. Linia 2. double y znak równości 8 średnik. Linia 3. double z znak równości x plus y średnik. Linia 5. System kropka out kropka println otwórz nawias okrągły z zamknij nawias okrągły średnik. Linia 6. prawy ukośnik prawy ukośnik wydrukuje się 14 kropka 0.

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?

Linia 1. int liczba1 znak równości 45 średnik. Linia 2. double liczba2 znak równości 6 kropka 67 średnik. Linia 3. int wynik znak równości liczba1 prawy ukośnik liczba2 średnik prawy ukośnik prawy ukośnik prawy ukośnik minus operator dzielenia.

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ć:

Linia 1. int liczba1 znak równości 5 średnik. Linia 2. double liczba2 znak równości 6 kropka 67 średnik. Linia 3. double wynik znak równości liczba1 prawy ukośnik liczba2 średnik. Linia 4. prawy ukośnik prawy ukośnik wynik to dwukropek 0 kropka 7496251874062969.

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:

Linia 1. int liczba1 znak równości 5 średnik. Linia 2. double liczba2 znak równości 6 kropka 67 średnik. Linia 3. int wynik znak równości liczba1 prawy ukośnik otwórz nawias okrągły int zamknij nawias okrągły liczba2 średnik prawy ukośnik prawy ukośnik tu następuje jawna konwersja zmiennej liczba2 z double do int średnik. Linia 5. System kropka out kropka println otwórz nawias okrągły cudzysłów Wynik to cudzysłów plus wynik zamknij nawias okrągły średnik.

W konsoli ukaże się napis „Wynik to 0”.

Ważne!

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:

Linia 1. int liczba1 znak równości 5 średnik. Linia 2. double liczba2 znak równości 6 kropka 67 średnik. Linia 4. System kropka out kropka println otwórz nawias okrągły cudzysłów Wynik to cudzysłów plus liczba1 prawy ukośnik liczba2 zamknij nawias okrągły średnik.

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ę .

Ciekawostka

Zmiennym można również przypisywać wartości innych zmiennych:

Linia 1. int x znak równości 67 średnik. Linia 2. int y znak równości 89 średnik. Linia 3. y znak równości x średnik. Linia 5. System kropka out kropka println otwórz nawias okrągły y zamknij nawias okrągły średnik.

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ę:

Linia 1. int x znak równości 67 średnik. Linia 2. double y znak równości 56 kropka 7 średnik. Linia 3. y znak równości x średnik.

Java wykona rzutowanie rozszerzające (z int na double) na wartość x. Natomiast ten kod:

Linia 1. int x znak równości 67 średnik. Linia 2. double y znak równości 56 kropka 7 średnik. Linia 3. x znak równości y średnik.

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.

R72WY0DNMdjsV
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Aby program zadziałał, musielibyśmy wykonać jawną konwersję, czyli napisać w ostatniej linijce:

Linia 1. x znak równości otwórz nawias okrągły int zamknij nawias okrągły y średnik.

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

powrót karetki
powrót karetki

CRLF (CR, ang. carriage return + LF, ang. line feed) – ciąg dwóch znaków o wartościach ASCII równych (szesnastkowo ), oznaczający koniec bieżącej linii tekstu.

słowo kluczowe
słowo kluczowe

(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

statycznie typowany
statycznie typowany

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

wartość logiczna
wartość logiczna

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 „