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