Cristian Frasinaru-Curs Practic de Java1

download Cristian Frasinaru-Curs Practic de Java1

of 182

Transcript of Cristian Frasinaru-Curs Practic de Java1

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    1/461

    Curs practic de Java

    Cristian Fr˘asinaru

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    2/461

    Cuprins

    1 Introducere ̂ın Java 111.1 Ce este Java ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    1.1.1 Limbajul de programare Java . . . . . . . . . . . . . . 111.1.2 Platforme de lucru Java . . . . . . . . . . . . . . . . . 121.1.3 Java: un limbaj compilat şi interpretat . . . . . . . . . 13

    1.2 Primul program . . . . . . . . . . . . . . . . . . . . . . . . . . 141.3 Structura lexical˘a a limbajului Java . . . . . . . . . . . . . . . 16

    1.3.1 Setul de caractere . . . . . . . . . . . . . . . . . . . . . 161.3.2 Cuvinte cheie . . . . . . . . . . . . . . . . . . . . . . . 161.3.3 Identicatori . . . . . . . . . . . . . . . . . . . . . . . . 171.3.4 Literali . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.3.5 Separatori . . . . . . . . . . . . . . . . . . . . . . . . . 191.3.6 Operatori . . . . . . . . . . . . . . . . . . . . . . . . . 191.3.7 Comentarii . . . . . . . . . . . . . . . . . . . . . . . . 20

    1.4 Tipuri de date şi variabile . . . . . . . . . . . . . . . . . . . . 21

    1.4.1 Tipuri de date . . . . . . . . . . . . . . . . . . . . . . . 211.4.2 Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    1.5 Controlul execuţ iei . . . . . . . . . . . . . . . . . . . . . . . . 241.5.1 Instrucţ iuni de decizie . . . . . . . . . . . . . . . . . . 241.5.2 Instrucţ iuni de salt . . . . . . . . . . . . . . . . . . . . 251.5.3 Instrucţ iuni pentru tratarea except ¸iilor . . . . . . . . . 261.5.4 Alte instrucţ iuni . . . . . . . . . . . . . . . . . . . . . 26

    1.6 Vectori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261.6.1 Crearea unui vector . . . . . . . . . . . . . . . . . . . . 261.6.2 Tablouri multidimensionale . . . . . . . . . . . . . . . 281.6.3 Dimensiunea unui vector . . . . . . . . . . . . . . . . . 281.6.4 Copierea vectorilor . . . . . . . . . . . . . . . . . . . . 29

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    3/461

    2 CUPRINS

    1.6.5 Sortarea vectorilor - clasa Arrays . . . . . . . . . . . . 291.6.6 Vectori cu dimensiune variabil˘a şi eterogeni . . . . . . 30

    1.7 Şiruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . 30

    1.8 Folosirea argumentelor de la linia de comand˘a . . . . . . . . . 311.8.1 Transmiterea argumentelor . . . . . . . . . . . . . . . . 311.8.2 Primirea argumentelor . . . . . . . . . . . . . . . . . . 321.8.3 Argumente numerice . . . . . . . . . . . . . . . . . . . 34

    2 Obiecte ̧si clase 352.1 Ciclul de viaţă al unui obiect . . . . . . . . . . . . . . . . . . . 35

    2.1.1 Crearea obiectelor . . . . . . . . . . . . . . . . . . . . . 352.1.2 Folosirea obiectelor . . . . . . . . . . . . . . . . . . . . 372.1.3 Distrugerea obiectelor . . . . . . . . . . . . . . . . . . 38

    2.2 Crearea claselor . . . . . . . . . . . . . . . . . . . . . . . . . . 392.2.1 Declararea claselor . . . . . . . . . . . . . . . . . . . . 392.2.2 Extinderea claselor . . . . . . . . . . . . . . . . . . . . 402.2.3 Corpul unei clase . . . . . . . . . . . . . . . . . . . . . 412.2.4 Constructorii unei clase . . . . . . . . . . . . . . . . . . 42

    2.2.5 Declararea variabilelor . . . . . . . . . . . . . . . . . . 462.2.6 this şi super . . . . . . . . . . . . . . . . . . . . . . . . 492.3 Implementarea metodelor . . . . . . . . . . . . . . . . . . . . 50

    2.3.1 Declararea metodelor . . . . . . . . . . . . . . . . . . . 502.3.2 Tipul returnat de o metod˘ a . . . . . . . . . . . . . . . 522.3.3 Trimiterea parametrilor c˘ atre o metod ă . . . . . . . . . 532.3.4 Metode cu număr variabil de argumente . . . . . . . . 562.3.5 Suprâınc˘arcarea şi supradenirea metodelor . . . . . . 57

    2.4 Modicatori de acces . . . . . . . . . . . . . . . . . . . . . . . 582.5 Membri de instanţ ă şi membri de clas ă . . . . . . . . . . . . . 59

    2.5.1 Variabile de instant¸ă şi de clasă . . . . . . . . . . . . . 592.5.2 Metode de instanţ ă şi de clasă . . . . . . . . . . . . . . 612.5.3 Utilitatea membrilor de clas˘a . . . . . . . . . . . . . . 622.5.4 Blocuri statice de iniţ ializare . . . . . . . . . . . . . . . 63

    2.6 Clase imbricate . . . . . . . . . . . . . . . . . . . . . . . . . . 64

    2.6.1 Denirea claselor imbricate . . . . . . . . . . . . . . . . 642.6.2 Clase interne . . . . . . . . . . . . . . . . . . . . . . . 662.6.3 Identicare claselor imbricate . . . . . . . . . . . . . . 662.6.4 Clase anonime . . . . . . . . . . . . . . . . . . . . . . . 67

    2.7 Clase şi metode abstracte . . . . . . . . . . . . . . . . . . . . 67

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    4/461

    CUPRINS 3

    2.7.1 Declararea unei clase abstracte . . . . . . . . . . . . . 682.7.2 Metode abstracte . . . . . . . . . . . . . . . . . . . . . 68

    2.8 Clasa Object . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

    2.8.1 Orice clasă are o superclas ă . . . . . . . . . . . . . . . 712.8.2 Clasa Object . . . . . . . . . . . . . . . . . . . . . . . 712.9 Conversii automate ̂ıntre tipuri . . . . . . . . . . . . . . . . . 742.10 Tipul de date enumerare . . . . . . . . . . . . . . . . . . . . . 75

    3 Except ¸ii 773.1 Ce sunt excepţiile ? . . . . . . . . . . . . . . . . . . . . . . . . 773.2 ”Prinderea” şi tratarea except ¸iilor . . . . . . . . . . . . . . . . 783.3 ”Aruncarea” except¸iilor . . . . . . . . . . . . . . . . . . . . . . 823.4 Avantajele trat˘ arii excepţiilor . . . . . . . . . . . . . . . . . . 85

    3.4.1 Separarea codului pentru tratarea erorilor . . . . . . . 853.4.2 Propagarea erorilor . . . . . . . . . . . . . . . . . . . . 873.4.3 Gruparea erorilor dup˘a tipul lor . . . . . . . . . . . . . 89

    3.5 Ierarhia claselor ce descriu excepţ ii . . . . . . . . . . . . . . . 903.6 Excepţ ii la execuţie . . . . . . . . . . . . . . . . . . . . . . . . 91

    3.7 Crearea propriilor excepţ ii . . . . . . . . . . . . . . . . . . . . 924 Intrări ̧si ieşiri 95

    4.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954.1.1 Ce sunt uxurile? . . . . . . . . . . . . . . . . . . . . . 954.1.2 Clasicarea uxurilor . . . . . . . . . . . . . . . . . . . 964.1.3 Ierarhia claselor pentru lucrul cu uxuri . . . . . . . . 974.1.4 Metode comune uxurilor . . . . . . . . . . . . . . . . 98

    4.2 Folosirea uxurilor . . . . . . . . . . . . . . . . . . . . . . . . 994.2.1 Fluxuri primitive . . . . . . . . . . . . . . . . . . . . . 994.2.2 Fluxuri de procesare . . . . . . . . . . . . . . . . . . . 1004.2.3 Crearea unui ux . . . . . . . . . . . . . . . . . . . . . 1014.2.4 Fluxuri pentru lucrul cu şiere . . . . . . . . . . . . . . 1034.2.5 Citirea şi scrierea cu buffer . . . . . . . . . . . . . . . . 1054.2.6 Concatenarea uxurilor . . . . . . . . . . . . . . . . . . 107

    4.2.7 Fluxuri pentru ltrarea datelor . . . . . . . . . . . . . 1084.2.8 Clasele DataInputStream şi DataOutputStream . . . . 1094.3 Intr ări şi ieşiri formatate . . . . . . . . . . . . . . . . . . . . . 110

    4.3.1 Intr ări formatate . . . . . . . . . . . . . . . . . . . . . 1104.3.2 Ieşiri formatate . . . . . . . . . . . . . . . . . . . . . . 111

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    5/461

    4 CUPRINS

    4.4 Fluxuri standard de intrare şi ieşire . . . . . . . . . . . . . . . 1114.4.1 Asarea informaţ iilor pe ecran . . . . . . . . . . . . . . 1124.4.2 Citirea datelor de la tastatur˘ a . . . . . . . . . . . . . . 112

    4.4.3 Redirectarea uxurilor standard . . . . . . . . . . . . . 1134.4.4 Analiza lexicală pe uxuri (clasa StreamTokenizer ) . . 1154.5 Clasa RandomAccesFile (şiere cu acces direct) . . . . . . . . 1174.6 Clasa File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

    5 Interfet ¸e 1215.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    5.1.1 Ce este o interfaţ ă ? . . . . . . . . . . . . . . . . . . . 1215.2 Folosirea interfeţ elor . . . . . . . . . . . . . . . . . . . . . . . 122

    5.2.1 Denirea unei interfeţ e . . . . . . . . . . . . . . . . . . 1225.2.2 Implementarea unei interfet¸e . . . . . . . . . . . . . . . 1235.2.3 Exemplu: implementarea unei stive . . . . . . . . . . . 124

    5.3 Interfeţe şi clase abstracte . . . . . . . . . . . . . . . . . . . . 1295.4 Moştenire multipl˘a prin interfeţ e . . . . . . . . . . . . . . . . 1305.5 Utilitatea interfet ¸elor . . . . . . . . . . . . . . . . . . . . . . . 132

    5.5.1 Crearea grupurilor de constante . . . . . . . . . . . . . 1325.5.2 Transmiterea metodelor ca parametri . . . . . . . . . . 1335.6 Interfaţ a FilenameFilter . . . . . . . . . . . . . . . . . . . . 134

    5.6.1 Folosirea claselor anonime . . . . . . . . . . . . . . . . 1375.7 Compararea obiectelor . . . . . . . . . . . . . . . . . . . . . . 138

    5.7.1 Interfaţ a Comparable . . . . . . . . . . . . . . . . . . . 1395.7.2 Interfaţ a Comparator . . . . . . . . . . . . . . . . . . . 141

    5.8 Adaptori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

    6 Organizarea claselor 1456.1 Pachete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

    6.1.1 Pachetele standard (J2SDK) . . . . . . . . . . . . . . . 1456.1.2 Folosirea membrilor unui pachet . . . . . . . . . . . . . 1466.1.3 Importul unei clase sau interfet¸e . . . . . . . . . . . . . 1476.1.4 Importul la cerere dintr-un pachet . . . . . . . . . . . . 148

    6.1.5 Importul static . . . . . . . . . . . . . . . . . . . . . . 1496.1.6 Crearea unui pachet . . . . . . . . . . . . . . . . . . . 1506.1.7 Denumirea unui pachet . . . . . . . . . . . . . . . . . . 151

    6.2 Organizarea şierelor . . . . . . . . . . . . . . . . . . . . . . . 1526.2.1 Organizarea şierelor surs˘a . . . . . . . . . . . . . . . . 152

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    6/461

    CUPRINS 5

    6.2.2 Organizarea unit˘aţilor de compilare ( .class ) . . . . . 1546.2.3 Necesitatea organiz˘arii şierelor . . . . . . . . . . . . . 1556.2.4 Setarea c ăii de căutare (CLASSPATH) . . . . . . . . . 156

    6.3 Arhive JAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1576.3.1 Folosirea utilitarului jar . . . . . . . . . . . . . . . . . 1586.3.2 Executarea aplicat¸iilor arhivate . . . . . . . . . . . . . 159

    7 Colect¸ii 1617.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1617.2 Interfeţ e ce descriu colecţii . . . . . . . . . . . . . . . . . . . . 1627.3 Implement ări ale colecţiilor . . . . . . . . . . . . . . . . . . . . 1667.4 Folosirea ecient ă a colecţ i i lor . . . . . . . . . . . . . . . . . . 1687.5 Algoritmi polimorci . . . . . . . . . . . . . . . . . . . . . . . 1707.6 Tipuri generice . . . . . . . . . . . . . . . . . . . . . . . . . . 1717.7 Iteratori şi enumer˘ari . . . . . . . . . . . . . . . . . . . . . . . 172

    8 Serializarea obiectelor 1778.1 Folosirea serializării . . . . . . . . . . . . . . . . . . . . . . . . 177

    8.1.1 Serializarea tipurilor primitive . . . . . . . . . . . . . . 1798.1.2 Serializarea obiectelor . . . . . . . . . . . . . . . . . . . 1808.1.3 Clasa ObjectOutputStream . . . . . . . . . . . . . . . 1808.1.4 Clasa ObjectInputStream . . . . . . . . . . . . . . . . 181

    8.2 Obiecte serializabile . . . . . . . . . . . . . . . . . . . . . . . . 1838.2.1 Implementarea interfet¸ei Serializable . . . . . . . . . . 1838.2.2 Controlul serializ ării . . . . . . . . . . . . . . . . . . . 184

    8.3 Personalizarea serializ ării obiectelor . . . . . . . . . . . . . . . 1878.3.1 Controlul versiunilor claselor . . . . . . . . . . . . . . . 1888.3.2 Securizarea datelor . . . . . . . . . . . . . . . . . . . . 1938.3.3 Implementarea interfet¸ei Externalizable . . . . . . . . . 194

    8.4 Clonarea obiectelor . . . . . . . . . . . . . . . . . . . . . . . . 196

    9 Interfat ¸a gracă cu utilizatorul 1999.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

    9.2 Modelul AWT . . . . . . . . . . . . . . . . . . . . . . . . . . . 2009.2.1 Componentele AWT . . . . . . . . . . . . . . . . . . . 2029.2.2 Suprafeţe de aşare (Clasa Container) . . . . . . . . . 204

    9.3 Gestionarea poziţ ion ării . . . . . . . . . . . . . . . . . . . . . 2069.3.1 Folosirea gestionarilor de poziţ ionare . . . . . . . . . . 207

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    7/461

    6 CUPRINS

    9.3.2 Gestionarul FlowLayout . . . . . . . . . . . . . . . . . 2099.3.3 Gestionarul BorderLayout . . . . . . . . . . . . . . . . 2109.3.4 Gestionarul GridLayout . . . . . . . . . . . . . . . . . 211

    9.3.5 Gestionarul CardLayout . . . . . . . . . . . . . . . . . 2129.3.6 Gestionarul GridBagLayout . . . . . . . . . . . . . . . 2149.3.7 Gruparea componentelor (Clasa Panel) . . . . . . . . . 218

    9.4 Tratarea evenimentelor . . . . . . . . . . . . . . . . . . . . . . 2199.4.1 Exemplu de tratare a evenimentelor . . . . . . . . . . . 2219.4.2 Tipuri de evenimente . . . . . . . . . . . . . . . . . . . 2249.4.3 Folosirea adaptorilor şi a claselor anonime . . . . . . . 227

    9.5 Folosirea ferestrelor . . . . . . . . . . . . . . . . . . . . . . . . 2329.5.1 Clasa Window . . . . . . . . . . . . . . . . . . . . . . . 2329.5.2 Clasa Frame . . . . . . . . . . . . . . . . . . . . . . . . 2339.5.3 Clasa Dialog . . . . . . . . . . . . . . . . . . . . . . . . 2369.5.4 Clasa FileDialog . . . . . . . . . . . . . . . . . . . . . 239

    9.6 Folosirea meniurilor . . . . . . . . . . . . . . . . . . . . . . . . 2429.6.1 Ierarhia claselor ce descriu meniuri . . . . . . . . . . . 2439.6.2 Tratarea evenimentelor generate de meniuri . . . . . . 246

    9.6.3 Meniuri de context (popup) . . . . . . . . . . . . . . . 2479.6.4 Acceleratori (Clasa MenuShortcut) . . . . . . . . . . . 2509.7 Folosirea componentelor AWT . . . . . . . . . . . . . . . . . . 250

    9.7.1 Clasa Label . . . . . . . . . . . . . . . . . . . . . . . . 2519.7.2 Clasa Button . . . . . . . . . . . . . . . . . . . . . . . 2529.7.3 Clasa Checkbox . . . . . . . . . . . . . . . . . . . . . . 2539.7.4 Clasa CheckboxGroup . . . . . . . . . . . . . . . . . . 2559.7.5 Clasa Choice . . . . . . . . . . . . . . . . . . . . . . . 2579.7.6 Clasa List . . . . . . . . . . . . . . . . . . . . . . . . . 2599.7.7 Clasa ScrollBar . . . . . . . . . . . . . . . . . . . . . . 2619.7.8 Clasa ScrollPane . . . . . . . . . . . . . . . . . . . . . 2629.7.9 Clasa TextField . . . . . . . . . . . . . . . . . . . . . . 2639.7.10 Clasa TextArea . . . . . . . . . . . . . . . . . . . . . . 265

    10 Desenarea 269

    10.1 Conceptul de desenare . . . . . . . . . . . . . . . . . . . . . . 26910.1.1 Metoda paint . . . . . . . . . . . . . . . . . . . . . . . 27010.1.2 Suprafeţe de desenare - clasa Canvas . . . . . . . . . . 271

    10.2 Contextul grac de desenare . . . . . . . . . . . . . . . . . . . 27410.2.1 Propriet˘aţ ile contextului grac . . . . . . . . . . . . . . 275

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    8/461

    CUPRINS 7

    10.2.2 Primitive grace . . . . . . . . . . . . . . . . . . . . . 27510.3 Folosirea fonturilor . . . . . . . . . . . . . . . . . . . . . . . . 276

    10.3.1 Clasa Font . . . . . . . . . . . . . . . . . . . . . . . . . 277

    10.3.2 Clasa FontMetrics . . . . . . . . . . . . . . . . . . . . . 27910.4 Folosirea culorilor . . . . . . . . . . . . . . . . . . . . . . . . . 28210.5 Folosirea imaginilor . . . . . . . . . . . . . . . . . . . . . . . . 286

    10.5.1 Aşarea imaginilor . . . . . . . . . . . . . . . . . . . . 28710.5.2 Monitorizarea ı̂nc˘arcării imaginilor . . . . . . . . . . . 28910.5.3 Mecanismul de ”double-buffering” . . . . . . . . . . . . 29110.5.4 Salvarea desenelor ı̂n format JPEG . . . . . . . . . . . 291

    10.5.5 Crearea imaginilor ı̂n memorie . . . . . . . . . . . . . 29210.6 Tipărirea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293

    11 Swing 29911.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

    11.1.1 JFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29911.1.2 Swing API . . . . . . . . . . . . . . . . . . . . . . . . . 300

    11.1.3 Asemănări şi deosebiri cu AWT . . . . . . . . . . . . . 30111.2 Folosirea ferestrelor . . . . . . . . . . . . . . . . . . . . . . . . 30411.2.1 Ferestre interne . . . . . . . . . . . . . . . . . . . . . . 305

    11.3 Clasa JComponent . . . . . . . . . . . . . . . . . . . . . . . . 30711.4 Arhitectura modelului Swing . . . . . . . . . . . . . . . . . . . 31011.5 Folosirea modelelor . . . . . . . . . . . . . . . . . . . . . . . . 310

    11.5.1 Tratarea evenimentelor . . . . . . . . . . . . . . . . . . 314

    11.6 Folosirea componentelor . . . . . . . . . . . . . . . . . . . . . 31611.6.1 Componente atomice . . . . . . . . . . . . . . . . . . . 31611.6.2 Componente pentru editare de text . . . . . . . . . . . 31611.6.3 Componente pentru selectarea unor elemente . . . . . . 31911.6 .4 Tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . 32411.6 .5 Arbor i . . . . . . . . . . . . . . . . . . . . . . . . . . . 32911.6.6 Containere . . . . . . . . . . . . . . . . . . . . . . . . . 332

    11.6.7 Dialoguri . . . . . . . . . . . . . . . . . . . . . . . . . 33511.7 Desenarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33611.7.1 Metode specice . . . . . . . . . . . . . . . . . . . . . 33611.7.2 Consideraţ ii generale . . . . . . . . . . . . . . . . . . . 338

    11.8 Look and Feel . . . . . . . . . . . . . . . . . . . . . . . . . . . 340

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    9/461

    8 CUPRINS

    12 Fire de execut ¸ie 34312.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34312.2 Crearea unui r de execuţ ie . . . . . . . . . . . . . . . . . . . 344

    12.2.1 Extinderea clasei Thread . . . . . . . . . . . . . . . . . 34512.2.2 Implementarea interfet¸ei Runnable . . . . . . . . . . . 34712.3 Ciclul de viaţă al unui r de execuţie . . . . . . . . . . . . . . 352

    12.3.1 Terminarea unui r de execut¸ie . . . . . . . . . . . . . 35512.3.2 Fire de execuţie de tip ”daemon” . . . . . . . . . . . . 35712.3.3 Stabilirea priorit˘aţilor de execuţ ie . . . . . . . . . . . . 35812.3.4 Sincronizarea relor de execuţ ie . . . . . . . . . . . . . 36212.3.5 Scenariul produc ător / consumator . . . . . . . . . . . 36212.3.6 Monitoare . . . . . . . . . . . . . . . . . . . . . . . . . 36712.3.7 Semafoare . . . . . . . . . . . . . . . . . . . . . . . . . 36912.3.8 Probleme legate de sincronizare . . . . . . . . . . . . . 371

    12.4 Gruparea relor de execuţ ie . . . . . . . . . . . . . . . . . . . 37312.5 Comunicarea prin uxuri de tip ”pipe” . . . . . . . . . . . . . 37612.6 Clasele Timer şi TimerTask . . . . . . . . . . . . . . . . . . . 378

    13 Programare ı̂n ret ¸ea 38313.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38313.2 Lucrul cu URL-uri . . . . . . . . . . . . . . . . . . . . . . . . 38513.3 Socket-uri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38713.4 Comunicarea prin conexiuni . . . . . . . . . . . . . . . . . . . 38813.5 Comunicarea prin datagrame . . . . . . . . . . . . . . . . . . . 39313.6 Trimiterea de mesaje c ătre mai mulţ i clienţi . . . . . . . . . . 397

    14 Appleturi 40114.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40114.2 Crearea unui applet simplu . . . . . . . . . . . . . . . . . . . . 40214.3 Ciclul de viaţă al unui applet . . . . . . . . . . . . . . . . . . 40414.4 Interfaţ a grac ă cu utilizatorul . . . . . . . . . . . . . . . . . . 40614.5 Denirea şi folosirea parametrilor . . . . . . . . . . . . . . . . 40814.6 Tag-ul APPLET . . . . . . . . . . . . . . . . . . . . . . . . . 410

    14.7 Folosirea relor de execuţie ̂ın appleturi . . . . . . . . . . . . . 41214.8 Alte metode oferite de clasa Applet . . . . . . . . . . . . . . . 41614.9 Arhivarea appleturilor . . . . . . . . . . . . . . . . . . . . . . 42014.10Restricţ ii de securitate . . . . . . . . . . . . . . . . . . . . . . 42114.11Appleturi care sunt şi aplicat ¸ii . . . . . . . . . . . . . . . . . . 421

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    10/461

    CUPRINS 9

    15 Lucrul cu baze de date 42315.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423

    15.1.1 Generalit ăţ i despre baze de date . . . . . . . . . . . . . 423

    15.1.2 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . 42415.2 Conectarea la o baz ă de date . . . . . . . . . . . . . . . . . . . 42515.2.1 Inregistrarea unui driver . . . . . . . . . . . . . . . . . 42615.2.2 Specicarea unei baze de date . . . . . . . . . . . . . . 42715.2.3 Tipuri de drivere . . . . . . . . . . . . . . . . . . . . . 42815.2.4 Realizarea unei conexiuni . . . . . . . . . . . . . . . . 430

    15.3 Efectuarea de secvenţ e SQL . . . . . . . . . . . . . . . . . . . 43115.3.1 Interfaţ a Statement . . . . . . . . . . . . . . . . . . . . 43215.3.2 Interfaţ a PreparedStatement . . . . . . . . . . . . . . . 43415.3.3 Interfaţ a CallableStatement . . . . . . . . . . . . . . . 43715.3.4 Obţinerea şi prelucrarea rezultatelor . . . . . . . . . . 43815.3.5 Interfaţ a ResultSet . . . . . . . . . . . . . . . . . . . . 43815.3.6 Exemplu simplu . . . . . . . . . . . . . . . . . . . . . . 440

    15.4 Lucrul cu meta-date . . . . . . . . . . . . . . . . . . . . . . . 44215.4.1 Interfaţ a DatabaseMetaData . . . . . . . . . . . . . . . 442

    15.4.2 Interfaţ a ResultSetMetaData . . . . . . . . . . . . . . 44316 Lucrul dinamic cu clase 445

    16.1 Incărcarea claselor ̂ın memorie . . . . . . . . . . . . . . . . . . 44516.2 Mecanismul reect̆arii . . . . . . . . . . . . . . . . . . . . . . 452

    16.2.1 Examinarea claselor şi interfet ¸elor . . . . . . . . . . . . 45316.2.2 Manipularea obiectelor . . . . . . . . . . . . . . . . . . 45616.2.3 Lucrul dinamic cu vectori . . . . . . . . . . . . . . . . 460

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    11/461

    10 CUPRINS

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    12/461

    Capitolul 1

    Introducere ı̂n Java

    1.1 Ce este Java ?Java este o tehnologie inovatoare lansat˘ a de compania Sun Microsystems ı̂n1995, care a avut un impact remarcabil asupra ı̂ntregii comunit˘ aţ i a dez-voltatorilor de software, impunˆ andu-se prin calit˘aţ i deosebite cum ar sim-

    plitate, robustet ¸e şi nu ı̂n ultimul rˆ and portabilitate. Denumit˘ a iniţial OAK ,tehnologia Java este format˘ a dintr-un limbaj de programare de nivel ı̂nalt pebaza căruia sunt construite o serie de platforme destinate implement˘ arii deaplicaţ ii pentru toate segmentele industriei software.

    1.1.1 Limbajul de programare Java

    Inainte de a prezenta ı̂n detaliu aspectele tehnice ale limbajului Java, s˘ a am-intim caracteristicile sale principale, care l-au transformatı̂ntr-un interval detimp at ât de scurt ı̂ntr-una din cele mai pupulare opt ¸iuni pentru dezvoltareade aplicaţ ii, indiferent de domeniu sau de complexitatea lor.

    • Simplitate - elimină suprâınc˘arcarea operatorilor, moştenirea multipl˘ aşi toate ”facilit˘aţile” ce pot provoca scrierea unui cod confuz.

    • Uşurint ¸ă ı̂n crearea de aplicat¸ii complexe ce folosesc programarea ı̂nreţea, re de execuţ ie, interfaţ ă gracă, baze de date, etc.

    • Robustet ¸e - elimină sursele frecvente de erori ce apar ı̂n programareprin renunţ area la pointeri, administrarea automat˘ a a memoriei şi elim-

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    13/461

    12 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    inarea pierderilor de memorie printr-o procedur˘ a de colectare a obiectelorcare nu mai sunt referite, ce ruleaz˘a ı̂n fundal (”garbage collector”).

    • Complet orientat pe obiecte - elimină complet stilul de programareprocedural.

    • Securitate - este un limbaj de programare foarte sigur, furnizˆ andmecanisme stricte de securitate a programelor concretizate prin: ver-icarea dinamic ă a codului pentru detectarea secvent ¸elor periculoase,impunerea unor reguli stricte pentru rularea proceselor la distant ¸ă, etc.

    • Neutralitate arhitecturală - comportamentul unei aplicat ¸ii Java nudepinde de arhitectura zic˘a a maşinii pe care ruleaz˘a.

    • Portabililtate - Java este un limbaj independent de platforma de lu-cru, aceeaşi aplicat¸ie rul ând făr ă nici o modicare şi făr ă a necesita re-compilarea ei pe sisteme de operare diferite cum ar Windows, Linux,Mac OS, Solaris, etc. lucru care aduce economii substant ¸iale rmelordezvoltatoare de aplicat¸ii.

    • Este compilat şi interpretat , aceasta ind soluţ ia ecient ă pentruobţinerea portabilit˘ aţii.

    • Performant ¸ă - deşi mai lent dec ât limbajele de programare care genereaz˘ aexecutabile native pentru o anumit˘ a platform ă de lucru, compilatorulJava asigur˘a o performanţ ă ridicat ă a codului de octeţ i, astfel ı̂ncˆatviteza de lucru puţ in mai sc ăzut ă nu va un impediment ı̂n dezvoltarea

    de aplicaţ ii oricât de complexe, inclusiv grac ă 3D, animaţ ie, etc.• Este modelat după C şi C++ , trecerea de la C, C++ la Java

    făcându-se foarte uşor.

    1.1.2 Platforme de lucru JavaLimbajul de programare Java a fost folosit la dezvoltarea unor tehnologii ded-

    icate rezolv ării unor probleme din cele mai diverse domenii. Aceste tehnologiiau fost grupate ı̂n aşa numitele platforme de lucru , ce reprezint ă seturi delibrării scrise ı̂n limbajul Java, precum şi diverse programe utilitare, folositepentru dezvoltarea de aplicat ¸ii sau componente destinate unei anume cate-gorii de utilizatori.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    14/461

    1.1. CE ESTE JAVA ? 13

    • J2SE (Standard Edition)Este platforma standard de lucru ce ofer˘ a suport pentru crearea deaplicaţ ii independente şi appleturi.

    De asemenea, aici este inclus ă şi tehnologia Java Web Start ce furnizeazăo modalitate extrem de facil˘a pentru lansarea şi instalarea local˘ a a pro-gramelor scrise ı̂n Java direct de pe Web, oferind cea mai comod˘ a soluţiepentru distribut ¸ia şi actualizarea aplicat ¸iilor Java.

    • J2ME (Micro Edition)Folosind Java, programarea dispozitivelor mobile este extrem de simpl˘ a,platforma de lucru J2ME oferind suportul necesar scrierii de programededicate acestui scop.

    • J2EE (Enterprise Edition)Aceast ă platform ă oferă API-ul necesar dezvolt˘arii de aplicaţ ii com-plexe, formate din componente ce trebuie s˘a ruleze ı̂n sisteme eterogene,cu informaţ iile memorate ı̂n baze de date distribuite, etc.Tot aici g ăsim şi suportul necesar pentru crearea de aplicat¸ii şi servicii

    Web , bazate pe componente cum ar servleturi, pagini JSP, etc.Toate distribut ¸iile Java sunt oferite gratuit şi pot descărcate de pe

    Internet de la adresa ”http://java.sun.com”.In continuare, vom folosi termenul J2SDK pentru a ne referi la distribut ¸ia

    standard J2SE 1.5 SDK (Tiger).

    1.1.3 Java: un limbaj compilat şi interpretatIn funcţ ie de modul de execuţ ie a aplicaţ iilor, limbajele de programare seı̂mpart ı̂n dou˘ a categorii:

    • Interpretate : instrucţ iunile sunt citite linie cu linie de un programnumit interpretor şi traduse ı̂n instruct ¸iuni maşin˘a. Avantajul aces-tei soluţii este simplitatea şi faptul c˘ a ind interpretat˘ a direct sursaprogramului obţ inem portabilitatea. Dezavantajul evident este vitezade execuţie redus ă. Probabil cel mai cunoscute limbaj interpretat estelimbajul Basic.

    • Compilate : codul sursă al programelor este transformat de compi-lator ı̂ntr-un cod ce poate executat direct de procesor, numit cod

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    15/461

    14 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    maşin ̆a . Avantajul este execut¸ia extrem de rapid˘a, dezavantajul indlipsa portabilit˘aţii, codul compilat ı̂ntr-un format de nivel sc˘ azut nupoate rulat decˆat pe platforma de lucru pe care a fost compilat.

    Limbajul Java combin˘a soluţiile amintite mai sus, programele Java indat ât interpretate cˆ at şi compilate. Aşadar vom avea la dispozit ¸ie un compi-lator responsabil cu transformarea surselor programului ı̂n aşa numitul cod de octet i̧ , precum şi un interpretor ce va executa respectivul cod de octet ¸i.

    Codul de octeţ i este diferit de codul maşin˘a. Codul maşin˘a este reprezen-tat de o succesiune de instruct¸iuni specice unui anumit procesor şi unei an-umite platforme de lucru reprezentate ı̂n format binar astfel ı̂ncˆ at s ă poat ă executate f ăr ă a mai necesita nici o prelucrare.

    Codurile de octeţ i sunt seturi de instruct ¸iuni care seam ănă cu codul scrisı̂n limbaj de asamblare şi sunt generate de compilator independent de mediulde lucru. In timp ce codul maşin˘a este executat direct de c˘atre procesor şipoate folosit numai pe platforma pe care a fost creat, codul de octet ¸i esteinterpretat de mediul Java şi de aceea poate rulat pe orice platform˘ a pecare este instalat˘a mediul de execuţie Java.

    Prin maşina virtual˘ a Java (JVM) vom ı̂nţ elege mediul de execuţ ie alaplicaţ iilor Java. Pentru ca un cod de octet ¸i să poat ă executat pe unanumit calculator, pe acesta trebuie s˘ a e instalat ă o maşin ă virtual ă Java.Acest lucru este realizat automat de c˘ atre distribut¸ia J2SDK.

    1.2 Primul programCrearea oric ărei aplicaţ ii Java presupune efectuarea urm˘ atorilor paşi:

    1. Scriererea codului sursă

    class FirstApp {public static void main( String args[]) {

    System.out.println("Hello world!");}

    }

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    16/461

    1.2. PRIMUL PROGRAM 15

    Toate aplicat¸iile Java conţ in o clasă principal ă(primar˘a) ı̂n care trebuiesă se gasească metoda main . Clasele aplicaţ iei se pot gasi e ı̂ntr-un singurşier, e ı̂n mai multe.

    2. Salvarea şierelor sursă

    Se va face ı̂n şiere care au obligatoriu extensia java , nici o altă exten-sie neind acceptat˘a. Este recomandat ca şierul care cont ¸ine codul surs ăal clasei primare s ă aib ă acelaşi nume cu cel al clasei, deşi acest lucru nueste obligatoriu. S ă presupunem c ă am salvat exemplul de mai sus ı̂n şierulC: \ intro \ FirstApp.java .

    3. Compilarea aplicat ¸iei

    Pentru compilare vom folosi compilatorul javac din distribuţ ia J2SDK.

    Apelul compilatorului se face pentru şierul ce cont¸ine clasa principal˘a aaplicaţ iei sau pentru orice şier/şiere cu extensia java . Compilatorul creeaz˘acâte un şier separat pentru ecare clas˘ a a programului. Acestea au extensia.class şi implicit sunt plasate ı̂n acelaşi director cu şierele surs˘ a.

    javac FirstApp.java

    In cazul ı̂n care compilarea a reuşit va generat şierul FirstApp.class .

    4. Rularea aplicat ¸iei

    Se face cu interpretorul java , apelat pentru unitatea de compilare core-spunzătoare clasei principale. Deoarece interpretorul are ca argument deintrare numele clasei principale şi nu numele unui şier, ne vom pozit ¸ionaı̂n directorul ce cont¸ine şierul FirstApp.class şi vom apela interpretorul

    astfel:java FirstApp

    Rularea unei aplicat¸ii care nu foloseşte interfat¸ă gracă, se va face ı̂ntr-ofereastr ă sistem.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    17/461

    16 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    Atent ¸ieUn apel de genul java c: \ intro \ FirstApp.class este greşit!

    1.3 Structura lexicală a limbajului Java

    1.3.1 Setul de caractere

    Limbajului Java lucreaz˘a ı̂n mod nativ folosind setul de caractere Unicode.Acesta este un standard internat ¸ional care ı̂nlocuieşte vechiul set de caractereASCII şi care foloseşte pentru reprezentarea caracterelor 2 octet ¸i, ceea ceı̂nseamn˘a că se pot reprezenta 65536 de semne, spre deosebire de ASCII, undeera posibil ă reprezentarea a doar 256 de caractere. Primele 256 caractereUnicode corespund celor ASCII, referirea la celelalte f ăcându-se prin \ uxxxx ,unde xxxx reprezint ă codul caracterului.

    O alt ă caracteristic˘a a setului de caractere Unicode este faptul c˘ a ı̂ntregintervalul de reprezentare a simbolurilor este divizat ı̂n subintervale numiteblocuri , câteva exemple de blocuri ind: Basic Latin, Greek, Arabic, Gothic,Currency, Mathematical, Arrows, Musical, etc.

    Mai jos sunt oferite c âteva exemple de caractere Unicode.

    • \ u0030 - \ u0039 : cifre ISO-Latin 0 - 9

    • \ u0660 - \ u0669 : cifre arabic-indic 0 - 9

    • \ u03B1 - \ u03C9 : simboluri greceşti α − ω

    • \ u2200 - \ u22FF : simboluri matematice ( ∀, ∃,∅, etc.)

    • \ u4e00 - \ u9fff : litere din alfabetul Han (Chinez, Japonez, Coreean)

    Mai multe informaţ ii legate de reprezentarea Unicode pot obt ¸inute laadresa ”http://www.unicode.org”.

    1.3.2 Cuvinte cheieCuvintele rezervate ı̂n Java sunt, cu cˆ ateva excepţ ii, cele din C++ şi au fostenumerate ı̂n tabelul de mai jos. Acestea nu pot folosite ca nume de clase,

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    18/461

    1.3. STRUCTURA LEXICAL ˘ A A LIMBAJULUI JAVA 17

    interfeţ e, variabile sau metode. true, false, null nu sunt cuvinte cheie,dar nu pot nici ele folosite ca nume ı̂n aplicat¸ii. Cuvintele marcate prin ∗sunt rezervate, dar nu sunt folosite.

    abstract double int strictfpboolean else interface superbreak extends long switchbyte final native synchronizedcase finally new thiscatch float package throw

    char for private throwsclass goto* protected transientconst* if public trycontinue implements return voiddefault import short volatiledo instanceof static while

    Incepând cu versiunea 1.5, mai exist˘a şi cuvântul cheie enum.

    1.3.3 IdenticatoriSunt secvenţ e nelimitate de litere şi cifre Unicode, ı̂ncepˆ and cu o liter ă. Dup ăcum am mai spus, identicatorii nu au voie s˘a e identici cu cuvintele rezer-vate.

    1.3.4 LiteraliLiteralii pot de urm ătoarele tipuri:

    • IntregiSunt acceptate 3 baze de numerat ¸ie : baza 10, baza 16 (̂ıncep cu car-acterele 0x) şi baza 8 (̂ıncep cu cifra 0) şi pot de dou˘ a tipuri:

    – normali - se reprezint ă pe 4 octeţi (32 biţ i)

    – lungi - se reprezint ă pe 8 octeţi (64 biţi) şi se termin˘a cu caracterulL (sau l).

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    19/461

    18 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    • Flotant ¸iPentru ca un literal s˘a e considerat otant el trebuie s˘a aibă cel puţin ozecimală dup ă virgul ă, să e ı̂n notat¸ie exponenţ ial ă sau să aibă suxul

    F sau f pentru valorile normale - reprezentate pe 32 bit ¸i, respectiv Dsau d pentru valorile duble - reprezentate pe 64 bit ¸i.Exemple: 1.0, 2e2, 3f, 4D .

    • LogiciSunt reprezentat ¸i de true - valoarea logică de adevăr, respectiv false- valoarea logică de fals.

    Atent ¸ieSpre deosebire de C++, literalii ı̂ntregi 1 şi 0 nu mai au semnicat ¸iade adevărat, respectiv fals.

    • CaracterUn literal de tip caracter este utilizat pentru a exprima caracterele co-dului Unicode. Reprezentarea se face e folosind o liter ă, e o secvenţ̆aescape scrisă ı̂ntre apostrofuri. Secvent ¸ele escape permit specicareacaracterelor care nu au reprezentare grac˘ a şi reprezentarea unor car-actere speciale precum backslash, apostrof, etc. Secvent ¸ele escape pre-

    denite ı̂n Java sunt:– ’ \ b’ : Backspace (BS)– ’ \ t’ : Tab orizontal (HT)– ’ \ n’ : Linie nouă (LF)– ’ \ f’ : Pagină nouă (FF)

    – ’ \ r’ : Inceput de r ând (CR)– ’ \ "’ : Ghilimele– ’ \ ’’ : Apostrof – ’ \\ ’ : Backslash

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    20/461

    1.3. STRUCTURA LEXICAL ˘ A A LIMBAJULUI JAVA 19

    • Şiruri de caractereUn literal şir de caractere este format din zero sau mai multe caractereı̂ntre ghilimele. Caracterele care formeaz˘ a şirul pot caractere grace

    sau secvenţe escape.Dacă şirul este prea lung el poate scris ca o concatenare de subşiruride dimensiune mai mic ă, concatenarea şirurilor realizˆ andu-se cu oper-atorul + , ca ı̂n exemplul: "Ana " + " are " + " mere " . Sirul videste "" .

    După cum vom vedea, orice şir este de fapt o instant¸ă a clasei String ,denit ă ı̂n pachetul java.lang .

    1.3.5 SeparatoriUn separator este un caracter care indic˘ a sfârşitul unei unit˘ aţi lexicale şiınceputul alteia. In Java separatorii sunt urm˘ atorii: ( ) [ ] ; , . .Instrucţ iunile unui program se separ˘a cu punct şi virgul˘a.

    1.3.6 OperatoriOperatorii Java sunt, cu mici deosebiri, cei din C++:

    • atribuirea: =

    • operatori matematici: +, -, *, /, %, ++, -- .Este permis ă notaţ ia prescurtat˘ a de forma lval op= rval : x += 2 n-= 3Exist ă operatori pentru autoincrementare şi autodecrementare (post şipre): x++, ++x, n--, --nEvaluarea expresiilor logice se face prin metoda scurtcircuitului : evalu-area se opreşte ı̂n momentul ı̂n care valoarea de adev˘ ar a expresiei estesigur determinat˘a.

    • operatori logici: &&(and), ||(or), !(not)

    • operatori relaţ ionali: > (shift la dreapta f˘ ar˘a semn)

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    21/461

    20 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    • operatorul if-else : expresie-logica ? val-true : val-false

    • operatorul , (virgul ă) folosit pentru evaluarea secvent ¸ial ă a operaţ iilor:int x=0, y=1, z=2;

    • operatorul + pentru concatenarea şirurilor:

    String s1="Ana";String s2="mere";int x=10;System.out.println(s1 + " are " + x + " " + s2);

    • operatori pentru conversii ( cast ) : (tip-de-data)

    int a = (int)’a’;char c = (char)96;int i = 200;long l = (long)i; //widening conversionlong l2 = (long)200;int i2 = (int)l2; //narrowing conversion

    1.3.7 ComentariiIn Java exist˘a trei feluri de comentarii:

    • Comentarii pe mai multe linii, ı̂nchise ı̂ntre /* şi */.

    • Comentarii pe mai multe linii care t¸in de documentat i̧e, ı̂nchise ı̂ntre/** şi */. Textul dintre cele dou˘ a secvenţe este automat mutat ı̂n

    documentat¸ia aplicaţ iei de către generatorul automat de documentat ¸ie javadoc .

    • Comentarii pe o singur ă linie, care incep cu // .Observaţ ii:• Nu putem scrie comentarii ı̂n interiorul altor comentarii.

    • Nu putem introduce comentarii ı̂n interiorul literalilor caracter sau şirde caractere.

    • Secvenţele /* şi */ pot să apar ă pe o linie după secvenţa // dar ı̂şipierd semnicaţ ia. La fel se ı̂ntampl˘a cu secvenţa // ı̂n comentarii careincep cu /* sau */ .

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    22/461

    1.4. TIPURI DE DATE ŞI VARIABILE 21

    1.4 Tipuri de date şi variabile

    1.4.1 Tipuri de date

    In Java tipurile de date se impart ı̂n dou˘ a categorii: tipuri primitive şitipuri referint ¸ă . Java porneşte de la premiza c˘a ”orice este un obiect”,prin urmare tipurile de date ar trebui s˘ a e de fapt denite de clase şi toatevariabilele ar trebui s˘a memoreze instanţ e ale acestor clase (obiecte). Inprincipiu acest lucru este adev˘arat, ı̂ns˘a, pentru usurint¸a program˘arii, maiexistă şi aşa numitele tipurile primitive de date, care sunt cele uzuale :

    • aritmetice

    – ı̂ntregi : byte (1 octet), short (2), int (4), long (8)

    – reale : float (4 octeti), double (8)

    • caracter : char (2 octeţi)

    • logic : boolean (true şi false )

    In alte limbaje de programare formatul şi dimensiunea tipurilor primitive dedate pot depinde de platforma pe care ruleaz˘ a programul. In Java acest lucrunu mai este valabil, orice dependent¸ă de o anumit ă platform ă specică indeliminat ă.

    Vectorii, clasele şi interfeţ ele sunt tipuri referint ¸ă. Valoarea unei variabilede acest tip este, spre deosebire de tipurile primitive, o referint ¸ă (adres ă dememorie) către valoarea sau mult¸imea de valori reprezentat˘ a de variabilarespectiv ă.

    Exist ă trei tipuri de date din limbajul C care nu sunt suportate de lim-bajul Java. Acestea sunt: pointer , struct şi union . Pointerii au fosteliminaţ i din cauz ă că erau o surs ă constant˘a de erori, locul lor ind luat detipul referinţ ă, iar struct şi union nu ı̂şi mai au rostul atˆ at timp c ât tipurilecompuse de date sunt formate ı̂n Java prin intermediul claselor.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    23/461

    22 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    1.4.2 VariabileVariabilele pot de tip primitiv sau referint ¸e la obiecte (tip referint¸ă). In-diferent de tipul lor, pentru a putea folosite variabilele trebuie declarate şi,eventual, iniţ ializate.

    • Declararea variabilelor: Tip numeVariabila;

    • Iniţializarea variabilelor: Tip numeVariabila = valoare;

    • Declararea constantelor: final Tip numeVariabila;

    Evident, exist˘a posibilitatea de a declara şi init ¸ializa mai multe variabilesau constante de acelaşi tip ı̂ntr-o singur˘ a instrucţ iune astfel:

    Tip variabila1[=valoare1], variabila2[=valoare2],...;

    Convenţ ia de numire a variabilelorı̂n Java include, printre altele, urm˘ atoarelecriterii:

    • variabilele nale (constante) se scriu cu majuscule;

    • variabilele care nu sunt constante se scriu astfel: prima liter˘ a mică iardacă numele variabilei este format din mai mult ¸i atomi lexicali, atunciprimele litere ale celorlalţ i atomi se scriu cu majuscule.

    Exemple:

    final double PI = 3.14;final int MINIM=0, MAXIM = 10;int valoare = 100;char c1=’j’, c2=’a’, c3=’v’, c4=’a’;long numarElemente = 12345678L;String bauturaMeaPreferata = "apa";

    In funcţie de loculı̂n care sunt declarate variabilele seı̂mpartı̂n urm˘ atoatelecategorii:

    a. Variabile membre, declarate ı̂n interiorul unei clase, vizibile pentrutoate metodele clasei respective cˆat şi pentru alte clase ı̂n funct ¸ie denivelul lor de acces (vezi ”Declararea variabilelor membre”).

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    24/461

    1.4. TIPURI DE DATE ŞI VARIABILE 23

    b. Parametri metodelor, vizibili doar ı̂n metoda respectiv˘ a.

    c. Variabile locale, declarate ı̂ntr-o metod˘ a, vizibile doar ı̂n metoda re-spectiv ă.

    d. Variabile locale, declarate ı̂ntr-un bloc de cod, vizibile doar ı̂n bloculrespectiv.

    e. Parametrii de la tratarea except ¸iilor (vezi ”Tratarea except ¸iilor”).

    class Exemplu {

    //Fiecare variabila corespunde situatiei data de numele ei//din enumerarea de mai susint a;public void metoda(int b) {

    a = b ;int c = 10;for(int d=0; d < 10; d++) {

    c --;}try {

    a = b/c;} catch(ArithmeticException e) {

    System.err.println(e.getMessage());}

    }

    }

    Observatii:

    • Variabilele declarate ı̂ntr-un for , rămân locale corpului ciclului:

    for(int i=0; i

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    25/461

    24 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    int x=1;{

    int x=2; //incorect

    }

    1.5 Controlul execut ¸ieiInstrucţ iunile Java pentru controlul execut ¸iei sunt foarte asem˘anătoare celordin limbajul C şi pot ı̂mp˘arţite ı̂n urm˘atoarele categorii:

    • Instrucţ iuni de decizie: if-else, switch-case• Instrucţ iuni de salt: for, while, do-while

    • Instrucţ iuni pentru tratarea except ¸iilor: try-catch-finally, throw

    • Alte instruct¸iuni: break, continue, return, label:

    1.5.1 Instruct ¸iuni de decizieif-else

    if (expresie-logica) {...

    }

    if (expresie-logica) {...

    } else {...

    }

    switch-case

    switch (variabila) {case valoare1:

    ...break;

    case valoare2:

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    26/461

    1.5. CONTROLUL EXECUŢIEI 25

    ...break;

    ...

    default:...}

    Variabilele care pot testate folosind instruct ¸iunea switch nu pot decâtde tipuri primitive.

    1.5.2 Instruct ¸iuni de saltfor

    for(initializare; expresie-logica; pas-iteratie) {//Corpul buclei

    }

    for(int i=0, j=100 ; i < 100 && j > 0; i++, j--) {

    ...}

    Atât la iniţ ializare c ât şi ı̂n pasul de iterat ¸ie pot mai multe instruct ¸iunidespărţ ite prin virgul˘a.

    while

    while (expresie-logica) {...

    }

    do-while

    do {...

    }while (expresie-logica);

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    27/461

    26 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    1.5.3 Instruct ¸iuni pentru tratarea except ¸iilorInstrucţ iunile pentru tratarea except ¸iilor sunt try-catch-finally , respectivthrow şi vor tratate ı̂n capitolul ”Except ¸ii”.

    1.5.4 Alte instruct ¸iuni• break : păr ăseşte forţ at corpul unei structuri repetitive.

    • continue : termina forţ at iterat¸ia curent˘a a unui ciclu şi trece la urm˘atoareiteraţ ie.

    • return [valoare] : termin ă o metod ă şi, eventual, returneaz˘ a o valo-rare.

    • numeEticheta: : Deneşte o etichet ă.Deşi ı̂n Java nu exist˘ a goto , se pot deni totuşi etichete folosite ı̂n expresii

    de genul: break numeEticheata sau continue numeEticheta , utile pentrua controla punctul de ieşire dintr-o structur˘ a repetitiv˘a, ca ı̂nexemplul demai jos:i=0;eticheta:while (i < 10) {

    System.out.println("i="+i);j=0;while (j < 10) {

    j++;

    if (j==5) continue eticheta;if (j==7) break eticheta;System.out.println("j="+j);

    }i++;

    }

    1.6 Vectori1.6.1 Crearea unui vectorCrearea unui vector presupune realizarea urm˘ atoarelor etape:

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    28/461

    1.6. VECTORI 27

    • Declararea vectorului - Pentru a putea utiliza un vector trebuie, ı̂naintede toate, sa-l declar˘am. Acest lucru se face prin expresii de forma:

    Tip[] numeVector; sauTip numeVector[];

    ca ı̂n exemplele de mai jos:

    int[] intregi;String adrese[];

    • Instant ¸ierea

    Declararea unui vector nu implic˘a şi alocarea memoriei necesare pentrureţinerea elementelor. Operat ¸iunea de alocare a memoriei, numit˘ a şiinstanţ ierea vectorului, se realizeaz˘a ı̂ntotdeauna prin intermediul op-eratorului new. Instanţ ierea unui vector se va face printr-o expresie degenul:

    numeVector = new Tip[nrElemente];

    unde nrElemente reprezint ă num ărul maxim de elemente pe care lepoate avea vectorul. In urma instant ¸ierii vor alocaţ i: nrElemente ∗dimensiune (T ip) octeţ i necesari memor ării elementelor din vector, undeprin dimensiune (T ip) am notat num˘arul de octeţ i pe care se reprezint ătipul respectiv.

    v = new int[10];//aloca spatiu pentru 10 intregi: 40 octeti

    c = new char[10];//aloca spatiu pentru 10 caractere: 20 octeti

    Declararea şi instant ¸ierea unui vector pot f˘acute simultan astfel:

    Tip[] numeVector = new Tip[nrElemente];

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    29/461

    28 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    • Iniţ ializarea (opţional) Dup˘a declararea unui vector, acesta poate iniţializat, adic˘a elementele sale pot primi nişte valori init ¸iale, evidentdacă este cazul pentru aşa ceva. In acest caz instant ¸ierea nu mai trebuie

    facut ă explicit, alocarea memoriei f ăcându-se automat ı̂n funct ¸ie denumă rul de elemente cu care se iniţ ializeaz ă vectorul.

    String culori[] = {"Rosu", "Galben", "Verde"};int []factorial = {1, 1, 2, 6, 24, 120};

    Primul indice al unui vector este 0, deci pozit¸iile unui vector cu n ele-mente vor cuprinse ı̂ntre 0 şi n − 1. Nu sunt permise construcţ ii de genul

    Tip numeVector[nrElemente] , alocarea memoriei f ăcându-se doar prin in-termediul opearatorului new.

    int v[10]; //ilegalint v[] = new int[10]; //corect

    1.6.2 Tablouri multidimensionaleIn Java tablourile multidimensionale sunt de fapt vectori de vectori. Deexemplu, crearea şi instant ¸ierea unei matrici vor realizate astfel:

    Tip matrice[][] = new Tip[nrLinii][nrColoane];

    matrice[i] este linia i a matricii şi reprezint˘a un vector cu nrColoaneelemente iar matrice[i][j] este elementul de pe linia i şi coloana j .

    1.6.3 Dimensiunea unui vectorCu ajutorul variabilei length se poate aa num ărul de elemente al unuivector.

    int []a = new int[5];// a.length are valoarea 5

    int m[][] = new int[5][10];// m[0].length are valoarea 10

    Pentru a ı̂nt ¸elege modalitatea de folosire a lui length trebuie menţ ionat c ăecare vector este de fapt o instant¸ă a unei clase iar length este o variabil ăpublică a acelei clase, ı̂n care este reţ inut num˘arul maxim de elemente alvectorului.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    30/461

    1.6. VECTORI 29

    1.6.4 Copierea vectorilorCopierea elementelor unui vector a ı̂ntr-un alt vector b se poate face, eelement cu element, e cu ajutorul metodei System.arraycopy , ca ı̂n exem-plele de mai jos. După cum vom vedea, o atribuire de genul b = a are alt ăsemnicaţ ie decât copierea elementelor lui a ı̂n b şi nu poate folosit ă ı̂nacest scop.

    int a[] = {1, 2, 3, 4};int b[] = new int[4];

    // Varianta 1for(int i=0; i

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    31/461

    30 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    • equals - testarea egalit˘aţii valorilor a doi vectori (au aceleaşi num˘arde elemente şi pentru ecare indice valorile corespunz˘ atoare din cei doivectori sunt egale)

    • ll - atribuie ecărui element din vector o valoare specicat˘a.

    1.6.6 Vectori cu dimensiune variabilă şi eterogeniImplement ări ale vectorilor cu num ăr variabil de elemente sunt oferite declase specializate cum ar Vector sau ArrayList din pachetul java.util .Astfel de obiecte descriu vectori eterogeni, ale c˘aror elemente au tipul Object ,

    şi vor studiaţ i ı̂n capitolul ”Colect¸ii”.

    1.7 Şiruri de caractereIn Java, un şir de caractere poate reprezentat printr-un vector formatdin elemente de tip char , un obiect de tip String sau un obiect de tipStringBuffer .

    Dacă un şir de caractere este constant (nu se doreşte schimbarea cont ¸inutuluisă pe parcursul execuţ iei programului) atunci el va declarat de tipul String ,altfel va declarat de tip StringBuffer . Diferenţa principal˘a ı̂ntre acesteclase este că StringBuffer pune la dispoziţ ie metode pentru modicareaconţinutului şirului, cum ar : append, insert, delete, reverse .Uzual, cea mai folosit ă modalitate de a lucra cu şiruri este prin intermediulclasei String , care are şi unele particularit˘ aţi faţ ă de restul claselor menite s ă

    simplice cât mai mult folosirea şirurilor de caractere. Clasa StringBufferva utilizat ă predominant ı̂n aplicat ¸ii dedicate proces ării textelor cum ar editoarele de texte.

    Exemple echivalente de declarare a unui şir:

    String s = "abc";String s = new String("abc");char data[] = {’a’, ’b’, ’c’};

    String s = new String(data);

    Observaţ i prima variant˘ a de declarare a şirului s din exemplul de mai sus- de altfel, cea mai folosită - care prezint ă o particularitate a clasei Stringfaţa de restul claselor Java referitoare la instant ¸ierea obiectelor sale.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    32/461

    1.8. FOLOSIREA ARGUMENTELOR DE LA LINIA DE COMAND ˘ A 31

    Concatenarea şirurilor de caractere se face prin intermediul operatorului+ sau, ı̂n cazul şirurilor de tip StringBuffer , folosind metoda append .

    String s1 = "abc" + "xyz";String s2 = "123";String s3 = s1 + s2;

    In Java, operatorul de concatenare + este extrem de exibil, ı̂n sensul c˘ apermite concatenarea şirurilor cu obiecte de orice tip care au o reprezentarede tip şir de caractere. Mai jos, sunt cˆ ateva exemple:

    System.out.print("Vectorul v are" + v.length + " elemente");String x = "a" + 1 + "b"

    Pentru a l˘amuri puţ in lucrurile, ceea ce execut ă compilatorul atunci cˆandı̂ntˆalneşte o secvenţ ă de genul String x = "a" + 1 + "b" este:

    String x = new StringBuffer().append("a").append(1).append("b").toString()

    Atenţ ie ı̂ns ă la ordinea de efectuare a operat¸iilor. Şirul s=1+2+"a"+1+2va avea valoarea "3a12" , primul + ind operatorul matematic de adunareiar al doilea +, cel de concatenare a şirurilor.

    1.8 Folosirea argumentelor de la linia de co-mandă

    1.8.1 Transmiterea argumentelorO aplicaţ ie Java poate primi oricˆate argumente de la linia de comanda ı̂nmomentul lans ării ei. Aceste argumente sunt utile pentru a permite utiliza-torului s ă specice diverse opţiuni legate de funcţ ionarea aplicat¸iei sau săfurnizeze anumite date init¸iale programului.

    Atent ¸ieProgramele care folosesc argumente de la linia de comand˘a nu sunt 100%

    pure Java, deoarece unele sisteme de operare, cum ar Mac OS, nu au ı̂nmod normal linie de comand ă.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    33/461

    32 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    Argumentele de la linia de comand˘a sunt introduse la lansarea unei aplicat ¸ii,

    ind specicate dup ă numele aplicaţ iei şi separate prin spat ¸iu. De exemplu,să presupunem c ă aplicaţ ia Sortare ordonează lexicograc (alfabetic) liniileunui şier şi primeşte ca argument de intrare numele şierului pe care s˘ aı̂l sorteze. Pentru a ordona şierul "persoane.txt" , aplicaţ ia va lansat ăastfel:

    java Sortare persoane.txt

    Aşadar, formatul general pentru lansarea unei aplicat ¸ii care primeşte argu-mente de la linia de comand ă este:

    java NumeAplicatie [arg0 arg1 . . . argn]

    In cazul ı̂n care sunt mai multe, argumentele trebuie separate prin spat ¸iiiar dac ă unul dintre argumente cont ¸ine spaţ ii, atunci el trebuie pus ı̂ntreghilimele. Evident, o aplicaţ ie poate s ă nu primeasc ă nici un argument saupoate s ă ignore argumentele primite de la linia de comand˘ a.

    1.8.2 Primirea argumentelorIn momentul lans ării unei aplicaţ ii interpretorul parcurge linia de comand˘ a cucare a fost lansat˘a aplicaţ tia şi, ı̂n cazul ı̂n care exist˘ a, transmite programuluiargumentele specicate sub forma unui vector de şiruri. Acesta este primitde aplicaţ ie ca parametru al metodei main . Reamintim c ă formatul metodei main din clasa principal ă este:

    public static void main (String args[])

    Vectorul args primit ca parametru de metoda main va conţine toate argu-mentele transmise programului de la linia de comand˘ a.In cazul apelului java Sortare persoane.txt vectorul args va conţine unsingur element pe prima s ă poziţie: args[0]="persoane.txt" .

    Vectoru args este instanţ iat cu un num˘ar de elemente egal cu num ărul ar-gumentelor primite de la linia de comand˘a. Aşadar, pentru a aa num˘ arul deargumente primite de program este sucient s˘ a aăm dimensiunea vectoruluiargs prin intermediul atributului length :

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    34/461

    1.8. FOLOSIREA ARGUMENTELOR DE LA LINIA DE COMAND ˘ A 33

    public static void main (String args[]) {int numarArgumente = args.length ;

    }

    In cazul ı̂n care aplicat¸ia presupune existent¸a unor argumente de la liniade comand ă, ı̂ns˘a acestea nu au fost transmise programului la lansarea sa, vorapărea excepţ ii (erori) de tipul ArrayIndexOutOfBoundsException . Tratareaacestor excepţ ii este prezentat˘a ı̂n capitolul ”Except ¸ii”.Din acest motiv, este necesar s˘a test ăm dac ă programul a primit argumentelede la linia de comand ă necesare pentru funct¸ionarea sa şi, ı̂n caz contrar, s˘ aaşeze un mesaj de avertizare sau s˘a folosească nişte valori implicite, ca ı̂n

    exemplul de mai jos:

    public class Salut {public static void main (String args[]) {

    if (args.length == 0) {System.out.println("Numar insuficient de argumente!");System.exit(-1); //termina aplicatia

    }String nume = args[0]; //exista sigurString prenume;if (args.length >= 1)

    prenume = args[1];else

    prenume = ""; //valoare implicitaSystem.out.println("Salut " + nume + " " + prenume);

    }}

    Spre deosebire de limbajul C, vectorul primit de metoda main nu conţinepe prima poziţ ie numele aplicaţ iei, ı̂ntrucˆat ı̂n Java numele aplicat ¸iei estechiar numele clasei principale, adic˘a a clasei ı̂n care se gaseşte metoda main .

    Să consideră ı̂n continuare un exemplu simplu ı̂n care se doreşte aşareape ecran a argumentelor primite de la linia de comand˘ a:

    public class Afisare {public static void main (String[] args) {

    for (int i = 0; i < args.length; i++)System.out.println(args[i]);

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    35/461

    34 CAPITOLUL 1. INTRODUCERE ÎN JAVA

    }}

    Un apel de genul java Afisare Hello Java va produce urm ătorul rezul-tat (aplicat¸ia a primit 2 argumente):

    HelloJava

    Apelul java Afisare "Hello Java" va produce ı̂ns˘a alt rezultat (aplicat ¸iaa primit un singur argument):

    Hello Java

    1.8.3 Argumente numericeArgumentele de la linia de comand˘a sunt primite sub forma unui vector deşiruri (obiecte de tip String ). In cazul ı̂n care unele dintre acestea reprezint˘ avalori numerice ele vor trebui convertite din şiruri ı̂n numere. Acest lucruse realizează cu metode de tipul parse TipNumeric aate ı̂n clasa corespun-zatoare tipului ı̂n care vrem s˘ a facem conversia: Integer, Float, Double ,etc.

    Să considerăm, de exemplu, c ă aplicaţ ia Power ridică un numar real la oputere ı̂ntreag˘ a, argumentele ind trimise de la linia de comand˘ a sub forma:

    java Power "1.5" "2" //ridica 1.5 la puterea 2

    Conversia celor dou ă argumente ı̂n numere se va face astfel:

    public class Power {public static void main(String args[]) {

    double numar = Double.parseDouble(args[0]);int putere = Integer.parseInt(args[1]);System.out.println("Rezultat=" + Math.pow(numar, putere));

    }}

    Metodele de tipul parse TipNumeric pot produce excepţ ii (erori) de tipulNumberFormatException ı̂n cazulı̂n care şirul primit ca parametru nu reprezint˘ aun numar de tipul respectiv. Tratarea acestor except ¸ii este prezentat˘a ı̂ncapitolul ”Except¸ii”.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    36/461

    Capitolul 2

    Obiecte şi clase

    2.1 Ciclul de viat ¸ă al unui obiect

    2.1.1 Crearea obiectelorIn Java, ca ı̂n orice limbaj de programare orientat-obiect, crearea obiectelor

    se realizează prin instant ̧ierea unei clase şi implică urm ătoarele lucruri:• Declararea

    Presupune specicarea tipului acelui obiect, cu alte cuvinte specicareaclasei acestuia (vom vedea c ă tipul unui obiect poate şi o interfat ¸ă).

    NumeClasa numeObiect;

    • Instant ¸ierea

    Se realizează prin intermediul operatorului new şi are ca efect creareaefectivă a obiectului cu alocarea spat¸iului de memorie corespunz ător.

    numeObiect = new NumeClasa();

    • Iniţ ializareaSe realizează prin intermediul constructorilor clasei respective. Init ¸ializareaeste de fapt parte integrant˘ a a procesului de instanţ iere, ı̂n sensul c ă

    imediat dup˘a alocarea memoriei ca efect al operatorului new este apelatconstructorul specicat. Parantezele rotunde de dup˘ a numele clasei in-dică faptul c ă acolo este de fapt un apel la unul din constructorii claseişi nu simpla specicare a numelui clasei.Mai general, instant¸ierea şi iniţ ializarea apar sub forma:

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    37/461

    36 CAPITOLUL 2. OBIECTE ŞI CLASE

    numeObiect = new NumeClasa([argumente constructor]);

    Să consider ăm urm ătorul exemplu, ı̂n care declar˘ am şi instant¸iem dou ă

    obiecte din clasa Rectangle , clasă ce descrie suprafeţe grace rectangulare,denite de coordonatele colţ ului st ânga sus (originea) şi l ăţ imea, respectivı̂n ălţimea.

    Rectangle r1, r2;r1 = new Rectangle();r2 = new Rectangle(0, 0, 100, 200);

    In primul caz Rectangle() este un apel către constructorul clasei Rectanglecare este responsabil cu iniţ ializarea obiectului cu valorile implicite. Dup˘ acum observăm ı̂n al doilea caz, iniţ ializarea se poate face şi cu anumit¸i para-metri, cu condiţ ia să existe un constructor al clasei respective care s˘ a accepteparametrii respectivi.

    Fiecare clasă are un set de constructori care se ocup˘a cu iniţializareobiectelor nou create. De exemplu, clasa Rectangle are urm ătorii construc-

    tori:public Rectangle()public Rectangle(int latime, int inaltime)public Rectangle(int x, int y, int latime, int inaltime)public Rectangle(Point origine)public Rectangle(Point origine, int latime, int inaltime)public Rectangle(Point origine, Dimension dimensiune)

    Declararea, instant ¸ierea şi iniţ ializarea obiectului pot ap˘ area pe aceeaşilinie (cazul cel mai uzual):

    Rectangle patrat = new Rectangle(0, 0, 100, 100);

    Obiecte anonimeEste posibil ă şi crearea unor obiecte anonime care servesc doar pentru

    iniţializarea altor obiecte, cazı̂n care etapa de declarare a referint ¸ei obiectuluinu mai este prezent˘a:

    Rectangle patrat = new Rectangle(new Point(0,0),new Dimension(100, 100));

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    38/461

    2.1. CICLUL DE VIAŢ ˘ A AL UNUI OBIECT 37

    Spat¸iul de memorie nu este pre-alocatDeclararea unui obiect nu implic˘a sub nici o formă alocarea de spaţ iu

    de memorie pentru acel obiect. Alocarea memoriei se face doar la apelul

    operatorului new.Rectangle patrat;patrat.x = 10;//Eroare - lipseste instantierea

    2.1.2 Folosirea obiectelor

    Odat ă un obiect creat, el poate folosit ı̂n urm˘ atoarele sensuri: aarea unorinformaţ ii despre obiect, schimbarea st˘arii sale sau executarea unor act¸iuni.Aceste lucruri se realizeaza prin aarea sau schimbarea valorilor variabilelorsale, respectiv prin apelarea metodelor sale.

    Referirea valorii unei variabile se face prin obiect.variabila De exem-plu clasa Rectangle are variabilele publice x, y, width, height, origin .Aarea valorilor acestor variabile sau schimbarea lor se face prin construct ¸ii

    de genul:Rectangle patrat = new Rectangle(0, 0, 100, 200);System.out.println(patrat.width); //afiseaza 100patrat.x = 10;patrat.y = 20; //schimba origineapatrat.origin = new Point(10, 20); //schimba originea

    Accesul la variabilele unui obiect se face ı̂n conformitate cu drepturile deacces pe care le oferă variabilele respective celorlalte clase. (vezi ”Modica-tori de acces pentru membrii unei clase”)

    Apelul unei metode se face prin obiect.metoda([parametri]) .

    Rectangle patrat = new Rectangle(0, 0, 100, 200);patrat.setLocation(10, 20); //schimba origineapatrat.setSize(200, 300); //schimba dimensiunea

    Se observă că valorile variabilelor pot modicate indirect prin inter-mediul metodelor sale. Programarea orientat˘ a obiect descurajeaz˘a folosireadirect ă a variabilelor unui obiect deoarece acesta poate adus ı̂n st˘ ari in-consistente (ireale). In schimb, pentru ecare variabil˘ a care descrie starea

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    39/461

    38 CAPITOLUL 2. OBIECTE ŞI CLASE

    obiectului trebuie s˘a existe metode care s ă permit ă schimbarea/aarea val-orilor variabilelor sale. Acestea se numesc metode de accesare , sau metodesetter - getter şi au numele de forma set Variabila , respectiv get Variabila .

    patrat.width = -100; //stare inconsistentapatrat.setSize(-100, -200); //metoda setter//metoda setSize poate sa testeze daca noile valori sunt//corecte si sa valideze sau nu schimbarea lor

    2.1.3 Distrugerea obiectelorMulte limbaje de programare impun ca programatorul s˘ a ţin ă evidenţa obiectelorcreate şi s ă le distrug ă ı̂n mod explicit atunci cˆand nu mai este nevoie de ele,cu alte cuvinte s ă administreze singur memoria ocupat˘ a de obiectele sale.Practica a demonstrat c˘ a aceast ă tehnic ă este una din principalele furnizoarede erori ce duc la funcţionarea defectuoas˘a a programelor.

    In Java programatorul nu mai are responsabilitatea distrugerii obiectelorsale ı̂ntrucˆat, ı̂n momentul rul˘ arii unui program, simultan cu interpretorul

    Java, ruleaz˘a şi un proces care se ocupă cu distrugerea obiectelor care numai sunt folosite. Acest proces pus la dispoziţ ie de platforma Java de lucruse numeşte garbage collector (colector de gunoi), prescurtat gc.

    Un obiect este eliminat din memorie de procesul de colectare atunci cˆ andnu mai exist ă nici o referinţ ă la acesta. Referinţ ele (care sunt de fapt vari-abile) sunt distruse dou˘a moduri:

    • natural , atunci c ând variabila respectiv˘a iese din domeniul său de viz-ibilitate, de exemplu la terminarea metodei ı̂n care ea a fost declarat˘ a;

    • explicit , dacă atribuim variabilei respective valoare null .

    Cum funct ¸ionează colectorul de gunoaie ?

    Colectorul de gunoaie este un proces de prioritate scazut˘ a care se exe-cut ă periodic, scaneaz ă dinamic memoria ocupat˘a de programul Java aatı̂n execuţ ie şi marcheaz˘a acele obiecte care au referinţ e directe sau indirecte.După ce toate obiectele au fost parcurse, cele care au r˘amas nemarcate sunteliminate automat din memorie.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    40/461

    2.2. CREAREA CLASELOR 39

    Apelul metodei gc din clasa System sugerează maşinii virtuale Java s˘ a”depun ă eforturi” ı̂n recuperarea memoriei ocupate de obiecte care nu maisunt folosite, f ăr ă a forţa ı̂ns˘a pornirea procesului.

    FinalizareInainte ca un obiect s˘a e eliminat din memorie, procesul gc d ă acelui

    obiect posibilitatea ”s˘a cureţe dup ă el”, apelând metoda de nalizare a obiec-tului respectiv. Uzual, ı̂n timpul naliz˘ arii un obiect ı̂şi inchide sierele şisocket-urile folosite, distruge referint¸ele către alte obiecte (pentru a uşsurasarcina colectorului de gunoaie), etc.

    Codul pentru nalizarea unui obiect trebuie scris ı̂ntr-o metod˘ a specialănumita finalize a clasei ce descrie obiectul respectiv. (vezi ”Clasa Object”)

    Atent ¸ieNu confundati metoda nalize din Java cu destructorii din C++. Metoda

    nalize nu are rolul de a distruge obiectul ci este apelat˘ a automat ı̂nainte de

    eliminarea obiectului respectiv din memorie.

    2.2 Crearea claselor

    2.2.1 Declararea claselorClasele reprezint ă o modalitate de a introduce noi tipuri de date ı̂ntr-oaplicaţ ie Java, cealalt˘a modalitate ind prin intermediul interfet ¸elor. Declarareaunei clase respect ă urm ătorul format general:

    [public][abstract][final]class NumeClasa[extends NumeSuperclasa][implements Interfata1 [, Interfata2 ... ]]{

    // Corpul clasei}

    Aşadar, prima parte a declarat ¸iei o ocupă modicatorii clasei. Aceştiasunt:

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    41/461

    40 CAPITOLUL 2. OBIECTE ŞI CLASE

    • publicImplicit, o clas ă poate folosit ă doar de clasele aate ı̂n acelaşi pa-chet(libr ărie) cu clasa respectiv ă (dac ă nu se specică un anume pa-

    chet, toate clasele din directorul curent sunt considerate a ı̂n acelaşipachet). O clas ă declarat ă cu public poate folosită din orice alt ăclasă, indiferent de pachetul ı̂n care se g˘aseşte.

    • abstractDeclar ă o clasă abstract˘a (şablon). O clas˘a abstract˘a nu poate instanţ iat ă, ind folosită doar pentru a crea un model comun pentru oserie de subclase. (vezi ”Clase şi metode abstracte”)

    • nalDeclar ă că respectiva clas ă nu poate avea subclase. Declarare claselornale are dou ă scopuri:

    – securitate : unele metode pot aştepta ca parametru un obiect alunei anumite clase şi nu al unei subclase, dar tipul exact al unuiobiect nu poate aat cu exactitate decat ı̂n momentul executiei;

    ı̂n felul acesta nu s-ar mai putea realiza obiectivul limbajului Javaca un program care a trecut compilarea s˘ a nu mai e susceptibilde nici o eroare.

    – programare ı̂n spririt orientat-obiect : O clasa ”perfect ă” nu tre-buie să mai aib ă subclase.

    După numele clasei putem specica, dac ă este cazul, faptul c ă respectivaclasă este subclas ă a unei alte clase cu numele NumeSuperclasa sau/şi c˘aimplementeaz˘a una sau mai multe interfet¸e, ale căror nume trebuie separateprin virgul ă.

    2.2.2 Extinderea claselorSpre deosebire de alte limbaje de programare orientate-obiect, Java permitedoar moştenirea simplă , ceea ce ı̂neamn ă că o clasă poate avea un singur

    părinte (superclas˘a). Evident, o clas ă poate avea oric âti moştenitori (sub-clase), de unde rezult ă că mulţimea tuturor claselor denite ı̂n Java poate vazut ă ca un arbore, r ădăcina acestuia ind clasa Object . Aşadar, Objecteste singura clas ă care nu are p ărinte, ind foarte important˘ a ı̂n modul delucru cu obiecte si structuri de date ı̂n Java.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    42/461

    2.2. CREAREA CLASELOR 41

    Extinderea unei clase se realizeaz˘a folosind cuvântul cheie extends :

    class B extends A {...}// A este superclasa clasei B// B este o subclasa a clasei A

    O subclas ă moşteneşte de la p˘arintele s ău toate variabilele şi metodelecare nu sunt private.

    2.2.3 Corpul unei clase

    Corpul unei clase urmeaz ă imediat dup ă declararea clasei şi este cuprins ı̂ntreacolade. Conţ inutul acestuia este format din:

    • Declararea şi, eventual, init ¸ializarea variabilelor de instant ¸ă şi de clasă(cunoscute ı̂mpreun˘ a ca variabile membre ).

    • Declararea şi implementarea constructorilor.

    • Declararea şi implementarea metodelor de instant ¸a şi de clas ă (cunos-cute ı̂mpreun˘a ca metode membre ).

    • Declararea unor clase imbricate (interne).

    Spre deosebire de C++, nu este permis˘ a doar declararea metodeiı̂n corpulclasei, urmând ca implementare s˘a e facut ă ı̂n afara ei. Implementareametodelor unei clase trebuie s˘a se facă obligatoriu ı̂n corpul clasei.

    // C++class A {

    void metoda1();int metoda2() {

    // Implementare}

    }

    A::metoda1() {// Implementare

    }

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    43/461

    42 CAPITOLUL 2. OBIECTE ŞI CLASE

    // Javaclass A {

    void metoda1(){

    // Implementare}void metoda2(){

    // Implementare}

    }

    Variabilele unei clase pot avea acelaşi nume cu metodele clasei, care poate chiar numele clasei, făr ă a exista posibilitatea aparit ¸iei vreunei ambiguit˘aţidin punctul de vedere al compilatorului. Acest lucru este ı̂ns˘ a total nere-comandat dac˘a ne gândim din perspectiva lizibilit˘aţii (clarit ăţ ii) codului,dovedind un stil inecient de progamare.

    class A {int A;void A() {};// Corect pentru compilator// Nerecomandat ca stil de programare

    }

    Atent ¸ieVariabilele şi metodele nu pot avea ca nume un cuvˆ ant cheie Java.

    2.2.4 Constructorii unei claseConstructorii unei clase sunt metode speciale care au acelaşi nume cu celal clasei, nu returneaz˘a nici o valoare şi sunt folosiţ i pentru init¸ializarea

    obiectelor acelei clase ı̂n momentul instant ¸ierii lor.

    class NumeClasa {[modificatori] NumeClasa([argumente]) {

    // Constructor

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    44/461

    2.2. CREAREA CLASELOR 43

    }}

    O clasă poate avea unul sau mai mult¸i constructori care trebuie ı̂ns˘ a sădifere prin lista de argumente primite. In felul acesta sunt permise diversetipuri de iniţ ializ ări ale obiectelor la crearea lor, ı̂n funct ¸ie de num ărul para-metrilor cu care este apelat constructorul.

    Să considerăm ca exemplu declararea unei clase care descrie not¸iunea dedreptunghi şi trei posibili constructori pentru aceasta clas˘ a.

    class Dreptunghi {

    double x, y, w, h;Dreptunghi(double x1, double y1, double w1, double h1) {

    // Cel mai general constructorx=x1; y=y1; w=w1; h=h1;System.out.println("Instantiere dreptunghi");

    }Dreptunghi(double w1, double h1) {

    // Constructor cu doua argumentex=0; y=0; w=w1; h=h1;System.out.println("Instantiere dreptunghi");

    }

    Dreptunghi() {// Constructor fara argumentex=0; y=0; w=0; h=0;

    System.out.println("Instantiere dreptunghi");}

    }

    Constructorii sunt apelat ¸i automat la instant ¸ierea unui obiect. In cazulı̂n care dorim s ă apelăm explicit constructorul unei clase folosim expresia

    this( argumente ) ,

    care apeleaz ă constructorul corespunz˘ator (ca argumente) al clasei respec-tive. Aceast ă metod ă este folosită atunci c ând sunt implementat ¸i mai mulţ iconstructori pentru o clas˘ a, pentru a nu repeta secvent ¸ele de cod scrise dejala constructorii cu mai multe argumente (mai generali). Mai ecient, f˘ ară

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    45/461

    44 CAPITOLUL 2. OBIECTE ŞI CLASE

    a repeta aceleaşi secvent¸e de cod ı̂n toţ i constructorii (cum ar aşareamesajului ”Instantiere dreptunghi”), clasa de mai sus poate rescris˘ a astfel:

    class Dreptunghi {double x, y, w, h;Dreptunghi(double x1, double y1, double w1, double h1) {

    // Implementam doar constructorul cel mai generalx=x1; y=y1; w=w1; h=h1;System.out.println("Instantiere dreptunghi");

    }Dreptunghi(double w1, double h1) {

    this(0, 0, w1, h1);// Apelam constructorul cu 4 argumente

    }

    Dreptunghi() {this(0, 0);// Apelam constructorul cu 2 argumente

    }}

    Dintr-o subclas ă putem apela explicit constructorii superclasei cu expresia

    super( argumente ) .

    Să presupunem c ă dorim să creăm clasa Patrat , derivat ă din clasa Dreptungh

    class Patrat extends Dreptunghi {Patrat(double x, double y, double d) {super(x, y, d, d);// Apelam constructorul superclasei

    }}

    Atent ¸ieApelul explcit al unui constructor nu poate ap˘ area dec ât ı̂ntr-un alt con-

    structor si trebuie s˘a e prima instrucţ iune din constructorul respectiv.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    46/461

    2.2. CREAREA CLASELOR 45

    Constructorul implicitConstructorii sunt apelat ¸i automat la instant ¸ierea unui obiect. In cazul

    ı̂n care scriem o clas ă care nu are declarat nici un constructor, sistemul ı̂i

    creează automat un constructor implicit, care nu primeşte nici un argumentşi care nu face nimic. Deci prezenţ a constructorilor ı̂n corpul unei clase nueste obligatorie. Dac ă ı̂ns ă scriem un constructor pentru o clas˘ a, care are maimult de un argument, atunci constructorul implicit (f˘ ar ă nici un argument)nu va mai furnizat implicit de c ătre sistem. S ă consider ăm, ca exemplu,următoarele declarat¸ii de clase:

    class Dreptunghi {double x, y, w, h;// Nici un constructor

    }class Cerc {

    double x, y, r;// Constructor cu 3 argumenteCerc(double x, double y, double r) { ... };

    }

    Să considerăm acum dou ă instanţ ieri ale claselor de mai sus:

    Dreptunghi d = new Dreptunghi();// Corect (a fost generat constructorul implicit)

    Cerc c;c = new Cerc();// Eroare la compilare !

    c = new Cerc(0, 0, 100);// Varianta corecta

    In cazul moştenirii unei clase, instant ¸ierea unui obiect din clasa extins˘a

    implică instanţ ierea unui obiect din clasa p˘arinte. Din acest motiv, ecareconstructor al clasei u va trebui s˘a aibă un constructor cu aceeaşi signatur˘ aı̂n p ărinte sau s ă apeleze explicit un constructor al clasei extinse folosindexpresia super([argumente]) , ı̂n caz contrar ind semnalat˘ a o eroare lacompilare.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    47/461

    46 CAPITOLUL 2. OBIECTE ŞI CLASE

    class A {int x=1;A(int x) { this.x = x;}

    }class B extends A {// CorectB() {super(2);}B(int x) {super.x = x;}

    }

    class C extends A {// Eroare la compilare !C() {super.x = 2;}C(int x) {super.x = x;}

    }

    Constructorii unei clase pot avea urm˘ atorii modicatori de acces:public, protected, private şi cel implicit.

    • publicIn orice alt ă clasă se pot crea instanţ e ale clasei respective.

    • protectedDoar ı̂n subclase pot create obiecte de tipul clasei respective.

    • privateIn nici o altă clasă nu se pot instanţ ia obiecte ale acestei clase. O ast-fel de clasă poate conţ ine metode publice (numite ”factory methods”)care să e responsabile cu crearea obiectelor, controlˆ and ı̂n felul acestadiverse aspecte legate de instant ¸ierea clasei respective.

    • implicitDoar ı̂n clasele din acelaşi pachet se pot crea instant ¸e ale clasei respec-tive.

    2.2.5 Declararea variabilelorVariabilele membre ale unei clase se declar˘a de obicei ı̂naintea metodelor,deşi acest lucru nu este impus de c˘atre compilator.

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    48/461

    2.2. CREAREA CLASELOR 47

    class NumeClasa {// Declararea variabilelor// Declararea metodelor

    }Variabilele membre ale unei clase se declar˘a ı̂n corpul clasei şi nu ı̂n corpul

    unei metode, ind vizibile ı̂n toate metodele respectivei clase. Variabileledeclarate ı̂n cadrul unei metode sunt locale metodei respective.

    Declararea unei variabile presupune specicarea urm˘ atoarelor lucruri:

    • numele variabilei

    • tipul de date al acesteia

    • nivelul de acces la acea variabila din alte clase

    • dacă este constant˘a sau nu

    • dacă este variabil ă de instanţ ă sau de clasă

    • alţi modicatoriGeneric, o variabil ă se declară astfel:

    [modificatori] Tip numeVariabila [ = valoareInitiala ];

    unde un modicator poate :

    • un modicator de acces : public, protected, private (vezi ”Mod-icatori de acces pentru membrii unei clase”)

    • unul din cuvintele rezervate: static, final, transient, volatile

    Exemple de declaraţ ii de variabile membre:

    class Exemplu {double x;

    protected static int n;public String s = "abcd";private Point p = new Point(10, 10);final static long MAX = 100000L;

    }

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    49/461

    48 CAPITOLUL 2. OBIECTE ŞI CLASE

    Să analiz ăm modicatorii care pot specicat¸i pentru o variabil˘a, alţ iidecât cei de acces care sunt tratati ı̂ntr-o sect ¸iune separata: ”Specicatoride acces pentru membrii unei clase”.

    • staticPrezenţ a lui declar ă că o variabil ă este variabil ă de clasă şi nu deinstanţ ă. (vezi ”Membri de instant¸a şi membri de clas ă”)

    int variabilaInstanta ;static int variabilaClasa;

    • nalIndică faptul c ă valoarea variabilei nu mai poate schimbat˘ a, cu altecuvinte este folosit pentru declararea constantelor.

    final double PI = 3.14 ;...PI = 3.141; // Eroare la compilare !

    Prin convenţ ie, numele variabilelor nale se scriu cu litere mari. Folosirealui final aduce o exibilitate sporit˘a ı̂n lucrul cu constante, ı̂n sensulcă valoarea unei variabile nu trebuie specicat˘ a neap ărat la declarareaei (ca ı̂n exemplul de mai sus), ci poate specicat˘a şi ulterior ı̂ntr-unconstructor, dup˘ a care ea nu va mai putea modicat˘a.

    class Test {final int MAX;Test() {

    MAX = 100; // CorectMAX = 200; // Eroare la compilare !

    }}

    • transientEste folosit la serializarea obiectelor, pentru a specica ce variabilemembre ale unui obiect nu particip˘ a la serializare. (vezi ”Serializareaobiectelor”)

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    50/461

    2.2. CREAREA CLASELOR 49

    • volatileEste folosit pentru a semnala compilatorului s˘ a nu execute anumiteoptimiz ări asupra membrilor unei clase. Este o facilitate avansat˘ a a

    limbajului Java.

    2.2.6 this şi superSunt variabile predenite care fac referint ¸a, ı̂n cadrul unui obiect, la obiectulpropriu-zis ( this ), respectiv la instant¸a p ărintelui ( super ). Sunt folositeı̂n general pentru a rezolva conicte de nume prin referirea explicit˘ a a uneivariabile sau metode membre. Dup˘a cum am văzut, utilizate sub form˘a demetode au rolul de a apela constructorii corespunz˘ atori ca argumente ai claseicurente, respectiv ai superclasei

    class A {int x;A() {

    this(0);

    }A(int x) {this.x = x;

    }void metoda() {

    x ++;}

    }

    class B extends A {B() {

    this(0);}B(int x) {

    super(x);

    System.out.println(x);}

    void metoda() {super.metoda();

  • 8/20/2019 Cristian Frasinaru-Curs Practic de Java1

    51/461

    50 CAPITOLUL 2. OBIECTE ŞI CLASE

    System.out.println(x);}

    }

    2.3 Implementarea metodelor

    2.3.1 Declararea metodelorMetodele sunt responsabile cu descrierea comportamentului unui obiect. In-truc ât Java este un limbaj de programare complet orientat-obiect, metodele

    se pot găsi doar ı̂n cadrul claselor. Generic, o metod˘ a se declară astfel:[modificatori] TipReturnat numeMetoda ( [argumente] )

    [throws TipExceptie1, TipExceptie2, ...]{

    // Corpul metodei}

    unde un modicator poate :

    • un specicator de acces : public, protected, private (vezi ”Spec-icatori de acces pentru membrii unei clase”)

    • unul din cuvintele rezervate: static, abstract, final, native,synchronized

    Să analiz ăm modicatorii care pot specicat¸i pentru o metod˘a, alţ ii

    decât cei de acces care sunt tratat ¸i ı̂ntr-o sect¸iune separat˘a.• static

    Prezenţ a lui declar ă că o metod ă este de clasă şi nu de instant¸ă. (vezi”Membri de instant¸a şi membri de clas ă”)

    void metodaInstanta();static void metodaClasa();

    • abstractPermite declararea metode