następny punkt »

1. Pojęcie typu. Typy pierwotne

Działanie każdego programu polega na przetwarzaniu danych. Dane są zapisywane w pamięci komputera. Aby kompilator mógł właściwie stworzyć odpowiedni kod binarny, który m.in. specyfikuje w jaki sposób dane są zapisywane w pamięci, ile zajmują miejsca, w jaki sposób są wykonywane operacje na danych, każdej jednostce danych trzeba przypisać typ.

Typ danej - to zbiór jej możliwych wartości plus zestaw operacji, które można nad nimi wykonywać.
Jednocześnie określa on rozmiar pamięci, potrzebny do przechowania danej oraz sposób zapisu danej w pamięci komputera

Np. dane typu całkowitoliczbowego mogą przybierać wartości całkowitoliczbowe z jakiegoś przedziału, który zależy od tego ile miejsca w pamięci zajmują dane tego typu oraz jak są w pamięci zapisywane. Określone są też operacje, które możemy wykonywać na tych danych: np. dodawanie, mnożenie, dzielenie, reszta z dzielenia oraz sposób w jaki te operacje są wykonywane.

Jak wiemy, dane w programie przedstawiamy za pomocą literałów i zmiennych oraz stałych.
Zatem typy dotyczą wartości zmiennych, stałych i literałów.
Mówimy: zmienna typu ..., stała typu ... literał typu ...

A ponieważ wyrażenia budowane są ze zmiennych, stałych, literałów i operacji na nich (definiowanych przez operatory) oraz z wywołań funkcji (metod) - to wyniki opracowania wyrażeń też mają określony typ (nt wyrażeń zobacz wykład 2 oraz koniec tego wykladu).

Typy mają swoje nazwy.
W języku istnieje szereg tzw. typów pierwotnych, których nazwy stanowią zarezerwowane słowa kluczowe języka.

Nazwa
typu

Liczba bajtow

Dopuszczalne
wartości

Znaczenie

byte

1

-128...127

liczby całkowite




short

2

-32768...32767

int

4

-2147483648... 2147483647

long

8

-9223372036854775808.
...9223372036854775807

float

4

-3.4028234663852886E38...
...-1.401298464324817E-45

1.401298464324817E-45...
...3.4028234663852886E38

liczby rzeczywiste


double

8

-1.7976931348623157E308...
...-
4.9E-324

4.9E-324...
...1.7976931348623157E308

char

2

0...65556

znaki Unicodu

boolean

1

true | false

wartości logiczne:
prawda lub fałsz


Przy okazji przedstawiania typów kilka słów powiemy o niektórych operacjach w których mogą brać udziała dane tych typow. Więcej na ten temat pod koniec wykładu

Typy byte, short, int, long, float, double i char nazywane są typami liczbowymi lub numerycznymi, ponieważ dane tych typów reprezentują liczby.

W szczególności znaki (typ char) reprezentowane są przez ich liczbowe, nieujemne całkowite, kody (zatem są nieujemnymi liczbami całkowitymi). Istnieją różne systemy kodowania znaków, np. kod ASCII zawiera 256 kodów znaków (liczby od 0 do 255). W Javie używany jest tzw. Unicode, który okresla 65557 kodów znaków (nie wszystkie sa jeszcze zdefiniowane), dzięki czemu można przedstawić znaki niemal wszystkich języków (np. uproszczonego chińskiego).
Wartości typów liczbowych są używane w operacjach arytmetycznych, a wartości typu char dodatkowo stanowią elementy łańcuchów znakowych (napisów).
Operacje arytmetyczne, zapisywane za pomocą operatorów, to: dodawanie (+), mnożenie (*), odejmowanie (-), dzielenie (/). zwiększanie o 1 (operator ++) oraz zmniejszanie o 1 (--). W przypadku liczb cłakowitych operacja dzielenie jest dzieleniem całkowitoliczbowym (a więc zwraca wynik dzielenia po odrzuceniu części ułamkowej np. 1/3 "tak naprawdę" równe jest jedna trzecia, ale wynikiem tego wyrażenia będzie 0, gdyż biorą w nim udział dwie liczby całkowite i mamy tu dzielenie całkowitoliczbowe). Dla liczb całkowitych okreslona jest ponadto operacja reszty z dzielenia (operator %).
Na wartościch typów numerycznych możemy również wykonywać operacje porównania, <=, == (równe?), != (nie równe?).

Typ boolean (nazywany typem logicznym, orzecznikowym, boolowskim) służy do przedstawiania wartości logicznej o znaczeniu prawda lub fałsz. Wartości tego typu są używane w wyrażeniach logicznych, są też ich wynikiem, jak również są wynikiem wyrażeń relacyjnych. Mogą być również wykorzystywane bezpośrednio w instrukcjach sterujących (jako warunki).
Np. wyrażenie a > b będzie miało wartość typu boolean stwierdzającą czy wynik porównania jest prawdziwy czy fałszywy. Wyrażenie logiczne " x i y ", zapisywane w Javie jako x && y będzie składniowo poprawne tylko wtedy, gdy x oraz y są typu boolean, a jego wartośc będzie wartością typu boolean, stwierdzającą czy predykat "x i y" jest prawdziwy czy nie.


Wszystkie inne dane (poza liczbami, wartościami logicznymi oraz jednym wyjątkiem, o którym za chwilę) są w Javie traktowane jako obiekty, których atrybuty (a zatem możliwe "wartości" danych) oraz funkcjonalność (możliwe operacje na danych) definiują określone klasy.
W pewnym uproszczeniu nazwę klasy można w tym przypadku traktować jako nazwę typu danego obiektu.

W standardowym zestawie klas Javy występuje np. klasa String. Definiuje ona wspólne własciwości i funkcjonalność obiektów, będących łańcuchami znakowymi (napisami).
Np. każdy łańcuch znakowy ma długość, niepuste łańcuchy znakowe mają znaki, obiekty klasy String są obowiązane "świadczyć usługi" polegające np. na odpowiedzi na nasze pytania: jaka jest długość łańcucha? czy łańcuch zawiera podany ciąg znaków? itp. - co możemy traktować jako pewne operacje na łańcuchach znakowych.


 następny punkt »