1 Petr Aubrecht Gerstner Laboratory, 19. 4. 2004
slušn ě napsaná aplikace vynucuje správné návyky (třídy, výjimky, dokumentace, správa thread ů, coding standard, pojmenovávání...) multithreading zdědit od Thread/Process nebo použít interface Runnable síťová aplikace podpora TCP/IP, RMI, CORBA, HTTP, HTML servlety a JSP, applety, EJB, Jini práce s databází (JDBC) GUI (AWT, Swing, příp. další napojení: gtk, qt, win32) 2
podpora standardů obrázky PNG, JPG, čtení GIF + JAI: BMP, FlashPix, PNM, TIFF, WBMP, JPEG 2000, EXIF zvuky ( Java Media Framework) AIFF, AU, AVI, GSM, MIDI, MP2, MP3*, QT, RMF, WAV video AVI, MPEG-1, QT, H.261, H.263 XML, XSL-T zip, gzip java.util.zip (přístup k souboru, streamy) (a)symetrická encrypce (a správa klí čů) Java3D OpenGL, DirectX, (VRML) 3
~90.000 rectangles 45 fps Java->OpenGL VRML 4
"! mutliplatformní vývoj (Linux, Win) použití cizích knihoven, sdílení výsledk ů! režimy běhu: standalone, applet, web-start, serverové aplikace (servlety, JSP, JEE, Corba ap.), J2ME (mobily, PDA) integrace systémů v Jav ě je snadný přístup k objektům jiné aplikace za běhu můžete prozkoumat data a použité typy 5
% ' # + + + + (*) $&% Zdrojový text se přeloží do bytecode. Bytecode se interpretuje. Pokud se daný kód vyhodnocuje vícekrát, přeloží se do strojového kódu. Pokud se přeložený kód vykonává často, přeloží se znovu na základ ě dynamické informace může být i rychlejší než C++. 6
/ 2 1 0,. -, http://www.osnews.com/story.php?news_id=5602 The value of sine for the floating-point number Math.PI is around 1.2246467991473532E-16 while the computed value for the algorithm used in java 1.3.1 is 1.2246063538223773E-16 7
6 ; 8 7 5 3 4 < < < < < 6:9 Preprocesor Ukazatelová aritm. Násobná dědičnost Šablony tříd (STL) Oddělení deklarace a definice nemá vůbec žádná interface! collections of Objects, nov ě v 1.5 všechno se píše do jednoho souboru 8
D@? C C B = > = = = = E @*A Projekt Seznam použitých souborů binární výstup (exe) public/prot./priv. members Pole (statické, dynamické) Stringy Balíčky (packages) Adresářová struktura tříd JAR archiv (ZIP) Každá metoda je popsána zvlášť I pole je objekt (má nap ř. metodu length) Pracuje v Unicode (pozor při ukládání do souboru) 9
N LH M G K K J F F F O H*I new/delete, zodpovědný je autor výjimky (můžou propagovat až k GPF) jenom new (garbage collector) musí se VŽDYCKY ošetřit F F streamy (nepoužívané) F F nekompatibilita mezi kompilátory (C++) i na úrovni src destruktor ~name opravdu se používají možnost použít libovolné knihovny i zkompilované finalize (nepoužívat) 10
P Q U U U U U RTS int, double, boolean klasické char pozor, UNICODE! String trošku nečekan ě je abc objekt typu java.lang.string! pole int[12], také objekt! jsou-li potřeba objekty (nap ř. v kontejnerech), nelze použít int, ale Integer (ap.), obsahují i převody String<->typ 11
V W W X ZY Základ třída, musí být ve stejnojmenném souboru case sensitive, extends znamená dědičnost public class Abc extends Def { protected String greeting = "Hello!"; }; public void sayhello() { } System.out.println(greeting); konečn ě zaveden super! (nadřízená třída) 12
d _ c[ `_ [ [ e e e ab ^ \] Java zná pouze jednoduché dědění! Vícenásobné dědění řeší pomocí interface. Interface je seznam metod: interface Lednicka { void zapnout(); void vypnout(); boolean iszapnuta(); int getteplota(); void otevritdvere(); } 13
l k n m f f g h i j i i j j o Soubory jsou v adresářích balících, package Standardn ě se adr. jmenují podle web. domény Filesystem cz beer pilsen praha Beer.java interface Beer { public double isgood{}; }; j Urquell.java Prazdroj.java class Prazdroj implements cz.beer.beer { }; Branik.java import cz.beer.*; class Branik implements Beer { }; 14
r u q q p q vxw s*t Jmenuje se import import java.io.file; // chci použít tuto třídu import javax.swing.*; // chci všechny třídy z tohoto balíku // nezahrunuje podadresáře! import javax.swing.filechooser.*; public class CustomFileFilter extends FileFilter { 15
y { z z } } } } } } Classpath definuje seznam adresá řů/archiv ů, které jsou prohledávány při vytváření instancí. Příklad: java -cp.;classes;demo.jar. aktuální adresář classes adresá ř classes demo.jar (zip) archiv new a.b.c(...) vede na hledání./a/b/c.class classes/a/b/c.class obsah demo.jar /a/b/c.class 16
ƒ ~ * Je důležité zvyknout si na coding standards Velkým písmenem začíná: definice třídy a interface (interface Beer) Malý písmenem začíná: metody, instance a proměnné (File soubor =...) package (cz.pilsen) Pokud se identifikátor skládá z více slov, je každé počáteční písmeno velké (mujoblibenysoubor) Závorky: for(int i=1; i<10; i++) { System.out.println(i); } 17
ˆ Š Š Š Š JavaBeans znovupoužitelné komponenty (podobn ě jako v Delphi) Nezavádí se ovšem zvláštní způsob tvorby, jsou to obyčejné třídy, pouze dodržují coding standards. Property size: int getsize() void setsize(int) Musí mít konstruktor bez argument ů. 18
Œ * Œ Ž Žx Pokud je k dispozici zdrojový kód přidat do classpath, javadoc se zobrazí automaticky Pokud je k dispozici pouze jar: přidat do classpath, případn ě přidat i javadoc Prozkoumat se dá i zkompilovaný soubor public a protected metody a data zobrazí jména. 19
dv ě možnosti vypořádání se s výjimkou 1. ošetřit ji try/catch/finally 2. předat zodpovědnost nahoru ad 1 může být i více catch za sebou, finally try { } catch(exception e) { System.err.println(e.getMessage()); // nepříliš užitečné e.printstacktrace(); // výpis zásobníku } 20
œ š ad 2 musí být ošetřena volající funkcí public void drink() throws Exception { } nebo lépe specializovaná výjimka public void drink() throws IOException { } 21
Ÿ ž Jedna z mnoha výhod Javy je standardizovaná dokumentace. IDE dnes zobrazují tuto nápovědu i přímo z vašich tříd! 22
Class.forName("org.firebirdsql.jdbc.FBDriver"); Connection conn = DriverManager.getConnection ("jdbc:firebirdsql:localhost:c:/data/test.gdb","username ","pass"); Statement st = conn.createstatement(); ResultSet rs = st.executequery("select * from PIS_ZBOZI"); while(rs.next()) { System.out.println("NAZEV: "+rs.getstring ("NAZEV")); } st.close(); conn.close(); 23
ª ª ª Při práci s knihovnou SWING se setkáme se dvěma nezvyklými pojmy: model a listener. Model: vizuální komponenta odkazuje na model, jehož data zobrazuje. Nap ř. JTable neobsahuje žádná data, dotazuje se modelu. Listener: protože Java nemá ukazatel na funkci, používá třídy, u kterých volá metody: button.addactionlistener(new ActionListener() { public void actionperformed(...) { System.out.println( Bylo zmáčknuto tlačítko! ); } }); 24
«2D grafy: JFreeChart (sf.net) Reporty: JFreeReport (sf.net) GIS: JUMP (http://www.vividsolutions.com/jump/) Matematika: Colt (hoschek.home.cern.ch/hoschek/colt/) Šifrování: BouncyCastle (.org) a mnoho dalších... 25
Vybavená IDE podpora všech možných použití Javy: grafický návrh SWING aplikací, ovládání SQL databáze, JSP, CVS, refaktorizace, další pluginy relativn ě náročné na paměť NetBeans(.org) Sun Eclipse(.org) IBM Idea IntelliJ, $500 JBuilder NE! Jednoduchá IDE rychlejší, mén ě náročná na paměť 26
µ ² ³ ² ± ± ± Bruce Eckel, Thinking in Java Sun pech.cz/thinking/ java.sun.com Česky java.cz Aubrecht Linux + Java + TeX 27