Sierpień 2, 2018

Typy danych

Typy danych

Po zapoznaniu się czym są zmienne oraz stałe, może pójść krok dalej czyli do typów danych, które są potrzebne podczas deklarowania (lub inicjalizacji) zmiennych i stałych.

Czym są typy danych?

Na początku warto wspomnieć, że języki programowania można dzielić na dwa typy: języki statycznie i dynamicznie typowane.

Java jest językiem statycznie typowanym, oznacza to, że podczas deklaracji zmiennych, stałych, metod musimy powiedzieć kompilatorowi co będziemy przechowywać w pod tą zmienną.

Tak jak wspomniałem są również języki dynamicznie typowane, bardzo popularnymi językami z tej kategorii są Javascript i PHP – tam podczas działania programu typy danych są przypisywane na podstawie dostarczonych wartości.

Co rozumieć przez typy danych?

Tak jak wspomniałem wyżej Java jest językiem statycznie typowanym i to naszym obowiązkiem jest powiedzenie kompilatorowi co będziemy przechowywać pod tą zmienną – czy będą to liczby, znaki, a może obiekt człowiek? Wszystko zależy od nas – to my musimy zdecydować podczas deklaracji zmiennej.

Zmienne mogą, więc mieć typ prymitywny lub typ obiektowy – może to być jakikolwiek typ, który stworzymy podczas tworzenia interfejsu lub klasy (ale o tym później). Teraz zajmiemy się podstawami – czyli prymitywami.

Typy prymitywne

Typy prymitywne oznaczają typy, które są już wbudowane w język Java – najbardziej podstawowe, których używa wirtualna maszyna.

Typy prymitywne można podzielić na typy całkowite, zmiennoprzecinkowego, znakowy i boolean (prawda/fałsz).

Każdy typ sluży do innego, nawet po nazwach można się domyśleć co każdy z typów przechowuje – ale tak naprawdę po co nam takiego kategoryzowanie?

Większy problem…

Typy nie zostały wprowadzone bez powodu – wprowadzę tutaj trochę teorii. Wszystkie operację są wykonywane przy pomocy procesora, który operuje na dwóch stanach: wysoki (1) i niski (0). Mamy tylko do wykorzystania 32 bity lub 64 bity (z grubsza mówiąc). Musimy teraz zapisać nasze wartości właśnie na tych bitach – aby to zrobić wprowadzono typy danych.

Typy danych zostały stworzone po to, aby konkretne wartości zapisywać w komputerze w określony sposób (jak najbardziej optymalny – zajmując jak najmniej miejsca) np. liczby całkowite i zmiennoprzecinkowe są całkowicie zapisywane w inny sposób – jeżeli chcesz się dowiedzieć o tym więcej to można zajrzeć chociażby na wikipedię.

Dlatego mówiąc o typach danych nie mówimy tylko o tym jaki typ się tam kryję, ale również z jakiego przedziału wartości może przyjmować – liczba zmiennoprzecinkowa może być dłuższa (nie większa!) od liczby całkowitej, ponieważ jest zapisana w inny sposób!

Mając już krótki zarys po co są wprowadzone typy danych możemy przejść do wyróżnienia ich.

Typy całkowite

Rozpocznijmy o najprostszych moim zdaniem typów czyli – typów całkowitych – liczb pozbawionych wartości po przecinku. Podczas tłumaczenia pierwszego typu wytłumaczę Ci oznacza zakres liczb oraz jak to jest liczone.

int

Oczywiście typ całkowity, najczęściej używany – jest zapisywany na 4 bajtach – co to oznacza?

Tak jak wspominałem liczby mogą być zapisywane na 32 lub 64 bitach, int jest zapisywany na 32 bitach. 1 bajt – 8 bitów.

Wykonując prostą matematykę możemy obliczyć ile liczb się zmieści na 4 bajtach: 232 co daje nam około ponad 4 miliardy.

Ze względu, że liczby są zapisywane w kodzie U2 (co pozwala zapisywanie liczb ujemnych i dodatnich) – połowa z nich to liczby ujemne, druga połowa to liczby dodatnie.

Ostatatecznie zakres dla int to: od -2 147 483 648 do 2 147 483 647 – liczby z takiego przedziału możemy przechowywać w incie.

int value = 10;

long

Trochę większy typ całkowity, ponieważ jest zapisywany już na 8 bajtach. Czyli możemy zapisywać już naprawdę duże liczby (choć czasami w realnych projektach może być to jeszcze za mało 😉 ).

Zakres liczby long mieści się: od 263 do 263-1 – daje nam to już spore liczby. 😉

Podczas inicjalizacji zmiennej typu long trzeba pamiętać o sufiksie „l” lub „L”.

long value = 16l;
final long age = 21L;

short

Typ całkowity – już tylko 2 bajtowy – zapisywany jest, więc tylko na 16 bitach.

Zakres liczby short mieści się: od -32768 do 32767

short height = 182;

byte

Najmniejszy typ, w którym możemy przechowywać liczby całkowite – zajmuje on tylko 1 bajt – 8 bitów.

Zakres można obliczyć szybko nawet samemu w pamięci: -128 do 127.

byte weight = 85;

Liczby zmiennoprzecinkowe

O ile wartości liczb całkowitych są po prostu kodowane na 32/64 bitach to w przypadku liczb zmiennoprzecinkowych jest to robione inaczej – dlatego nie będzie można już w łatwy sposób obliczyć zakres liczb. W tym artykule można poczytać w jaki sposób są kodowane liczby zmiennoprzecinkowe w sprzęcie.

W przypadku liczb zmiennoprzecinkowych mamy do czynienia z dwoma typami.

float

Mniejsza wersja liczb zmiennoprzecinkowy, ponieważ jest zapisywana na 4 bajtach.  W przypadku liczb zmiennoprzecinkowych raczej mówimy o precyzji, a nie o zakresie.

W przypadku liczby typu float precyzja jest do 6-7 miejsc po przecinku.

Podczas inicjalizacji float musimy zadbac o sufiks „f” lub „F”.

final float pi = 3.14f;
float value = 5.41F;

double

Wyróżnamy jeszcze jeden typ prymitywny zmiennoprzecinkowy – tzn. double. Double jest wykorzystywany, gdy potrzebujemy większej precyzji liczb zmiennoprzecinkowych – w końcu jest zapisywany na 8 bajtach.

Precyzja liczby double jest do 15 cyfr po przecinku.

Podczas inicjalizacji double musimy zadbać o sufiks „d” lub „D”.

double value = 1.24d;
final double weight = 84.3D;

Typ znakowy – char

Możemy korzystać z jednego typu prymitywnego znakowego jakim jest char. Char oznacza po prostu znak.

Podczas inicjalizacji znaku wpisujemy po prostu znak w pojedynczych cudzysłów.

char characterA = 'a';
final char characterB = 'b';

Choć rzadko korzysta się z char to warto o nim wiedzieć – w przypadku zwykłego developmentu używa się ciągów znakowych tzn. klasy String – lecz ta klasa nie jest już typem prymitywnym, jest ona zbudowana właśnie na tablicy charów (wielu elementach char).

Typ boolean

Do naszej dyspozycji mamy jeszcze oddany typ boolean, które przyjmuje tylko dwa stany – tak jak robi to bit w komputerze.

Typ boolean tak jak wspomniałem może przyjmować tylko dwa stany, są to: true oraz false – pozwala nam on przechowywać np. wyrażeń logicznych, o których będę mówił w kolejnych lekcjach.

boolean isMale = true;
final boolean isFemale = false;

Zadania

1. Na podstawie tych teoretycznych wywodów przychodzi mi jedno zadanie jakie możesz wykonać – sam spróbuj zainicjalizować zmienną z użyciem każdego typu danych na podstawie danych, które podaję poniżej. Pamiętaj o zakresach liczb, nie bez powodu Ci podawałem jakie liczby mieszczą się w danych typach. Pomyśl czy nie warto niektórych zmiennych zastąpić stałymi?

age = 34
value = 3000423111
pi = 3.1415
e = 2.7182818284590
isMale = true
weight = 85
letterA = 'a'

2. Do zmiennych z odpowiednim typem przypisz następujące wartości: 35, 43.4, a, true, b, false, 95.4, 30120320323, 2.8123123123, 33.

Przykładowe rozwiązania zadań możesz znaleźć tutaj.

Podsumowanie

Po tej lekcji powinieneś znać typy prymitywne jakie występują w języku Java oraz choć trochę kojarzyć ich zakresy i precyzję. Jeżeli inicjalizacja zmiennych oraz stałych przychodzi Ci już bez problemu to możemy przejść do kolejnej lekcji tzn. wprowadzania wartości z klawiatury.