czwartek, 5 czerwca 2014

Typy danych i operacje na nich

Java jest językiem programowania:
- o statycznie określonym typie (statically typed) tzn. że wartość zmiennej bądź wyrażenia ma już określony typ w momencie kompilacji (w językach dynamicznie typizowanych typ zmiennej bądź wyrażenia może zostać dopiero określony w momencie przypisania wartości bądź obliczenia wartości wyrażenia, w więc podczas wykonania programu)
- o ściśle określonym typie (strongly typed), gdzie typ:
   * ściśle określa zakres zawartości jakie zmienna może przechowywać, bądź wyrażenie mieć (np: zakres wartości typu byte to <-128;127>
   • ściśle określa zbiór operacji jakie mogą być wykonywane (np: operator - nie jest zdefiniowany dla łańcuchów znaków)
   • oraz oznaczenie tych operacji (np: operator + dla liczb całkowitych i łańcuchów znaków)

W języku Java istnieją tylko dwa rodzaje typów wartości:
  - proste (primitives)
  - referencje (references)
Dodatkowo istnieje jeden specjalny typ którego nazwa nie jest określona (ale mówi się o typie null):
  - typ wyrażenia null
  - ponieważ typ wyrażenia null nie ma nazwy, więc nie można
    • tworzyć zmiennych takiego typu
    • rzutować na ten typ
  - referencja null jest jedyną wartością jaką posiada wyrażenie typu null
  - referencja null może być rzutowana na referencję do dowolnego typu


Typy proste (primitive types) są predefiniowane w języku Java, a nazwy są słowami kluczowymi
  - nie można tworzyć identyfikatorów o takich nazwach


Typ logiczny boolean

Ten typ reprezentuje wartość logiczną o dwóch wartościach:
- prawda (true)
- fałsz(false)
Operatory dla typu boolean to:
- porównania (equalilty) == i =
- logiczne zaprzeczenie (logical complement) !
- logiczne & (AND), ^ (XOR), | (OR)
- warunkowe && (AND i || (OR)
- warunkowy operator ?:
- operator konkatenacji + dla typu String
Właściwości:
• Nie istnieją żadne konwersje z typu boolean do typów numerycznych i na odwrót
• Jedynym możliwym sposobem "konwersji" z typu numerycznego do typu boolean jest wykonanie operacji x!=0
• Jedynym możliwym sposobem "konwersji" z typu referencja do typu boolean jest wykonanie operacji x!=null
• Operator konkatenacji + dla String
  - jeżeli jednym z argumentów operatora + jest typ String to następuje automatyczna konwersja wartości typu boolean do jego reprezentacji jako String, tzn: "true" albo "false" w zależności od jego wartości logicznej
• Operator & zwraca wartość prawda jeżeli oba argumenty mają wartość prawda i zwraca fałsz w pozostałych przypadkach
• Operator | zwraca wartość fąłsz jeżeli oba argumenty mają wartość fałsz i zwraca prawda w pozostałych przypadkach
• Operator ^ zwraca wartość prawda jeżeli wartości argumentów są różne i zwraca fałsz w pozostałych przypadkach
• Warunkowy operator && działa jak & z tym, że wartość prawego argumentu nie jest obliczana, gdy lewy ma wartość fałsz
• Warunkowy operator || działa jak | z tym, że wartość prawego argumentu jest obliczana tylko wtedy, gdy lewy ma wartość fałsz
Literał stanowi reprezentację wartości typu prymitywnego, łańcucha znaków (String) bądź typu null w kodzie źródłowym programu
W Java wyróżnia się następujące typy literałów:
  - Liczby
    • całkowite
    • zmiennoprzecinkowe
  - wartości boolowskie
  - znaki
  - łańcuchy znaków
  - null
Typ boolean ma tylko dwie wartości reprezentowane przez literały:
  - true - odpowiada wartości logicznej prawda
  - false - odpowiada wartości logicznej fałsz
Literał boolowski ma zawsze typ wartości boolean

Typy numeryczne całkowite:
  - byte: 8-bitowa liczba całkowita ze znakiem
  - short: 16-bitowa liczba całkowita ze znakiem
  - int: 32-bitowa liczba całkowita ze znakiem
  - long: 64-bitowa liczba całkowita ze znakiem
  - char: 16-bitowa liczba całkowita bez znkau reprezentująca jednostkę kodową UTF-16
Zakres liczb całkowitych ze znakiem to:
  - byte: 8, [-128;127]
  - short: 16, [-32768;32767]
  - int: 32, [−2147483648;2147483647]
  - long: 64, [−9223372036854775808;9223372036854775807]
Zakres licz całkowitych bez znkau to:
  - char: 16, ['\u0000';'\uffff'] (tzn: [0;65535])
Operatory działające na typie całkowitym:
• Operatory porównania - wartość wyrażenia boolean <, <=, >=, >, ==, !=
• Operatory numeryczne - wartość wyrażenia int lub long
  - jedno-argumentowe: + - (-x)
  - multiplikatywne: * / % (np: x*y; x/y; x%y)
  - addyktywne: + - (np: x+y; x-y)
  - inkrementujący ++ z prefiksem i sufiksem (np: ++x; x++)
  - dekrementujący -- z prefiksem i sufiksem (np: --x; x--)
  - bitowe przesunięcie ze znakiem i bez << >> >>>
  - bitowa negacja ~(not)
  - bitowe operatory logiczne & (AND), | (OR), ^ (XOR)
  - operator warunkowy ?:
• Operator rzutowania - konwertuje liczbę całkowitą na dowolny typ numeryczny
• Operator konkatenacji + dla Sting
  - Jeżeli jednym z argumentów operatora + jest typ String to następuje automatyczna konwersja argumentu typu całkowitego do jego reprezentacji jako String w formacie dziesiętnym. Wynikiem działania operatora jest nowy String będący połączeniem argumentów operatora +
Właściwości:
• Jeżeli przynajmniej jeden z argumentów operatora numerycznego (z wyjątkiem przesunięcia bitowego) jest typu long, to operacja przeprowadzana jest z 64 bitową precyzją i wynikiem jest wartość typu long. Jeżeli drugi z argumentów nie jest typu long, to jest on rozszerzany do typu long (tzw. numeryczna promocja)
• W każdym innym przypadku operacje przeprowadzane są z 32 bitową precyzją w wynikiem jest wartość typu int. Jeżeli którykolwiek z argumentów nie jest typu int, to jest on rozszerzany do tego typu
• Każda wartość typu całkowitego może być rzutowana na dowolny typ numeryczny. Nie ma rzutowania na typ boolean, jak to jest w niektórych językach programowania np C++
• Operatory całkowite nie wykazują w żaden sposób przekroczenia zakresów (overflow, underflow)
• Operator całkowity może być źródłem wyjątku w następujących przypadkach:
  - kiedy wymagana była operacja odpakowania (unboxing), a jej wynikiem było null - NullPointerException
  - kiedy prawym argumentem operatora / lub % jest wartość 0 - ArithmeticException
  - operatory inkrementacji i dekrementacji mogą powodować wyjątek OutOfMemoryError w przypadku wykonywania opakowania (boxing) a nie ma wystarczająco dożo pamięci do jej wykonania

Typy numeryczne zmiennopozycyjne:
  - float: 32-bitowa liczba zgodna z IEEE754
  - double: 64-bitowa liczba zgodna z IEEE754

Operator /:
• Dla liczb całkowitych mamy do czynienia z dzieleniem całkowitym, tzn. wynikiem jest liczba będąca częścią całkowitą z dzielenia (zaokrąglenie w kierunku 0)
• Jeżeli dzielna i dzielnik są liczbami niezerowymi różnych znaków to wynik jest ujemny. Jeżeli są tych samych znaków to wynik jest dodatni z jednym wyjątkiem
  - dzielenia najmniejszej liczby ujemnej (wartość dowolnego zakresu danego typu całkowitego: int bądź long) przez -1. W tym przypadku wynikiem jest najmniejsza liczba ujemna

Operator %:
• Operator % to reszta z dzielenia całkowitego: 3 % 2 ->1
• Działa on na takiej zasadzie, że: (a/b)*b+(a%b)=a
• Oznacza to, że wynik może być:
  - dodatni tylko wtedy, gdy dzielna jest dodatnia
  - ujemny tylko wtedy, gdy dzielna jest ujemna
• Dla przykładu:
8%5 ->3
-8%5 -> -3
8%-5 -> 3
-8%-5 -> -3

•• 

Identyfikatory

Identyfikator to dowolnej długości ciąg znaków składający się z liter i cyfr, przy czym pierwszym znakiem musi być litera i ciąg znaków. Identyfikator nie może tworzyć: słowa kluczowego, literału typu boolean i literału typu null.

Za literę Java uznaje się znak Unicode spełniający kryterium:
- Character.isJavaIdentifierStart(int), np:
   • znak ASCI o kodach \u0041-\u005a ('A'-'Z')
   • znak ASCI o kodach \u0061-\u007a ('a'-'z')
   • znaki: \u005f ('_') i \u0024('$')

Pozostałe znaki muszą spełniać kryterium:
- Character.isJavaIdentifierPart(int), np:
   • są literami Java
   • są cyframi Java - znaki ASCI o kodach \u0030-\u0039 ('0'-'9')

W identyfikatorach, z uwagi na czytelność kodu, NIGDY nie stosujemy znaków '$' bądź '_'

W wielu językach programowania dopuszczalne są pewne konstrukcje, które z punktu widzenia stylu programowania są wręcz zabronione

W programowaniu najważniejsza zawsze jest czytelność kodu, chyba że ktoś chce specjalnie uczynić kod mało czytelnym - ale do tego są specjalne narzędzia (code obfuscation)

Wielkość znaków ma znaczenie - nie wykorzystujemy tego, aby tworzyć zmienne o nazwach brzmiących tak samo

Nie zaleca się stosowania narodowych znaków diaktrycznych, mimo że jest to możliwe (to też litery)

Przykładowe poprawne identyfikatory:
int variables = 10;
boolean false = false;
Float realNumber = null;
char cAmEl = '\u0041';
long _123456 = 123456;
String Ładne_dęby = "Ładne dęby";

Przykładowe błędne identyfikatory:
short short&y = 12;
long 654_321 = 654321;

Wersje Javy

Java SE (Standard Edition) - platforma ogólnego przeznaczenia, dedykowana to tworzenia i uruchamiania aplikacji użytkownika końcowego

Java EE (Enterprise Edition) - platforma rozszerzona w stosunku do Java SE o sieciowy serwer aplikacji, dedykowana do tworzenia i uruchamiania aplikacji biznesowych

Java ME (Micro Edition) - platforma dedykowana do tworzenia i uruchamiania aplikacji uruchamianych w warunkach ograniczonych zasobów (urządzenia mobilne, przemysłowe, itp)

Java FX - platforma dedykowana do tworzenia i uruchamiania aplikacji tzw. bogatych (rich) aplikacji internetowych


Platformę Java SE można pobrać w dwóch postaciach:
  - JRE (Java Runtime Environment) - przeznaczona wyłącznie do uruchamiania programów w języku Java
  - JDK (Java Development Kit) - przeznaczona do kompilowania i uruchamiania programów w języku Java, zawiera JRE


Podczas instalacji w systemie windows należy pamiętać o zmiennych systemowych:
  - JAVA_HOME
  - PATH

Polecenia:
java -version wypisuje wersję Javy
java -help pomoc
java -verbose szczegółowe komunikaty podczas uruchamiania