270 likes | 389 Views
Pro č Java. jednotný , univerzální jazyk ( n e však vhodný pro cokoli ) definovaný specifikací: je to p ře dev ší m norma , pak i produkt y rozsáhlý, otevřený, rozvíjející se , s návaznými technologie mi právně chráněný normotvorný - zavádí řadu užitečných norem, uzancí a přístupů
E N D
Proč Java • jednotný, univerzální jazyk ( ne však vhodný pro cokoli ) • definovaný specifikací: je to především norma,pak i produkty • rozsáhlý, otevřený, rozvíjející se, snávaznými technologiemi • právně chráněný • normotvorný - zavádí řadu užitečných norem, uzancí a přístupů • expanzivní, od května 1995 vykázal nevídaný rozmach • velmi efektivní při tvorbě software • spolehlivý, robustní, velmi dobře dokumentovaný • portabilní, (Windows/Linux/Solaris ...) • bezpečný • deterministický - úlohy končí či havarují určitelným způsobem • silně objektový – avšak hybridní - obsahuje i primitivní typy • síťový • Internetový, internacionální a návazný na nativní platformu • multithreadový - více vláken (tj.úkolů) běží [ jakoby]současně • interpretovaný - s adaptací pro platformu ( JIT ) • vhodný pro úvod do objektového programování • zdarma C00
Java & IDE • Tvůrcem a vlastníkem práv je fa. Sun Microsystems a Oracle, která vydává JavaSE, JavaEE, JavaME a další produkty po verzích - zdarma stáhnutelné z: http://java.oracle.com/ resp. http://www.netbeans.org 1.0.2 – 1995, 1.1 – delegační model událostí, 1.2 – JFC, 1.3, 1.4 - assert • 1.5 - 2004:rozšíření jazyka: for, enum, autoboxing, generika, anotace • 1.6- 2006: rozšíření API, • 1.7 - 2011:rozšíření čísla, switch, try, catch, diamond • 1.8-2014: funkcionální interfejsy, ->, :: , default, lambdavýrazy • jre - Java Runtime Environment ( bez vývojových prostředků ) • obsahuje JVM alenikoli IDE,databázi či aplikační server. • S Javou lze pracovat velmi nepohodlně řádkově s programy v jdk1.8**/bin/ • javac A.java B.java ... kompilace zdrojů .java na .class • java A běh aplikace dané třídy • appletviewer A.htmltesterapletů • javadoc … tvorba dokumentace, tzv. docletů v html či velmi pohodlně a bezpečně ve vyspělých IDE: • Netbeans – 8.0April 2014 • Eclipse - IBM, JBuilder-Borland, IntelliJIDEA - JetBrains... C00
Podpora Javy Sun Microsystems velmi podporuje Javu tím, že vydává: • různé softwarové svazky – ke stažení a instalaci lze doporučit: http://java.sun.com/javase/downloads/index.jsp • ke každé hlavní verzi dokumentaci ve formě html stránek. Ta obsahuje zejména popis API, který je radno připojit nerozzipovaný IDE. Viz: http://java.sun.com/docs/ http://download.oracle.com/javase/7/docs/ • tématické tutoriály: http://java.sun.com/docs/books/tutorial/index.html http://java.sun.com/docs/books/jls - Java specification 3rd edition popisuje i verze >= 1.5 Zakhour, S. et al.: Java 6 výukový kurz, Computer Press, Brno, 2007, s. 534,ISBN 978-80-251-1575-6 http://www.saeedsh.com/resources/Thinking%20in%20Java%204th%20Ed.pdf C00
Dodržujte jmenné konvence Prosté jméno je posloupnost znaků UNICODE:písmen, $ _ číslic jež nezačíná číslicí a není klíčovým slovem. Jména voltemnemotechnická, nejlépe z kódu ASCII a anglická. S dolarem a podtržítkem šetřte : dolar se užívá v automatické generaci kódu, podtržítko ve víceslovných konstantách. Kvalifikované jméno obsahuje uvnitř také tečky. UJmenSloženýchZVíceslovDodržujteVelbloudíKonvenciKvůliČitelnosti. package (balíček) - jen malá písmena, číslicea tečka, např.: projekt1projekt2.util java.util.zip class (třída) - a její konstruktory - podstatné jméno začínající velkým písmenem, např.: String FileInputStream BankAccount Rectangle2D.Double - pro vnořené či vnitřnítřídy Třídy výjimek / chyb vyznačujte sufixem Exception / Error, např.: MySpecialException CommonStrangeError C00
Dodržujte jmenné konvence interface(rozhraní) - přídavné jméno začínající velkým písmenem, ( což se přetěžko hledá a dodržuje ) např.: Comparable Serializable Cloneable Runnable Readable Iterable AutoCloseable Scrolable method (metoda) - sloveso začínající malým písmenem, např.: reset( ) getX( ) parseDouble( ) compareTo( ) vrací-li typ boolean, vhodný je prefix is nebo has isLetterOrDigit( ) hasNextElement( ) variable (proměnná) – podstatné jméno začínající malým písmenem: j counter totalTax currentFrequency final variable (konstanta) a návěští: - jen velká písmena, číslice a podtržítka, např.: PI MAX_VALUE POINT_123 CYCLE3 Bezejmenné jsou: hodnoty, výrazy, příkazy, objekty. C00
Primitivní typy ( 8+1 ) Typ Formát Obalové (wrap) třídy bit Celá čísla - dvojkový komplement se znaménkem byte8-128 … 127Byte short16-32768 … 32767Short int32-2147483648 … 2147483647 (2.1E+9 = 2.1 miliard) Integer long64-9223372036854775808 … 9223372036854775807Long (9.2E+18 = 9.2 trilionů /EU = 9.2 quintillions /US) char16znaky Unicode '\u0000‘ … '\uffff' ~ 0 ... 65535Character jsou v dvojkovém kódu bez znaménka "Reálná" čísla -dle normy IEEE 754 float322-149… ( 2-2-23 )*2127, +/-0.0F, pos/neg Infinity, NaN Float Float.MIN = +1.4E-45 Float.MAX =3.4028235E+38 double642-1074… ( 2-2-52 )*21023, +/-0.0, pos/neg Infinity, NaN Double Double.MIN = +4.9E-324 Double.MAX =1.7976931348623157E+308 boolean?true falseBoolean void pomocný prázdný typ Void C00
Konverze primitivních typů Primitivní typy jsou vzájemně nekompatibilní, ale jejich hodnoty lze převádět. 8 rozšíření ( widening ) znaménkový bit 0je + 1 je- se rozšiřuje byte zúžení ( narrowing ) přetypování odkrojí horní bity, znaménkem se stane nejvyšší z dolních char 16 16 short 32 int minimální aritmetika 64 long 32 float exp IEEE 754 mantissa (+127 ) 1 8 23 64 double exp IEEE 754 mantissa (+1023 ) 1 11 52 C00
Integrální aritmetika int a long 000..0111 7 n/0 či n%0způsobí ArithmeticException + Sudá čísla končí n nulami a jsou dělitelná 2n. znaménkový bit Lichá čísla končí jedničkou. pro lichá n<0 : n/2 != n>>1 důsledek: -1>> == -1 2 000..0010 1 000..0001 011..1111 MAX_VALUE overflow 000..0000 0 111..1111 100..0000 -1 MIN_VALUE -2 100..0001 111..1110 MIN_VALUE+1 MAX+1 -> MIN k * MAX -> - k k * MAX -> MAX-k+1 MAX * MAX -> 1 MIN-1->MAX MIN * k -> 0 MIN * k -> MIN MIN == - MIN MAX + MIN -> -1 MIN / -1->MIN 111..1101 -3 pro sudé k pro liché k 111..1001 -7 -8 chybné výpočty 111..1000 pro sudé k - negace: - n = ~ n + 1 pro liché k ~ inverze: 0 -> 1, 1 -> 0 -> true - samonegace: - n = n - inverze znaménka C00 Hádanky:n&-n, n&=n-1, n^=n&-n,
Numerické literály • Obsahuje-li literáljenčíslice a případně znaménko ukládá se jako int, se sufixem L jako long. Vyjadřuje jen celá čísla zapsána jako: dekadicky [ +| - ]10289 [ L] oktalově[ +| - ]000567 [ L] hexadecimálně [ +| - ]0x012DEF [ L] binárně [ +| - ]0b0101 [ L] Vložit hodnotu do typu byte či short lze jen s přetypováním, např.: byte b =(byte) 0xFF; // má hodnotu -1 . inti = b; // • Obsahuje-li literál tečku či exponent, ukládá se jakodouble. Sufix F či D vynutí typ float či double . Např.: 123.0, 0123., .5, +123.45, -00123e2, -123e2, 12300e-2, -123.0F , 0123.f, .5F, +123.45e+3F, 125D, -333fapod. • Písmena v literálech mohou být libovolně velká či malá. • Mezi číslice lze pro čitelnost vložit podtržítka, např: -10_289, 5.123_789, 0x0123_ABCD, 0b1111_11111__0000_0000 C00
Integrální a „reálná“ aritmetika Na hodnotytypuint,long,float a doublelzeužít operátory: ( Hodnoty typu byte,shorta charse převedou na typ int .) ++ -- inkrementace tj. přičtení 1, dekrementace tj. odečtení 1, + - * sčítání či unární plus, odčítání či negaci, násobení, Přetečení přitom se nijak nehlásí ! / % dělení, modulo tj. zbytek po dělení Jsou-li oba a operandyint,longdojde na integrální dělení ! Je-li dělitel integrálního dělení nula, dojde k vyjímce! Na hodnotytypuintalonglzeužít navíc operátory posunu a logické : << >> >>> aritmetické posuny a logický posun & | ^ ~ AND OR XOR INVERZE pobitech Operátory pro hodnotytypufloat a double: + - * / % • Nevyhazuježádné výjimky, avšakzahrnujetřispeciálníhodnoty: • NaN - Not a Number, tj. nečíslo nebo neurčitý výraz • POSITIVE_INFINITY NEGATIVE_INFINITY • S těmito hodnotami lze provádět další operace, avšakjiž nelze získat • opravdové číslo. Krom x != NaN je každé porovnání s NaN vždy false. HW HW HW HW HW C00
Další operátory HW =přiřazení += -= *= /= %= <<= >>=>>>= &= ^= |= aktualizace a pak přiřazení Např. pro inti = 0, i += 2 odpovídái= (int) (i+2) a tedyi+=2.9 je ekvivalentní i += 2. ++ -- inkrement/dekrementjako prefix/sufix, např.-- i / i++znamená aktualizace pak použití / použití pak aktualizace. << >> aritmetické posuny int/longo 0..31 / 63 bitů vlevo / vpravo, >>> logický posun vpravo ( zleva se přidávají nuly ) přičemžhodnotaposunu se maskuje 0b1_1111 / 0b11_1111 + zřetězení – je-li alespoň jeden z operandů řetěz instanceof - test referenčního typu vrací hodnotu boolean (type) - přetypování HW HW C00
Komparace Výsledkem porovnání je logická hodnota ( true, false ). • Porovnání primitivních typů: == != rovno, nerovno, > >= větší než, větší nebo rovno, < <= menší než, menší nebo rovno, <> - tzv. diamond, symbol generické inference ( vnesení ) nikoli != . Ku podivu lze ho psát i jako <> . • Test identity referenčních typů je pouhý test referencí: == !=nikoli hodnot objektů. Objekty, tj. jejich hodnoty, se porovnají metodami v patřičné třídě,typicky: boolean equals( Object o ) - java.lang.Object int compare( … o1, … o2 ) … dle typu 8 obalových tříd int compareTo( Object o ) - java.lang.Comparable int compare( Object o1, Object o2 ) - java.util.Comparator int compare( Object o1, Object o2, Comparator c ) - java.util.Objects C00
Bitové a logické operátory Bitové a logické unární operátory: sestupně podle priority: ! pro negaci typu boolean ~ pro bitovouinverzi celého čísla Logické binární operátory: • Operandy musejí být buď oba celočíselné anebo obaboolean. & pro AND,| pro OR , ^ pro XOR • Pro zkrácené vyhodnocení typůboolean: && pro AND, || proOR Je-li výsledekdán prvním operandem, zbytek výrazu se nevyhodnocuje. Pozor na vedlejší efekty, je-li dalším operandem např. volání metody. • Pozor na nizší priority && a || : false && true| true dá false false && true|| true dá true ( false && true) | true dá true HW C00
Ternární výraz je podmíněný - vrátí jednu ze dvou hodnot dle podmínky podmínka ? hodnotaProTrue : hodnotaProFalse • První operand musí být typu boolean. • Druhý a třetí operand mohou být různých typů. • Podmíněný operátor je zprava asociativní, tedy: • a ? b : c ? d : e ? f : g odpovídá a ? b : (c ? d : (e ? f : g)) Příklad užití: intabs( inti ) { return i >= 0 ? i : - i; } Object o = cond ? 1.23 : "ABC" ; System.out.print( cond ? new Thread( ) : "ABC" ); C00
Priorita a asociativita operátorů 1. ++ --++ -- unární operátory prefixní resp. sufixní • + - ~ ! (datový typ)unární operátory • * / % násobení, dělení, modulo • - +binární operátory, +také pro zřetězení • << >> >>> posunyaritmetické a posun logický • < > <= >= instanceof porovnáníprimitivních hodnot a typu • == !=primitivních i referenčních hodnot • &AND bitový, logický • ^ XOR bitový, logický • |OR bitový, logický • && AND logický zkrácený • ||OR logický zkrácený • ? ternární operátor primitivní či referenční hodnota • = += -= *= /= %= <<= >>=>>>= &= ^= |=s následným přiřazením kde: levá asociativita: a / b * c je ( a / b ) * c pravá asociativita: - ++ a je - ( ++a ), a = b = c je a = (b = c) C00
Složené přiřazovací operátory • += -= = /= = <<= >>= >>>= &= ^= |= • jsou zkratky zápisu, např. pro intresp. String s lze napsat výraz: • i += 2 místo i = i + 2 resp. s += “XYZ” místo s = s +“XYZ” • Hodnotou operace přiřazení je hodnota proměnné po provedeném přiřazení a proto je následující příklad chybný: double d; inti = d = 10; // Error: possible loss of precision: double, required int Java 8zavádí dalšísymboly: -> šipka („arrow token“) typová inference (vnesení, úsudek, vyvození) :: reference metod a konstruktorů C00
Vyhodnocení výrazu = 7 pořadí 1 2 3 4 5 6 7 x + 6 1 – / 1 5 1 – * 3 4 5 << 4 6 2 2 3 syntaktický strom Výrazy jen s literály a operátory vyhodnotí již kompilátor. se provádí v zásobníkovém automatu. Např. výraz: x = -1 + ( 2 << 3 ) * 4 / ( 5 – 6 ) infix forma x 1– 2 3 << 4 * 5 6 – / + = postfix forma (polish reversal) Zásobník (horizontální): x 1 – x –1 2 3<< x –1 16 4 * x –1 64 5 6 – x –1 64 –1/ x –1 –64 + x –65 = –65 a ulož do x C00
Použití obalových tříd • int iMax = Integer.MAX_VALUE;// zjištění max. hodnoty • int k = Integer.parseInt("123");//konverzeřetěz - číslo • String s = Integer.toHexString( k );// konverze do hexa • Integer i = new Integer( "123"); // konverzeřetěz - číslo • inti = Integer.compare( 3, 5 ); // komparace // obdobně pro typy byte,short,long • double dMax = Double.MAX_VALUE;// zjištění max. hodnoty • double x = Double.parseDouble("-123.45");// konverzeřetěz - číslo • boolean b = Double.isNaN(x);// test nanečíslo • inti = Double.compare( 3.0, 5.0 ); // komparace // obdobně pro typ float • char c =Character.toLowerCase('Z' );// převod znaku • boolean b = Character.isLetterOrDigit('@');// je to písmeno / číslice? • int i = Character.digit(''f", 16);// hexadec. hodnota znaku Tzv. autoboxing automaticky za/roz-baluje primitivní typy do/z příslušných obalových objektů, např.: Double dd=2.71; double d=dd; C00
Třídy pro matematické operace • Pro typy int, long, float a double třída java.lang.Math obsahuje statické funkce: abs, min, max, sqrt, cbrt, pow, exp, log, ceil, floor, random, sin, sinh, asin, tan, tanh, toDegrees, toRadians, hypot … a řadu dalších, jakož i významné konstanty PI=3.14… a E=2.71… • java.lang.StrictMath je identická strictfp – dodržuje přesně normu IEEE 754, byť by hardware umožňovalo více. • Pro čísla s libovolným rozsahem a přesností: • java.math.BigInteger - pro celá čísla • java.math.BigDecimal - pro desetinná racionální čísla • Výpočty se provádějí pouze metodami patřičných tříd - nikoli operátory. C00
Literály • Logický: true a false . • Typový: je typu Class a lze tedy přiřadit např.: Class x =int.class, int[ ].class,Point.class,Point[ ][ ].class, Comparable.class, apod. • Znakový: znak Unicodu v apostrofechnapř.: ' ' = 0x0020 = 32, '0' = 0x0030 = 48, 'A' = 0x0041 = 65, 'a' = 0x0061 = 97 Též pomocí escape chars: '\'''\\''\uCafe' ale: \n či \r\n. • Řetězový: posloupnost znaků Unicodu (i prázdná) v uvozovkách např.: "Abc123" "Řeřicha" "@" "" "My \uCafe\101 Tea\n " . Je to objekt typu java.lang.String a lze volat metody třídy String. • Escape chars (ASCII):\’ \" \\ \r \n \f \t \b \ooo \uhhhh pro: apostrof 0x27 = 39, uvozovku 0x22 = 34, backslash 0x2F = 47, carriagereturn (CR 0x0D), line feed (LF 0x0A), formfeed (FF 0x0C), horiz. tabulator (HT 0x09), backspace (BS 0x08), o - octal, h - hexadec C00
Unicode – viz www.unicode.org kóduje světové symboly na 16-ti bitech (čínské znaky na 21 bitech) takto: stránka_znak v rozsahu: 0x00_00 – 0xFF_FF (=0–65535), 00 – ASCII angličtina, 01 – Latin1 – jazyky románské, germánské, 02 – Latin2 – slovanské, ugrofinské, baltické, 03 – řečtina, 04 – kyrilice, 05 – arménština, hebrejština, 06 - arabština … E0 – F8ConScript Unicode Registry … F8D0 – F8FF klingonština (plaqaD) ASCII 7: 0x00_00 – 0x00_7F( = 0-127 ), 00-1F (=0-31) řídící znaky 20(=32)mezera binárně: 010_0000 … !"#$%&'()*+,-./ 30-39 (=48-57), číslice‘0’ – ’9’ binárně: 011_0000 - 011_1001 … :;<=>?@ 41-5A (=65-90), písmena ‘A’ – ’Z’ binárně: 100_0001 - 101_1010 … [\]^_` 61-7A (=97-122), písmena ‘a’ – ’z’ binárně: 110_0001 - 111_1010 …-7F {|}~ C00
Klíčová slova a reservované literály literály: logické: false true referenční: null typy:primitivní[8]: boolean byte shortintlong char float double řídící příkazy:if else for do while break continue switch case default return pro výjimky a chyby: throwtry catch finally assert operátory: instanceof newthis super strukturální: package import importstatic class enum interface extends implements modifikátory:přístupu:public protected friend se nepíše private atributů, metod, tříd: final static metod, tříd, interfejsů: abstract strictfp static metod: native void throws default* metod, bloků: synchronized atributů:transient volatile nefunkční: constgoto Toto rozdělení neodpovídá zcela přesně specifikaci Javy.* - Java 8 C00
Základní konstrukty (1/3) [public | protected | private ][ static ][ transient ][ volatile ]// pro atributy [final]typ [ [ ] ]id [= výraz ], id [= výraz ] , ...; // lokální var. s inicializací { příkaz; blok; definice ... ; příkaz; ... ; } // blok if ( podmínka ) příkaz1 [elsepříkaz2 ]// podmíněný příkaz podmínka ? výraz1 : výraz2 // ternární výraz pro true : false [návěští:]// jen před cykly while( podmínka ) příkaz do příkaz while ( podmínka ) ; for([ initList ] ; [podmínka ] ; [ modifList ] ) příkaz for([ final] typ elem // jen v cyklu : ( Iterable| pole ) ) příkaz typicky kolekce continue [návěští]; // jen v těle cyklu – přechod na test podmínky break[návěští]; // ukončenípříkazu cyklu, switch (v case, default) return[výraz];// jen v metodě, konstruktoru, inicializátorech C00 - metasymboly
Základní konstrukty(2/3) -switch ( index ) { // typ indexu:char, byte, short či int, enum, // Character, Byte, Short, Integer, String. [case k1 : [příkazy ] // k musí být konstantní výrazy různých case k2 : [ příkazy ]// hodnot typu int či enum konstanty case k3 : [příkazy ]// či typu String - ale ne obalenéhodnota ... ] [default : [ příkazy] ]//Nezávisle volitelné a kdekoli v pořadí [case k4 :[příkazy ] ... ] }//typ indexu indukuje typ konstant k - try [ (zdroj[ ; zdroj] … ) ]// zdroje musí být AutoCloseable {[ příkazy]} [ catch ([final]t1 [It2] … parm ) {[ příkazy]}// Ivertical bar catch ([final]t3 [It4] … parm ) {[ příkazy]}// značí alternaci ... ]// t musí být typu Throwable [ finally {[ příkazy] }]// nelze vynechat catch i finally C00
Základní konstrukty(3/3) -throw objekt// objekt typu Throwable - synchronized ( výraz ) blok // výraz musí referovat objekt - assert podmínka [ : výraz ] ; // kontrola podmínky - enum jméno {//výčtový typ ABC [ ( atributy ) ][ { metody } ] , DEF [ ( atributy ) ][ { metody } ] , GHI [ ( atributy ) ][ { metody } ] ; ... // další složky } - Class [<T>] = T.class // popisný objekt typu třídy C00
Syntaxe metod ( bez generiky ) // modifikátory metod konkrétní, nativní, abstraktní v libovolném pořadí : [public|protected|private] [ static ] [ final ] [synchronized][ strictfp] [public|protected|private] [ static ] [ final ] [synchronized]native [ public| protected]abstract ( returnTyp|void)jménoMetody ( [ [ final ] Typparm, … [ [final] Typ ... varargs]]) //formální parametry [ throwsThw1, Thw2, ... ] // stigma: seznam neřešených nehod // Vynechání varargs při volání se vytvoří patřičné pole nulové délky. { ... } // tělo konkrétní metody // pro návratový typ void může být tělo i prázdné ; // jenstředník pro abstracti native metody Příklad volání: jmenoMetody( x, y, z1, z2, z3 ); Vrácená hodnota musí být kompatibilní s návratovým typem metody. possible autoboxing C00
Důležité pojmy literál: ( literal ) sebevyjadřující konstantní hodnota proměnná: (variable) lokální (local variable) definována v metodě, konstruktoru, inicializátoru parametr – lokální proměnná definovaná v hlavičce třídní (class variable)static instanční (class variable) metoda funkce či procedura vrací hodnotu či nevrací nic ( void ) konkrétní - má tělo { … } event. i prázdné abstraktní - nemá tělo – má jen středník ( abstract ) signatura metody / konstruktoru: jméno a seznam typů parametrů stigma metody:throws seznam Throwable přetížení - shoda jmen leč rozdílné signatury překrytí - shoda signatur v předkovi a potomkovi inicializátorstatický: static{ … } anebo nestatický: { … } třída ( class) , výčet ( enum) interfejs rozhraní ( interface ) C00