Cristian Fr Asinaru - Alexandru Ioan Cuza University

Transcription

Curs practic de JavaCristian Frăsinaru

Cuprins1 Introducere ı̂n Java1.1 Ce este Java ? . . . . . . . . . . . . . . . . . .1.1.1 Limbajul de programare Java . . . . .1.1.2 Platforme de lucru Java . . . . . . . .1.1.3 Java: un limbaj compilat şi interpretat1.2 Primul program . . . . . . . . . . . . . . . . .1.3 Structura lexicală a limbajului Java . . . . . .1.3.1 Setul de caractere . . . . . . . . . . . .1.3.2 Cuvinte cheie . . . . . . . . . . . . . .1.3.3 Identificatori . . . . . . . . . . . . . . .1.3.4 Literali . . . . . . . . . . . . . . . . . .1.3.5 Separatori . . . . . . . . . . . . . . . .1.3.6 Operatori . . . . . . . . . . . . . . . .1.3.7 Comentarii . . . . . . . . . . . . . . .1.4 Tipuri de date şi variabile . . . . . . . . . . .1.4.1 Tipuri de date . . . . . . . . . . . . . .1.4.2 Variabile . . . . . . . . . . . . . . . . .1.5 Controlul execuţiei . . . . . . . . . . . . . . .1.5.1 Instrucţiuni de decizie . . . . . . . . .1.5.2 Instrucţiuni de salt . . . . . . . . . . .1.5.3 Instrucţiuni pentru tratarea excepţiilor1.5.4 Alte instrucţiuni . . . . . . . . . . . .1.6 Vectori . . . . . . . . . . . . . . . . . . . . . .1.6.1 Crearea unui vector . . . . . . . . . . .1.6.2 Tablouri multidimensionale . . . . . .1.6.3 Dimensiunea unui vector . . . . . . . .1.6.4 Copierea vectorilor . . . . . . . . . . 6282829

2CUPRINS1.6.5 Sortarea vectorilor - clasa Arrays . . . . . .1.6.6 Vectori cu dimensiune variabilă şi eterogeniŞiruri de caractere . . . . . . . . . . . . . . . . . .Folosirea argumentelor de la linia de comandă . . .1.8.1 Transmiterea argumentelor . . . . . . . . . .1.8.2 Primirea argumentelor . . . . . . . . . . . .1.8.3 Argumente numerice . . . . . . . . . . . . .293030313132342 Obiecte şi clase2.1 Ciclul de viaţă al unui obiect . . . . . . . . . . . . .2.1.1 Crearea obiectelor . . . . . . . . . . . . . . .2.1.2 Folosirea obiectelor . . . . . . . . . . . . . .2.1.3 Distrugerea obiectelor . . . . . . . . . . . .2.2 Crearea claselor . . . . . . . . . . . . . . . . . . . .2.2.1 Declararea claselor . . . . . . . . . . . . . .2.2.2 Extinderea claselor . . . . . . . . . . . . . .2.2.3 Corpul unei clase . . . . . . . . . . . . . . .2.2.4 Constructorii unei clase . . . . . . . . . . . .2.2.5 Declararea variabilelor . . . . . . . . . . . .2.2.6 this şi super . . . . . . . . . . . . . . . . . .2.3 Implementarea metodelor . . . . . . . . . . . . . .2.3.1 Declararea metodelor . . . . . . . . . . . . .2.3.2 Tipul returnat de o metodă . . . . . . . . .2.3.3 Trimiterea parametrilor către o metodă . . .2.3.4 Metode cu număr variabil de argumente . .2.3.5 Supraı̂ncărcarea şi supradefinirea metodelor2.4 Modificatori de acces . . . . . . . . . . . . . . . . .2.5 Membri de instanţă şi membri de clasă . . . . . . .2.5.1 Variabile de instanţă şi de clasă . . . . . . .2.5.2 Metode de instanţă şi de clasă . . . . . . . .2.5.3 Utilitatea membrilor de clasă . . . . . . . .2.5.4 Blocuri statice de iniţializare . . . . . . . . .2.6 Clase imbricate . . . . . . . . . . . . . . . . . . . .2.6.1 Definirea claselor imbricate . . . . . . . . . .2.6.2 Clase interne . . . . . . . . . . . . . . . . .2.6.3 Identificare claselor imbricate . . . . . . . .2.6.4 Clase anonime . . . . . . . . . . . . . . . . .2.7 Clase şi metode abstracte . . . . . . . . . . . . . 464666667671.71.8

CUPRINS2.7.1 Declararea unei clase abstracte2.7.2 Metode abstracte . . . . . . . .2.8 Clasa Object . . . . . . . . . . . . . .2.8.1 Orice clasă are o superclasă . .2.8.2 Clasa Object . . . . . . . . . .2.9 Conversii automate ı̂ntre tipuri . . . .2.10 Tipul de date enumerare . . . . . . . .3.3 Excepţii3.1 Ce sunt excepţiile ? . . . . . . . . . . . .3.2 ”Prinderea” şi tratarea excepţiilor . . . .3.3 ”Aruncarea” excepţiilor . . . . . . . . . .3.4 Avantajele tratării excepţiilor . . . . . .3.4.1 Separarea codului pentru tratarea3.4.2 Propagarea erorilor . . . . . . . .3.4.3 Gruparea erorilor după tipul lor .3.5 Ierarhia claselor ce descriu excepţii . . .3.6 Excepţii la execuţie . . . . . . . . . . . .3.7 Crearea propriilor excepţii . . . . . . . . . . . . . . . . . . . . . . . .erorilor. . . . . . . . . . . . . . . . . . . . .4 Intrări şi ieşiri4.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . .4.1.1 Ce sunt fluxurile? . . . . . . . . . . . . . . . . .4.1.2 Clasificarea fluxurilor . . . . . . . . . . . . . . .4.1.3 Ierarhia claselor pentru lucrul cu fluxuri . . . .4.1.4 Metode comune fluxurilor . . . . . . . . . . . .4.2 Folosirea fluxurilor . . . . . . . . . . . . . . . . . . . .4.2.1 Fluxuri primitive . . . . . . . . . . . . . . . . .4.2.2 Fluxuri de procesare . . . . . . . . . . . . . . .4.2.3 Crearea unui flux . . . . . . . . . . . . . . . . .4.2.4 Fluxuri pentru lucrul cu fişiere . . . . . . . . . .4.2.5 Citirea şi scrierea cu buffer . . . . . . . . . . . .4.2.6 Concatenarea fluxurilor . . . . . . . . . . . . . .4.2.7 Fluxuri pentru filtrarea datelor . . . . . . . . .4.2.8 Clasele DataInputStream şi DataOutputStream4.3 Intrări şi ieşiri formatate . . . . . . . . . . . . . . . . .4.3.1 Intrări formatate . . . . . . . . . . . . . . . . .4.3.2 Ieşiri formatate . . . . . . . . . . . . . . . . . 89999100101103105107108109110110111

4CUPRINS4.44.54.6Fluxuri standard de intrare şi ieşire . . . . . . . . . . . . .4.4.1 Afisarea informaţiilor pe ecran . . . . . . . . . . . .4.4.2 Citirea datelor de la tastatură . . . . . . . . . . . .4.4.3 Redirectarea fluxurilor standard . . . . . . . . . . .4.4.4 Analiza lexicală pe fluxuri (clasa StreamTokenizer)Clasa RandomAccesFile (fişiere cu acces direct) . . . . . .Clasa File . . . . . . . . . . . . . . . . . . . . . . . . . . .1111121121131151171195 Interfeţe5.1 Introducere . . . . . . . . . . . . . . . . . .5.1.1 Ce este o interfaţă ? . . . . . . . . .5.2 Folosirea interfeţelor . . . . . . . . . . . . .5.2.1 Definirea unei interfeţe . . . . . . . .5.2.2 Implementarea unei interfeţe . . . . .5.2.3 Exemplu: implementarea unei stive .5.3 Interfeţe şi clase abstracte . . . . . . . . . .5.4 Moştenire multiplă prin interfeţe . . . . . .5.5 Utilitatea interfeţelor . . . . . . . . . . . . .5.5.1 Crearea grupurilor de constante . . .5.5.2 Transmiterea metodelor ca parametri5.6 Interfaţa FilenameFilter . . . . . . . . . .5.6.1 Folosirea claselor anonime . . . . . .5.7 Compararea obiectelor . . . . . . . . . . . .5.7.1 Interfaţa Comparable . . . . . . . . .5.7.2 Interfaţa Comparator . . . . . . . . .5.8 Adaptori . . . . . . . . . . . . . . . . . . . .121. 121. 121. 122. 122. 123. 124. 129. 130. 132. 132. 133. 134. 137. 138. 139. 141. 1426 Organizarea claselor6.1 Pachete . . . . . . . . . . . . . . . . . .6.1.1 Pachetele standard (J2SDK) . . .6.1.2 Folosirea membrilor unui pachet .6.1.3 Importul unei clase sau interfeţe .6.1.4 Importul la cerere dintr-un pachet6.1.5 Importul static . . . . . . . . . .6.1.6 Crearea unui pachet . . . . . . .6.1.7 Denumirea unui pachet . . . . . .6.2 Organizarea fişierelor . . . . . . . . . . .6.2.1 Organizarea fişierelor sursă . . . .145145145146147148149150151152152

CUPRINS6.356.2.2 Organizarea unităţilor de compilare (.class)6.2.3 Necesitatea organizării fişierelor . . . . . . . .6.2.4 Setarea căii de căutare (CLASSPATH) . . . .Arhive JAR . . . . . . . . . . . . . . . . . . . . . . .6.3.1 Folosirea utilitarului jar . . . . . . . . . . . .6.3.2 Executarea aplicaţiilor arhivate . . . . . . . .7 Colecţii7.1 Introducere . . . . . . . . . .7.2 Interfeţe ce descriu colecţii . .7.3 Implementări ale colecţiilor . .7.4 Folosirea eficientă a colecţiilor7.5 Algoritmi polimorfici . . . . .7.6 Tipuri generice . . . . . . . .7.7 Iteratori şi enumerări . . . . .154155156157158159.161. 161. 162. 166. 168. 170. 171. 1728 Serializarea obiectelor8.1 Folosirea serializării . . . . . . . . . . . . . . .8.1.1 Serializarea tipurilor primitive . . . . .8.1.2 Serializarea obiectelor . . . . . . . . . .8.1.3 Clasa ObjectOutputStream . . . . . .8.1.4 Clasa ObjectInputStream . . . . . . .8.2 Obiecte serializabile . . . . . . . . . . . . . . .8.2.1 Implementarea interfeţei Serializable .8.2.2 Controlul serializării . . . . . . . . . .8.3 Personalizarea serializării obiectelor . . . . . .8.3.1 Controlul versiunilor claselor . . . . . .8.3.2 Securizarea datelor . . . . . . . . . . .8.3.3 Implementarea interfeţei Externalizable8.4 Clonarea obiectelor . . . . . . . . . . . . . . .199. 199. 200. 202. 204. 206. 207.9 Interfaţa grafică cu utilizatorul9.1 Introducere . . . . . . . . . . . . . . . . . . .9.2 Modelul AWT . . . . . . . . . . . . . . . . . .9.2.1 Componentele AWT . . . . . . . . . .9.2.2 Suprafeţe de afişare (Clasa Container)9.3 Gestionarea poziţionării . . . . . . . . . . . .9.3.1 Folosirea gestionarilor de poziţionare .177177179180180181183183184187188193194196

6CUPRINS9.49.59.69.79.3.2 Gestionarul FlowLayout . . . . . . . . . . .9.3.3 Gestionarul BorderLayout . . . . . . . . . .9.3.4 Gestionarul GridLayout . . . . . . . . . . .9.3.5 Gestionarul CardLayout . . . . . . . . . . .9.3.6 Gestionarul GridBagLayout . . . . . . . . .9.3.7 Gruparea componentelor (Clasa Panel) . . .Tratarea evenimentelor . . . . . . . . . . . . . . . .9.4.1 Exemplu de tratare a evenimentelor . . . . .9.4.2 Tipuri de evenimente . . . . . . . . . . . . .9.4.3 Folosirea adaptorilor şi a claselor anonime .Folosirea ferestrelor . . . . . . . . . . . . . . . . . .9.5.1 Clasa Window . . . . . . . . . . . . . . . . .9.5.2 Clasa Frame . . . . . . . . . . . . . . . . . .9.5.3 Clasa Dialog . . . . . . . . . . . . . . . . . .9.5.4 Clasa FileDialog . . . . . . . . . . . . . . .Folosirea meniurilor . . . . . . . . . . . . . . . . . .9.6.1 Ierarhia claselor ce descriu meniuri . . . . .9.6.2 Tratarea evenimentelor generate de meniuri9.6.3 Meniuri de context (popup) . . . . . . . . .9.6.4 Acceleratori (Clasa MenuShortcut) . . . . .Folosirea componentelor AWT . . . . . . . . . . . .9.7.1 Clasa Label . . . . . . . . . . . . . . . . . .9.7.2 Clasa Button . . . . . . . . . . . . . . . . .9.7.3 Clasa Checkbox . . . . . . . . . . . . . . . .9.7.4 Clasa CheckboxGroup . . . . . . . . . . . .9.7.5 Clasa Choice . . . . . . . . . . . . . . . . .9.7.6 Clasa List . . . . . . . . . . . . . . . . . . .9.7.7 Clasa ScrollBar . . . . . . . . . . . . . . . .9.7.8 Clasa ScrollPane . . . . . . . . . . . . . . .9.7.9 Clasa TextField . . . . . . . . . . . . . . . .9.7.10 Clasa TextArea . . . . . . . . . . . . . . . .10 Desenarea10.1 Conceptul de desenare . . . . . . . . . . . .10.1.1 Metoda paint . . . . . . . . . . . . .10.1.2 Suprafeţe de desenare - clasa Canvas10.2 Contextul grafic de desenare . . . . . . . . .10.2.1 Proprietăţile contextului grafic . . . 43246247250250251252253255257259261262263265.269. 269. 270. 271. 274. 275

CUPRINS10.310.410.510.610.2.2 Primitive grafice . . . . . . . . . .Folosirea fonturilor . . . . . . . . . . . . .10.3.1 Clasa Font . . . . . . . . . . . . . .10.3.2 Clasa FontMetrics . . . . . . . . . .Folosirea culorilor . . . . . . . . . . . . . .Folosirea imaginilor . . . . . . . . . . . . .10.5.1 Afişarea imaginilor . . . . . . . . .10.5.2 Monitorizarea ı̂ncărcării imaginilor10.5.3 Mecanismul de ”double-buffering” .10.5.4 Salvarea desenelor ı̂n format JPEG10.5.5 Crearea imaginilor ı̂n memorie . .Tipărirea . . . . . . . . . . . . . . . . . . .11 Swing11.1 Introducere . . . . . . . . . . . . . . . . .11.1.1 JFC . . . . . . . . . . . . . . . . .11.1.2 Swing API . . . . . . . . . . . . . .11.1.3 Asemănări şi deosebiri cu AWT . .11.2 Folosirea ferestrelor . . . . . . . . . . . . .11.2.1 Ferestre interne . . . . . . . . . . .11.3 Clasa JComponent . . . . . . . . . . . . .11.4 Arhitectura modelului Swing . . . . . . . .11.5 Folosirea modelelor . . . . . . . . . . . . .11.5.1 Tratarea evenimentelor . . . . . . .11.6 Folosirea componentelor . . . . . . . . . .11.6.1 Componente atomice . . . . . . . .11.6.2 Componente pentru editare de text11.6.3 Componente pentru selectarea unor11.6.4 Tabele . . . . . . . . . . . . . . . .11.6.5 Arbori . . . . . . . . . . . . . . . .11.6.6 Containere . . . . . . . . . . . . . .11.6.7 Dialoguri . . . . . . . . . . . . . .11.7 Desenarea . . . . . . . . . . . . . . . . . .11.7.1 Metode specifice . . . . . . . . . .11.7.2 Consideraţii generale . . . . . . . .11.8 Look and Feel . . . . . . . . . . . . . . . .7.275276277279282286287289291291292293. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .elemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29332335336336338340

8CUPRINS12 Fire de execuţie12.1 Introducere . . . . . . . . . . . . . . . . .12.2 Crearea unui fir de execuţie . . . . . . . .12.2.1 Extinderea clasei Thread . . . . . .12.2.2 Implementarea interfeţei Runnable12.3 Ciclul de viaţă al unui fir de execuţie . . .12.3.1 Terminarea unui fir de execuţie . .12.3.2 Fire de execuţie de tip ”daemon” .12.3.3 Stabilirea priorităţilor de execuţie .12.3.4 Sincronizarea firelor de execuţie . .12.3.5 Scenariul producător / consumator12.3.6 Monitoare . . . . . . . . . . . . . .12.3.7 Semafoare . . . . . . . . . . . . . .12.3.8 Probleme legate de sincronizare . .12.4 Gruparea firelor de execuţie . . . . . . . .12.5 Comunicarea prin fluxuri de tip ”pipe” . .12.6 Clasele Timer şi TimerTask . . . . . . . .13 Programare ı̂n reţea13.1 Introducere . . . . . . . . . . . . . . . . . .13.2 Lucrul cu URL-uri . . . . . . . . . . . . . .13.3 Socket-uri . . . . . . . . . . . . . . . . . . .13.4 Comunicarea prin conexiuni . . . . . . . . .13.5 Comunicarea prin datagrame . . . . . . . . .13.6 Trimiterea de mesaje către mai mulţi clienţi14 Appleturi14.1 Introducere . . . . . . . . . . . . . . .14.2 Crearea unui applet simplu . . . . . . .14.3 Ciclul de viaţă al unui applet . . . . .14.4 Interfaţa grafică cu utilizatorul . . . . .14.5 Definirea şi folosirea parametrilor . . .14.6 Tag-ul APPLET . . . . . . . . . . . .14.7 Folosirea firelor de execuţie ı̂n appleturi14.8 Alte metode oferite de clasa Applet . .14.9 Arhivarea appleturilor . . . . . . . . .14.10Restricţii de securitate . . . . . . . . .14.11Appleturi care sunt şi aplicaţii . . . . .343. 343. 344. 345. 347. 352. 355. 357. 358. 362. 362. 367. 369. 371. 373. 376. 378.383. 383. 385. 387. 388. 393. 397.401. 401. 402. 404. 406. 408. 410. 412. 416. 420. 421. 421

CUPRINS915 Lucrul cu baze de date15.1 Introducere . . . . . . . . . . . . . . . . . .15.1.1 Generalităţi despre baze de date . . .15.1.2 JDBC . . . . . . . . . . . . . . . . .15.2 Conectarea la o bază de date . . . . . . . . .15.2.1 Inregistrarea unui driver . . . . . . .15.2.2 Specificarea unei baze de date . . . .15.2.3 Tipuri de drivere . . . . . . . . . . .15.2.4 Realizarea unei conexiuni . . . . . .15.3 Efectuarea de secvenţe SQL . . . . . . . . .15.3.1 Interfaţa Statement . . . . . . . . . .15.3.2 Interfaţa PreparedStatement . . . . .15.3.3 Interfaţa CallableStatement . . . . .15.3.4 Obţinerea şi prelucrarea rezultatelor15.3.5 Interfaţa ResultSet . . . . . . . . . .15.3.6 Exemplu simplu . . . . . . . . . . . .15.4 Lucrul cu meta-date . . . . . . . . . . . . .15.4.1 Interfaţa DatabaseMetaData . . . . .15.4.2 Interfaţa ResultSetMetaData . . . .16 Lucrul dinamic cu clase16.1 Incărcarea claselor ı̂n memorie . . . . . .16.2 Mecanismul reflectării . . . . . . . . . .16.2.1 Examinarea claselor şi interfeţelor16.2.2 Manipularea obiectelor . . . . . .16.2.3 Lucrul dinamic cu vectori . . . .423. 423. 423. 424. 425. 426. 427. 428. 430. 431. 432. 434. 437. 438. 438. 440. 442. 442. 443.445. 445. 452. 453. 456. 460

10CUPRINS

Capitolul 1Introducere ı̂n Java1.1Ce este Java ?Java este o tehnologie inovatoare lansată de compania Sun Microsystems ı̂n1995, care a avut un impact remarcabil asupra ı̂ntregii comunităţi a dezvoltatorilor de software, impunându-se prin calităţi deosebite cum ar fi simplitate, robusteţe şi nu ı̂n ultimul rând portabilitate. Denumită iniţial OAK,tehnologia Java este formată dintr-un limbaj de programare de nivel ı̂nalt pebaza căruia sunt construite o serie de platforme destinate implementării deaplicaţii pentru toate segmentele industriei software.1.1.1Limbajul de programare JavaInainte de a prezenta ı̂n detaliu aspectele tehnice ale limbajului Java, să amintim caracteristicile sale principale, care l-au transformat ı̂ntr-un interval detimp atât de scurt ı̂ntr-una din cele mai pupulare opţiuni pentru dezvoltareade aplicaţii, indiferent de domeniu sau de complexitatea lor. Simplitate - elimină supraı̂ncărcarea operatorilor, moştenirea multiplăşi toate ”facilităţile” ce pot provoca scrierea unui cod confuz. Uşurinţă ı̂n crearea de aplicaţii complexe ce folosesc programarea ı̂nreţea, fire de execuţie, interfaţă grafică, baze de date, etc. Robusteţe - elimină sursele frecvente de erori ce apar ı̂n programareprin renunţarea la pointeri, administrarea automată a memoriei şi elim11

12CAPITOLUL 1. INTRODUCERE ÎN JAVAinarea pierderilor de memorie printr-o procedură de colectare a obiectelorcare nu mai sunt referite, ce rulează ı̂n fundal (”garbage collector”). Complet orientat pe obiecte - elimină complet stilul de programareprocedural. Securitate - este un limbaj de programare foarte sigur, furnizândmecanisme stricte de s

2 CUPRINS 1.6.5 Sortarea vectorilor - clasa Arrays . . . . . . . . . . . . 29 1.6.6 Vectori cu dimensiune variabil a si eterogeni . . . . . . 30