JAVA Krátke poznámky: Vše je definováno ve třídách; Žádné funkce mimo třídy Skoro všetko je objekt, výnimka sú premenné (napr. int) Neexistuje operátor delete Rušenie objektov výlučne cez Garbage Collector Tesne pred deštrukciou objektu sa zavolá finalize, nie je to deštruktor, nie je záruka jeho zavolania Implicitní hodnoty Atributy: boolean – false, ostatní primitivní typy – 0, reference - null Pozor, lokální proměnné nejsou inicializovány – chyba při překladu Předávání parametrů – hodnotou, predávanie objektov cez referenciu Balík (package) – obdoba v C++ namespace "obdoba knihoven" každá třída patří do právě jednoho balíku příslušnost k balíku: package jmenoBaliku triedy z iného balíka: import jmenoBaliku.JmenoTridy balík java.lang je importován vždy Verejné a neverejné triedy Každá veřejná (public) třída – jeden soubor neveřejné třídy (bez public) – viditelné pouze ze svého balíku Priradenie: int x = 1 (opačne nejde) Primitivní typy – kopírování hodnoty (včetne String) Objekty – kopírování reference na objekt Přetečení a podtečení jsou „tichá“ – negeneruje se žádná výjimka max -> min pri pretečení a opačne Porovnanie rôznych referencií (aj keby tá istá hodnota) = vždy false int x1 = new Integer(7); // je tiež referencia, ale pri priradení kopíruje hodnotu
Logické operátory: skrátené aj neskrátené vyhodnocovanie (& vs. &&) Operátor čárka, jedine vo for cykle: for (int i=1,j=1; i<5; i++, j=i*10) Label, návestie: label: vnejsi-cyklus { vnitrni-cyklus { label; break label; }}
break;
continue;
continue
vždy má tvar: „označenie:“ (označenie, dvojbodka); za ním následuje cyklus slúži na riadenie vonkajších cyklov z cyklu vnútorného goto sa nepoužíva (rezervované slovo) Trieda [public] [abstract] [final] class Jmeno [extends Predek] [implements SeznamInterfacu] { ... }
maximálne 1 predok; interfaceov môže byť viac final – nelze vytvářet potomky final pre atribúty - po inicializácii nejde do nich nič priradiť konstruktor: modifikátor – pouze viditelnost (public / private / protected) více konstruktorů - různé parametry
konstruktor předka – super() jiný konstruktor stejného objektu - this() vždy se nejdřív volá konstruktor předka, i když není explicitně uveden static inicializátor: class MyClass { static int a; static { a = 10; } ... } ne-static inicializátor: class MyClass { int a; { a = 5; } ... } třída java.lang.Object – každá třída je jejím potomkem, jediná třída která nemá předka public / protected / private Public: viditelné odkudkoliv (pokud je viditelná i třída) Protected: viditelné ve stejném balíku a v potomcích Private: viditelné jen ve třídě, kde jsou definovány Bez uvedení: viditelné ve stejném balíku Není modifikátor virtual - všechny metody jsou virtuální statické metody nejsou virtuální super - přístup k členům přímého předka; nelze použít super.super; Interface - pouze definice rozhraní, žádná implementace atributy musejí být inicializovány ( int a = 5; ); môžu aj dediť: interface Iface3 extends Iface1, Iface2 { ... } Třída musí implementovat všechny metody interface neplatí pro abstract třídy - nie je nutné implementovať všetky metódy abstraktnej triedy v abstraktnej triede už môžu byť metódy aj implementované statická inicializácia poľa: int[] a = { 1, 2, 3, 4, 5 } dynamická inicializácia poľa: int[] array = new int [10]; pole: vždy se kontrolují meze – nelze vypnout - ArrayIndexOutOfBoundException String: nemeniteľný + operátor spojování řetězců; jediný „preťažený“ operátor v Jave konštruktor napr. String(char[] value) equals pre porovnanie, nepoužívať „==“ ! Implementace metod se hledají dynamicky za běhu Abstraktní metody nesmí být static ani private a mohou být jen v abstraktní třídě boolean - není možné přetypovat: (int) true, (boolean) 1 ! Výnimky java.lang.Error – "nezotavitelné" chyby, neměly by se odchytávat, OutOfMemoryError java.lang.Exception - indikují zotavitelné chyby, lze je odchytávat, ArrayIndexOutOfBounds obaja potomci java.lang.Throwable pokud se výnimka dostane až do main() a není odchycena, způsobí ukončení interpretu Javy metoda, která může způsobit výjimku musí výjimku odchytit, nebo specifikovat typ výjimky pomocí throws, napr. IOException neplatí pre potomkov java.lang.Error a java.lang.RuntimeException java.lang.RuntimeException je potomok java.lang.Exception napr. ArrayIndexOutOfBoundException Reťazenie výnimiek reakce na výjimku jinou výjimkou
v některých případech jedna výjimka může potlačit jinou výjimku - to už nie je reťazenie try { ... } catch (Exception1 e) { ... throw new Exception2(e); }
Vvšechny primitivní typy v Javě kromě charu jsou signed a mají přesně daný počet bytů (napr. byte má 1B, int 4B) v metodě main(), parametr args[] obsahuje jen parametry, nikoliv jméno třídy nebo programu na pozici 0; na rozdiel od napr. C++ Unicode escape sekvence: \u0041 .... A prekladá sa ešte pred samotným prekladom zvyškú kódu Zápisy hodnôt atribútov; tzv. literály (napr. false), príklady: 1L = longový zápis 3.2e-4 double (čokoľvek s bodkou) 2.34f float 1234_5678 podtržítka sa ignorujú pri preklade Vnorené triedy vonkajšia môže vraciať referenciu na vnútornú instance vnitřní třídy může přistupovat ke všem položkám pre anonymnú triedu to funguje len, keď je vonkajšia final nelze vytvořit objekt vnitřní třídy bez objektu vnější třídy pri dedení od vnútornej triedy je nutné explicitne uviesť referenciu na vonkajšiu triedu, napr. class InheritInner extends Vonkajsia.Vnutorna { InheritInner(Vonkajsia xx) { xx.super(); } // konštruktor proste musí byť takto uvedený, inak chyba pri preklade }
statické vnitřní třídy nemají referenci na objekt vnější třídy => může mít statické metody a atributy nestatická vnitřní třída nemůže mít statické členy x ^= y; je bitový x xor y, prideliť do x Integer.MAX_VALUE
Threads hlavné vlákno je vždy main() možno vytvárať aj ďalšie; podpora priamo v jazyku Vytváranie nových vláken dědění od třídy java.lang.Thread předefinování metody void run(); vlákno se spustí zavoláním metody start() implementování interface java.lang.Runnable jediná metoda void run() - objekt ji implementuje vytvoření vlákna: new Thread(new myRunnable()).start() Metódy riadenia yield() - doporučenie pre pozastavenie vlákna, aby mohlo ísť iné vlákno sleep(int milis, int nanos) príp. len milis, musí ošetriť InterruptedException setPriority(int newPriority); int getPriority() => určovanie a získanie priority vláken, ide o konštanty (10=max, 5=normal, nemali by byť medzistupne...) setDaemon(boolean daemon); boolean isDaemon()
S každou instancí objektu je asociován jeden zámek; s každou třídou je asociován jeden zámek Synchronized ako modifikátor metody: chová se stejně jako příkaz synchronized vlákno než začne vykonávat metodu musí získat zámek na objektu static synchronized metody - získává se zámek asociovaný se třídou void wait() – lze volat jen pokud volající vlákno drží zámek na daném objektu vloží vlákno do fronty čekajících vláken; stratí zámok v tej chvíli notify() - "probudí" jedno (nějaké) vlákno z fronty čekajících (pokud není prázdná) void notifyAll() – probudí všechna vlákna ve frontě metoda sleep() neuvolňuje zámek! Zastavenie vlákna je deprecated (z iného vlákna) Skupiny vláken vlákna patří do skupiny vláken třída ThreadGroup skupina vláken může obsahovat jak vlákna tak další skupiny vláken java object equals; hashCode() - tu platí, čo má rovnaký equals, má rovnaký hashCode; metóda toString(); Kolekce ~ objekt obsahující jiné objekty Collection<E> – skupina jednotlivých prvků List<E> drží prvky v nějakém daném pořadí Set<E> každý prvek obsahuje právě jednou Map
skupina dvojic klíč–hodnota metódy, napr. add(), contains(), clear(), isEmpty(), size() pro každý druh kolekce existuje alespoň jedna implementace (napr. ArrayList, LinkedList pre List<E>) Kolekce nemusí přímo podporovat přístup k prvkům => iterátor Iterator<E> iterator(); E next(); boolean hasNext(); void remove();
Většina kolekcí není bezpečná vůči vláknům java.util.Arrays - pre prácu s poliami void sort(typ[] arr, int from, int to);
enum „normální“ třída má atributy, metody, i metodu main potomek třídy java.lang.Enum vlastný konštruktor, ale volanie iné (nie pri new) public enum Color { BLUE, RED, GREEN } public Color clr = Color.BLUE;
implementácia: class Color { private int value; public static final public static final public static final protected Color(int value = v;
Color RED = new Color(0); Color GREEN = new Color(1); Color BLUE = new Color(2); v) {
} }
Príklad s „planétami“: public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6); private final double mass; private final double radius; Planet(double mass, double radius){ this.mass = mass; this.radius = radius; } }
Priradenie - jednoduché: Planet pl = Planet.EARTH;
Príklad s metódou v enum-e: double eval(double x, double y){ switch(this) { case PLUS: return x + y; case MINUS: return x - y; ...
Dosiahnuteľnosť: { int x=10; // dosazitelne je x { int y=11; // dosazitelne je x i y } // dosazitelne je pouze x }