312 105 5MB
Italian Pages 446
ManualepraticodiJava: dallateoriaallaprogrammazione
ManualepraticodiJava: dallateoriaallaprogrammazione linguaggio,networking,I/O interfaccegrafiche, programmazioneconcorrente
ANDREAGINI–PAOLOAIELLO–LORENZOBETTINI–GIOVANNIPULITI
ManualepraticodiJava:dallateoriaallaprogrammazione AndreaGini–PaoloAiello–LorenzoBettini–GiovanniPuliti
©MokaBytesrl viaBaracca,132 50127Firenze http://www.mokabyte.it e-mail:[email protected]
©2003,TecnicheNuove viaEritrea,21 20157Milano http://www.tecnichenuove.com Redazione: tel.0239090254–0239090257,fax0239090255 e-mail:[email protected] Vendite: tel.0239090251–0239090252,fax0239090373 e-mail:[email protected]
ISBN 88-481-1553-5
Immaginedicopertina:graficaHopsLibrisuprogettodiLorenzoPacini RealizzazioneeditorialeacuradiEscom–Milano
Tuttiidirittisonoriservatianormadileggeeanormadelleconvenzioniinternazionali. Nomiemarchicitatineltestosonogeneralmentedepositatioregistratidallerispettive caseproduttrici.
HopsLibrièunmarchioregistratoTecnicheNuovespa
Indice generale
Prefazione ....................................................................................................... xv IntroduzioneaJava....................................................................................... xvii Lebasidellaprogrammazione.............................................................................xvii Programmaelinguaggiodiprogrammazione ................................................xvii CompilatoreeVirtualMachine .....................................................................xviii Ilprimoapproccioconlaprogrammazione........................................................ xix Icostruttidellaprogrammazione ....................................................................... xxii StrutturabasediunprogrammaJava ........................................................... xxii Commenti...................................................................................................... xxiii Istruzioneelementare.................................................................................... xxiii Sequenza.........................................................................................................xxiv Variabiliintere.................................................................................................xxv Strutturadicontrollodecisionale:ilcostruttoif-else .................................xxvi Strutturadicontrolloiterativa:l’istruzionewhile.......................................xxviii Programmidiesempio ........................................................................................ xxx Cosasipuòfareconquesticostrutti?............................................................... xxxii
Capitolo1-Tipididati .................................................................................... 1 Tipiinteri..................................................................................................................1 Tipinumericifloatingpoint.....................................................................................2 Assegnamentodivariabilifloatingpoint............................................................3 Booleano...................................................................................................................3 Assegnamentosuvariabilibooleane...................................................................4 Caratteri....................................................................................................................5 Promozioniecasting................................................................................................5 Autoincrementoeautodecremento.........................................................................6
vi Indice generale
Capitolo2-Array.............................................................................................. 9 Dichiarazionediarray ............................................................................................10 Assegnamento.........................................................................................................10 Dereferenziazione ..................................................................................................11 Differenzatraassegnamentoedereferenziazione .................................................12 Inizializzazioneautomaticadiunvettore ..............................................................14 Lunghezzadiunvettore ........................................................................................14 Unesempiodimanipolazionedivettori ...............................................................14 Vettorimultidimensionali ......................................................................................16 Vettoriincompleti ..................................................................................................17 Inizializzazioneautomaticadiunvettoremultidimensionale .........................18
Capitolo3-Strutturedicontrollodecisionali............................................... 21 Condizionibooleane ..............................................................................................21 Bloccodiistruzionievariabililocali......................................................................22 if–else...............................................................................................................23 if–elseannidati ................................................................................................24 if–elseconcatenati ...........................................................................................25 Ilcostruttoswitch–case........................................................................................26 Espressionicondizionali ........................................................................................27
Capitolo4-Strutturedicontrolloiterative ................................................... 29 Ciclowhile..............................................................................................................29 Ciclodo–while......................................................................................................30 Ciclofor..................................................................................................................30 Usodelforconparametrimultipli...................................................................31 Ciclinidificati .........................................................................................................33 Usodibreak ...........................................................................................................34 L’istruzionecontinue..............................................................................................34 Usodibreakecontinueinciclinidificati..............................................................35 Usodibreakecontinueconlabel .........................................................................35
Capitolo5-Usodeglioggetti......................................................................... 37 Lametaforadeglioggetti .......................................................................................37 Lostatodiunoggettoeisuoiattributi............................................................38 Lemodalitàdiutilizzodiunoggetto ...............................................................39 Lametaforadeglioggettinellaprogrammazione..................................................39 Creazionediunoggetto....................................................................................40 Ilcomportamentodiunoggettoeisuoimetodi .............................................42
Indice generale vii
Gliattributidiunoggettoeilsuostato ...........................................................42 Interazionecomplessatraoggetti .....................................................................43 Oggettidisistema...................................................................................................43 Stringhe ..................................................................................................................44 LestringheeJava:creazione,concatenazioneeuguaglianza ..........................44 Vettoridinamici......................................................................................................49 UsodiVector.....................................................................................................50 MetodifondamentalidiVector ........................................................................50 Iterator...............................................................................................................51 Conversioneinarray .........................................................................................52 Unesempioriepilogativo ..................................................................................52 Mappehash ............................................................................................................53 Metodiprincipali ..............................................................................................53 Estrazionedell’insiemedichiaviovalori .........................................................54 Wrapperclass .........................................................................................................54
Capitolo6-LeclassiinJava .......................................................................... 57 Incapsulamento ......................................................................................................58 Dichiarazionedimetodo........................................................................................59 Dichiarazionedimetodoconparametri ..........................................................60 Chiamataametodo:ladotnotation ......................................................................60 Parametroattualeeparametroformale............................................................62 Passaggiodiparametribyvalueebyref ..........................................................63 Visibilitàdellevariabili:variabililocali..................................................................64 Ricorsione ...............................................................................................................65 Costruttore .............................................................................................................66 Finalizzatoriegarbagecollection .....................................................................67 Convenzionidinaming ..........................................................................................68 Ereditarietà.............................................................................................................68 Overloading............................................................................................................70 Overriding ..............................................................................................................72 Identificatorispecialithisesuper..........................................................................72 Bindingdinamico ...................................................................................................74 Upcasting,downcastingeoperatoreinstanceof....................................................75 Equalseoperatore==............................................................................................76
Capitolo7-Costruttiavanzati ....................................................................... 77 Classiastratte..........................................................................................................77 Ilcontestostatico:variabiliemetodidiclasse .................................................79
viii Indice generale Interfacce................................................................................................................80 Interfacceperdefinireilcomportamento ........................................................80 Dichiarazioneeimplementazionediinterfacce ...............................................82 Unesempioconcreto ........................................................................................83 Tipiepolimorfismo................................................................................................85 Classieinterfacceinterne ......................................................................................85 Ipackage.................................................................................................................86 Dichiarazionedipackage..................................................................................86 Compilazioneedesecuzione.............................................................................87 Dichiarazioneimport ........................................................................................88 Convenzionidinamingdeipackage.................................................................89 PrincipalipackagedelJDK ..............................................................................89 Modificatori............................................................................................................90 Moficatoridiaccesso.........................................................................................90 Final...................................................................................................................91 Native ................................................................................................................92 Strictfp...............................................................................................................92 Transient,volatileesynchronized ....................................................................92
Capitolo8-Eccezioni..................................................................................... 93 Erroriedeccezioni .................................................................................................93 Gestionedelleeccezioni.........................................................................................94 Costruttotry–catch–finally ...........................................................................95 Gerarchiadelleeccezioni..................................................................................96 Propagazione:l’istruzionethrows ....................................................................97 Lanciodieccezioni:ilcostruttothrow.............................................................98 Catenedieccezioni ...........................................................................................99 Eccezionidefinitedall’utente .........................................................................100 Esempioriepilogativo .....................................................................................101
Capitolo9-AssertinJava:tecnicheefilosofiad’uso................................. 103 Cosasonoleassert ...............................................................................................103 SherlockHolmeselafilosofiadelleAssert ....................................................104 Sintassidelleassert..........................................................................................106 Compilazioneedesecuzionedicodiceconassert .........................................106 Abilitazioneedisabilitazioneselettiva............................................................108
Capitolo10-Input/Output .......................................................................... 109 Introduzione.........................................................................................................109
Indice generale ix
Stream...................................................................................................................109 Leclassi ................................................................................................................110 LaclasseOutputStream.......................................................................................111 Descrizioneclasse ...........................................................................................111 Metodi .............................................................................................................111 LaclasseInputStream ..........................................................................................112 Descrizioneclasse ...........................................................................................112 Metodi .............................................................................................................112 Glistreampredefiniti ...........................................................................................114 Esempi.............................................................................................................114 Streamfiltro..........................................................................................................116 LeclassiFilterOutputStreameFilterInputStream .............................................117 LeclassiDataOutputStreameDataInputStream ...............................................117 DescrizioneclasseDataOutputStream...........................................................118 Costruttore ......................................................................................................118 Metodi .............................................................................................................118 DescrizioneclasseDataInputStream..............................................................119 Costruttore ......................................................................................................119 Metodi .............................................................................................................119 ClassiBufferedOutputStreameBufferedInputStream ......................................120 DescrizioneclasseBufferedOutputStream ....................................................121 Costruttori.......................................................................................................121 Metodi .............................................................................................................121 DescrizioneclasseBufferedInputStream .......................................................122 Costruttori.......................................................................................................122 Metodi .............................................................................................................122 Streamperl’accessoallamemoria .......................................................................122 DescrizioneclasseByteArrayInputStream .....................................................122 Costruttori.......................................................................................................122 Metodi .............................................................................................................123 DescrizioneclasseByteArrayOutputStream ..................................................123 Costruttori.......................................................................................................123 Metodi .............................................................................................................123 DescrizioneclassePipedOutputStream.........................................................124 Costruttori.......................................................................................................125 Metodi .............................................................................................................125 DescrizioneclassePipedInputStream ............................................................125 Costruttori.......................................................................................................125 Metodi .............................................................................................................125
x Indice generale Ifile .......................................................................................................................127 DescrizioneclasseFile ....................................................................................127 Costruttori.......................................................................................................127 Metodi .............................................................................................................128 DescrizioneclasseRandomAccess .................................................................129 Costruttori.......................................................................................................129 Metodi .............................................................................................................130 LeclassiFileOutputStreameFileInputStream .............................................131 DescrizioneclasseFileOutputStream ............................................................131 Costruttori.......................................................................................................131 Metodi .............................................................................................................132 DescrizioneclasseFileInputStream ...............................................................132 Costruttori.......................................................................................................132 Metodi .............................................................................................................132 ClassiReadereWriter..........................................................................................133 LeclassiPrintStreamePrintWriter ...............................................................134 Altreclassiemetodideprecati.............................................................................134
Capitolo11-Programmazioneconcorrente egestionedelmultithreadinJava ................................................................ 135 Introduzione.........................................................................................................135 Processiemultitasking.........................................................................................135 Threademultithreading ......................................................................................138 IthreadelaJavaVirtualMachine .......................................................................139 LaprogrammazioneconcorrenteinJava ............................................................140 Creazioneeterminazionediunthread ..........................................................141 L’interfacciaRunnable ....................................................................................142 Identificazionedelthread ...............................................................................146 Maggiorcontrollosuithread ...............................................................................146 Unafinetranquilla:usciredarun() ................................................................146 Bisognodiriposo:ilmetodosleep()...............................................................147 Giocodisquadra:ilmetodoyield() ...............................................................148 Laleggenonèugualepertutti:lapriorità.....................................................149 El’ultimochiudalaporta:ilmetodojoin() ...................................................151 Interruzionediunthread ...............................................................................154 Metodideprecati.............................................................................................155 Lasincronizzazionedeithread ............................................................................156 Condivisionedidatifrathread.......................................................................156 Competizionefrathread .................................................................................158
Indice generale xi
Lockesincronizzazione..................................................................................162 Visibilitàdellock.............................................................................................164 Deadlock .........................................................................................................165 Classlockesincronizzazionedimetodistatici ..............................................166 Comunicazionefrathread....................................................................................167 Condivisionedidati ........................................................................................167 Utilizzodeimetodiwait()enotify() ...............................................................170 IlmetodonotifyAll() .......................................................................................172 Deamonthread.....................................................................................................172 Igruppidithread.................................................................................................173 Informazionisuithreadesuigruppi ..............................................................174 Threadgroupepriorità ..................................................................................174 Threadgroupesicurezza................................................................................175 LaclasseThreadLocal ....................................................................................176
Capitolo12-LagraficainJava .................................................................... 177 AppleteAWT ......................................................................................................178 Itoplevelcontainer .............................................................................................179 JDialog.............................................................................................................180 Gerarchiadicontenimento..................................................................................181 Layoutmanagement.............................................................................................183 FlowLayout .....................................................................................................184 GridLayout......................................................................................................185 BorderLayout .................................................................................................186 Progettazionetopdowndiinterfaccegrafiche ...................................................188 Lagestionedeglieventi........................................................................................188 Usodiadapternelladefinizionedegliascoltatori ..........................................190 Classianonimeperdefiniregliascoltatori .....................................................191
Capitolo13-Bottoniemenu ....................................................................... 193 Pulsanti .................................................................................................................193 AbstractButton:gestionedell’aspetto ............................................................194 Eventideipulsanti ..........................................................................................195 JButton ............................................................................................................196 JToggleButton .................................................................................................198 JCheckBox.......................................................................................................200 JRadioButton...................................................................................................202 JToolBar...........................................................................................................204 Imenu...................................................................................................................204
xii Indice generale JPopupMenu...................................................................................................207 Gestireglieventiconleaction............................................................................210 Descrizionedell’API .......................................................................................210 UsodelleAction..............................................................................................211
Capitolo14-Controlliperinserimentodati ............................................... 213 Tipologiedicontrolli............................................................................................213 JTextField ........................................................................................................213 JPasswordField ..............................................................................................214 JComboBox.....................................................................................................215 JList .................................................................................................................217 JSlider ..............................................................................................................222 JTextArea.........................................................................................................226
Capitolo15-Pannelli,accessoriedecorazioni........................................... 229 Pannelli .................................................................................................................229 JTabbedPane ........................................................................................................233 Accessoriedecorazioni........................................................................................235 JOptionPane....................................................................................................235 JFileChooser....................................................................................................238 ColorieJColorChooser ..................................................................................240 FonteFontChooser ........................................................................................242 Pluggablelook&feel...........................................................................................246 Border...................................................................................................................249 Un’applicazionegraficacomplessa ......................................................................251
Capitolo16-IldisegnoinJava .................................................................... 257 IldisegnoinJava ..................................................................................................257 JComponenteilmeccanismodidisegno .......................................................257 L’oggettoGraphics..........................................................................................258 Adattareildisegnoalledimensionidelclip ...................................................260 Disegnareimmagini ........................................................................................262 Disegnareiltesto.............................................................................................263 Eventidimouse...............................................................................................266 Eventiditastiera .............................................................................................269 Disegnoamanolibera ....................................................................................272
Indice generale xiii
Capitolo17-Networking............................................................................. 275 Introduzione.........................................................................................................275 Socket ...................................................................................................................276 LaclasseInetAddress...........................................................................................277 Descrizioneclasse ...........................................................................................277 Costruttori.......................................................................................................277 Metodi .............................................................................................................278 Unesempio......................................................................................................278 URL ......................................................................................................................279 Descrizioneclasse ...........................................................................................280 Costruttori.......................................................................................................280 Metodi .............................................................................................................281 Unesempio......................................................................................................282 LaclasseURLConnection....................................................................................283 Descrizioneclasse ...........................................................................................283 Costruttori.......................................................................................................283 Metodi .............................................................................................................283 ImessaggiHTTPGETePOST..........................................................................284 LaclasseSocket....................................................................................................285 Descrizioneclasse ...........................................................................................286 Costruttori.......................................................................................................286 Metodi .............................................................................................................286 Utilizzodellesocket(client-server) ................................................................288 UserDatagramProtocol(UDP) ..........................................................................294 LaclasseDatagramPacket ...................................................................................294 Descrizioneclasse ...........................................................................................295 Costruttori.......................................................................................................295 Metodi .............................................................................................................295 LaclasseDatagramSocket ...................................................................................296 Descrizioneclasse ...........................................................................................296 Costruttori.......................................................................................................296 Metodi .............................................................................................................296 Unesempio......................................................................................................297 NuoveestensionieclassidiutilitypresentinellapiattaformaJava2 .................299 LaclasseHttpURLConnection ...........................................................................299 Metodi .............................................................................................................299 LaclasseJarURLConnection...............................................................................300 Metodi .............................................................................................................301
xiv Indice generale
Capitolo18-JavaBeans................................................................................ 303 Laprogrammazioneacomponenti......................................................................303 LaspecificaJavaBeans .........................................................................................304 IlmodelloacomponentiJavaBeans ....................................................................304 Proprietà..........................................................................................................304 Metodi .............................................................................................................304 Introspezione...................................................................................................305 Personalizzazione ...........................................................................................305 Persistenza.......................................................................................................305 Eventi...............................................................................................................305 Deployment.....................................................................................................306 Guidaall’implementazionedeiJavaBeans ..........................................................306 Leproprietà.....................................................................................................306 UnesempiodiBeanconproprietàbound.....................................................310 EventiBean .....................................................................................................315 UnesempiodiBeanconeventi ......................................................................319 Introspezione:l’interfacciaBeanInfo .............................................................322 Esempio...........................................................................................................323 PersonalizzazionedeiBean.............................................................................325 Serializzazione .................................................................................................329
AppendiceA-Installazionedell’SDK......................................................... 331 SceltadelgiustoSDK...........................................................................................331 InstallazionesuWindows ....................................................................................332 InstallazionesuLinux ..........................................................................................336 Bibliografia ..........................................................................................................337
AppendiceB-Ginipad,unambientedisviluppoperprincipianti ............ 339 Caratteristicheprincipali .....................................................................................340 Tabellariassuntivadeicomandi...........................................................................341 Installazione.........................................................................................................342 CosafareseGinipadnontrovailJDK .........................................................343
AppendiceC-Parolechiave ........................................................................ 345 AppendiceD-Diagrammidiclasseesistemiorientatiaglioggetti .......... 347 ClassieinterfacceUML.......................................................................................348 Ereditarietàerealizzazione ..................................................................................349
Indice generale xv
Associazione .........................................................................................................350 Aggregazione ........................................................................................................351 Dipendenza ..........................................................................................................352
Indiceanalitico.............................................................................................. 353
Prefazione
Esiste, fra chi si occupa di didattica dell’informatica, un accordo pressoché generale su qualiconcettisianoessenzialiperunaintroduzioneallaprogrammazione:programmi,variabili, istruzionidiassegnamentoedicontrollo,procedureequant’altro. Esisteunaccordoquasialtrettantogeneralesulfattochelaprogrammazioneorientataagli oggettieinparticolareillinguaggioJavasianoormaiessenzialinellaformazionediunbuon programmatore. Storicamenteladidatticadellaprogrammazioneèstataimpostatautilizzandolinguaggiimperativirelativamentesemplici,comePascaloC.Laprogrammazioneaoggettivenivaintrodotta inunafasesuccessiva,ecomportavailpassaggioaunlinguaggiodiverso(JavaoC++). DaqualchetemposièverificatalapossibilitàdiutilizzaredirettamenteJavacome“primo linguaggio”diprogrammazione,esaminandoneprimagliaspettielementariesubitodopoquelli piùevoluti,legatiinparticolarealconcettodioggetto.Questoapprocciohadatorisultatisoddisfacenti,inquantoevitaledispersioniderivantidall’usodicontestilinguisticidifferenti.Siè peròscontratoconlacarenzaditestiintroduttivibasatisuJava. Questomanualerispondeall’esigenzadiintrodurreallaprogrammazionepartendo“dazero” eappoggiandosidirettamentesuJava.Rispondeancheaun’altraesigenza:spiegareiconcetti inmodoaccessibilemarigoroso,evitandosialebanalizzazioni,siailricorsoauneccessodi formalismo.Sitrattadiunequilibriodifficile,chesembraesserestatoquiraggiuntoinmodo efficace.Inconcreto:ilmanualehaledimensioni,lacomprensibilità,laprecisioneadeguate perconsentirediacquisireinuntemporagionevoleleconoscenzeelecompetenzedibasesulla programmazioneingeneraleesuJavainparticolare. FRANCESCOTISATO ProfessoreOrdinariodiInformatica CoordinatoredeiCorsidiStudioinInformatica UniversitàdegliStudidiMilano-Bicocca
IntroduzioneaJava ANDREAGINI
Le basi della programmazione Imparareaprogrammareèun’impresatutt’altrochefacile.Chinonhamailavoratoconun computerpotrebberestaredisorientatodallaterminologiaspecialistica,ofarfaticaadapprenderel’usocorrettodeivaristrumenti:compilatori,debugger,editorecosìvia. Ladifficoltàmaggiore,perchisitrovaallaprimaesperienza,èsenzadubbioquelladiriuscire acapirecomeoperaunamacchina.Maunavoltasuperatiiprimiostacoli,crescel’entusiasmo perun’attivitàchesipresentastimolanteericcadisfide,unaprofessioneincuilacreatività dell’uomoèl’unicostrumentochepermettedisopperireallatotaleassenzadicreativitàdella macchina.
Programma e linguaggio di programmazione Java,l’oggettodistudiodiquestolibro,èunlinguaggiodiprogrammazione:perpoterne intraprenderelostudio,èbenechiarirecosasiaunprogramma.Unprogrammaèunasequenza diistruzionichespieganoauncomputeripassinecessariasvolgereundeterminatocompito. Normalmente,ilcompitoconsistenell’elaborareidatiintrodottidall’operatoremedianteuna perifericadiinput,comelatastiera,ilmouseoildisco,enelprodurreundeterminatooutput, comeunreportavideo,unfilesudiscoounfogliostampato.Ilinguaggidiprogrammazione, adifferenzadellinguaggionaturale,hannounlessicopiuttostosempliceconvincolisintattici moltorigidi:talicaratteristichesononecessariepertogliereailinguaggidiprogrammazione l’ambiguitàcaratteristicadeilinguagginaturali,epermetterneun’interpretazioneunivoca. Formalmenteunprogrammaèunsemplicefileditesto,detto“filesorgente”,scrittodalprogrammatoreinundeterminatolinguaggiodiprogrammazione,inquestocasoJava,ricorrendo aunappositoambientedisviluppo,chenelcasodiJavapuòancheessereunsempliceeditor ditestocomeNotepad,EmacsoVi.
xx Introduzione a Java Si noti che l’operatore svolge un ruolo differente a seconda che sia il programmatore o l’utentediunprogramma.Ilprogrammatoreètenutoaconoscereilfunzionamentointerno delprogrammachestarealizzando,mentrel’utentesilimitaaseguireleistruzioniavideo,a inserireidatiquandorichiestiealeggereirisultati.Ogniprogrammatoreètenutoaseguire duelineeguidafondamentali:laprimaèscrivereprogrammichiariefacilidacapire,inmodo dapermettereaeventualicollaboratoridiinterpretareilcodicesenzadifficoltà;lasecondaè realizzareprogrammifacilidausare,perrenderelavitapiùsempliceagliutenti.
Compilatore e Virtual Machine Ilcodicesorgentediunprogrammanonpuòessereeseguitodirettamentedauncalcolatore: primadeveessereelaboratodaunostrumento,dettocompilatore,chetraduceilfilesorgenteinun fileeseguibileinlinguaggiomacchina.Talelinguaggio,sebbenesiaincomprensibileperunessere umano,èidealeperilcalcolatore,cheloeseguedirettamenteotramiteunappositointerprete. IllinguaggioJavaappartieneallacategoriadeilinguaggiinterpretati:ilcompilatore,anziché generare direttamente linguaggio macchina, produce un file eseguibile in un formato detto bytecode,chepuòessereeseguitodaqualsiasicomputergrazieaunospecialeinterprete,chiamatoJavaVirtualMachineoJVM.LatraduzionedeiprogrammiJavainbytecodegarantisce lapienaportabilitàdelcodiceeseguibileche,alcontrariodiquantoavvieneconaltrilinguaggi, puòessereeseguitosuqualsiasicomputerchedispongadiunaJVM,indipendentementedall’architetturadellamacchinaodalsistemaoperativo.
Figura1–UnprogrammaJavacompilatoinbytecodepuògiraresuqualsiasicomputerchedisponga – diunaJavaVirtualMachine.
Codice Java
Compilazione
Bytecode
VirtualMachine
VirtualMachine
VirtualMachine
X86+ Windows
X86+ Linux
G4+ MacOSX
ManualepraticodiJava:dallateoriaallaprogrammazionexxi
LanaturainterpretatadiJavaèallostessotempoilsuopuntodiforzaeilsuolimite:seda unaparteessagarantiscelapienaportabilitàdelfileeseguibileeforniscealprogrammatore serviziadaltolivello(comelagestioneautomaticadellamemoria),dall’altrarisultapenalizzante sulpianodelleprestazioni.D’altraparte,leattualiVirtualMachinesonoingradodiottimizzare automaticamenteleperformancediesecuzionedelbytecodegrazieaunprocessodiricompilazionedinamica,cherendeillinguaggioJavaefficientequantoaltrilinguagginoninterpretati comeC++.Insecondoluogo,illivellodiperformanceraggiuntodallemacchineodierne,dotate diprocessorichesuperanoinvelocitàlasogliadeiGigahertz,ètaledarendereildivariodi prestazionipienamenteaccettabilenellamaggiorpartedeicontestiapplicativi.
Il primo approccio con la programmazione LostudiodiJavapuòesseresuddivisointretappe: 1. Esamedeicostruttidellinguaggio. 2. Filosofiadellaprogrammazioneaoggetti. 3. Introduzioneall’usodeiprincipalistrumentidilibreria. ChisiavvicinaaJavadopoannidiesperienzasulinguaggiprocedurali(comeCoPascal), diprogrammazionebatchinCobolodiprogrammazionehostsumainframe,puòincontrare altrettantedifficoltàdichisitrovaallaprimaesperienzainassoluto.Primadiiniziareilpercorso distudio,èbeneripassarel’insiemedeiconcettichesitrovanoallabasediqualsiasilinguaggio diprogrammazione. Perprendereconfidenzaconiconcettidicodicesorgente,compilatoreeinterprete,èutile portareatermineun’esercitazione.Lacarrieradelprogrammatore,inossequioaunatradizione oramaiconsolidata,prendeilviaconungioiososaluto:“HelloWorld!”HelloWorldèsenza dubbiounodeiprogrammipiùlongevidellastoriadell’informatica:tradottoindecinedilinguaggidifferenti,svolgedaanniunruolodaanfitrione,guidandol’aspiranteprogrammatore allascopertadeiprimisegretidellosvilupposoftware.Selosconosciutoautoreavesseavutola lungimiranzadiregistrarneilbrevetto,certamenteavrebbefattofortuna. IltestodelprogrammainversioneJavaèilseguente: public class HelloWorld { public static void main(String argv[]) { System.out.println(“Hello World!”); } }
xxii Introduzione a Java Figura2–IlsempliceNotepadconsentediscrivereilprimoprogramma.
Il primo compito da svolgere è copiare il testo del programma all’interno del Notepad, rispettandodiligentementelespaziatureeladistinzionetramaiuscoleeminuscole.Unavolta terminata la trascrizione, è necessario salvare il file con il nome “HelloWorld.java”, in una posizionenotadeldiscocomelaradicedeldiscoC. Ilfile“HelloWorld.java”appenacreatoèunesempiodifilesorgente;perpoterloeseguire ènecessarioinnanzituttotradurloinbytecodeconilcompilatore.Ilcompilatorestandardper Javaèunprogrammaarigadicomando,privocioèdiinterfacciagrafica.Perpoterloeseguire, ènecessarioaprirelaconsoledicomandiMSDos,chesitrovanormalmentesottolavoceProgrammidelmenuStartinWindows95/98opuòessererichiamatadigitando“cmd”nelpannello EseguisottoWindows2000/XP. Oraènecessarioportarsisulladirectorynellaqualeilfile“HelloWorld.java”èstatosalvato: se,comeconsigliato,fossestatopostonellarootdeldiscoC,bisognadigitareilcomando“cd c:\”,epremereinvio.Aquestopunto,ènecessariodigitarelaseguenteriga: javac HelloWorld.java
Dopo pochi attimi ricomparirà il cursore, segnalando che la compilazione è andata a buonfine.Nelladirectorydilavoro,oltrealfile“HelloWorld.java”,cisaràoraancheunfile “HelloWorld.class”contenenteilprogrammainbytecode.
ManualepraticodiJava:dallateoriaallaprogrammazionexxiii
Figura3–Ilfilesorgente“HelloWorld.java”eilfile“HelloWorld.class”,risultatodellacompilazione.
Pereseguireilprogramma,orabisognadigitare: java HelloWorld
Ilsistemasimetteràallavoro,edopoqualcheistante,sullaconsoleappariràlascritta: HelloWorld
Benvenutinelmondodellaprogrammazione!
Figura4–EsempiodiutilizzodeitoolJavaceJavadelJDK.
xxiv Introduzione a Java LeistruzionipresentiinquestoparagrafosonovalideperlapiattaformaWindows. L’utenteUnixoLinux,sicuramentepiùespertodiambientiarigadicomando,non dovrebbe incontrare particolari difficoltà nell’adattare le istruzioni al proprio caso mediantepiccolemodifiche.
Chiavessedifficoltàalavorareconeditorditestoestrumentiarigadicomando, puòricorrereaunodeinumerosiambientidisviluppointegratidisponibiliperJava. Unambientedisviluppoèunospecialeeditorchepermettediscrivere,compilare edeseguireunprogrammamedianteun’appositainterfacciagrafica.InAppendiceBsispiegacomeinstallareeusareGinipad,unambientedisviluppogratuito particolarmenteadattoachisiavvicinaperlaprimavoltaaJava.Ginipadèstato sviluppatodaAndreaGininelcontestodiunprogetto,supervisionatodaMokaByte, chehadatovitaancheaquestolibro.
I costrutti della programmazione Dopo aver visto come si scrive, si compila e si esegue un semplice programma, è il momentodiesaminarealcunepossibilivariazioni.Ilinguaggidiprogrammazioneassomigliano allinguaggionaturaleinglese,marispettoaquest’ultimoprevedonovincolisintatticimolto piùrigidi,regolatidauninsiemediregoleformalicheprendonoilnomedigrammatica.Lo studiodiquesteregoleèlachiavechepermetteachiunquelodesideridirealizzareinmaniera autonomadeiprogrammi.
Struttura base di un programma Java Lastrutturabasediunprogramma,inquestiprimiesempi,saràsempredeltipo: public class NomeProgramma { public static void main(String argv[]) { } }
Ilnomedelprogramma(checomparedopolaparola“class”)puòesseresceltoliberamentedalprogrammatore:l’unicovincoloècheilfilesorgentechelocontieneabbialo stessoidenticonome,conl’estensione“.java”allafine.QuandosilavoraconJavaèbene fareattenzionealladistinzionetraletteremaiuscoleeminuscole:ilnome“HelloWorld.java” èconsideratodiversoda“helloWorld.java”dalmomentoche,nelsecondocaso,lalettera “h”èminuscola. Tralasecondaelaterzaparentesigraffa,dopolascrittapublic static void main(String argv[]), èpossibileinserireleistruzionicheverrannoillustrateneiprossimiparagrafi.
ManualepraticodiJava:dallateoriaallaprogrammazionexxv
Commenti Per rendere più chiaro un programma è possibile aggiungere veri e propri commenti in linguanaturale,avendocuradiseguirelasintassidescrittainseguito.Ilcompilatoresilimiterà aignoraretalicommentiinfasedicompilazione.
Commento su riga singola Sesidesideraaggiungereuncommentolungononpiùdiunariga,èsufficienteanteporre lasequenza“//”subitoprima.Tuttoquellochesegueicaratteridiiniziocommento,finoal terminedellariga,verràignoratodalcompilatore: // la riga seguente stampa “Hello World!” sullo schermo System.out.println(“Hello World!”);
Commento su righe multiple Pericommentilunghipiùdiunariga,èsufficientericorrereaimarcatori“/*”e“*/”all’inizio eallafinedeltesto: /* Tutto quello che è incluso tra i marcatori di commento multiriga viene ignorato dal compilatore*/
Esistononumerosemodalitàdiimpaginazionedeicommentichenemiglioranolaleggibilità. Diseguitoèpresentatalapiùcomune: /* * Tutto quello che è incluso * tra i marcatori di commento multiriga * viene ignorato dal compilatore */
Commento Javadoc IllinguaggioJavaincludeunamodalitàdicommento,dettaJavadoc,chepuòessereutilenella stesuradiprogrammimoltolunghi.LacaratteristicapiùimportantediJavadoc,caratterizzato daitag“/**”e“*/”,èchepermettealprogrammatoredigenerareinmodoautomaticouna validadocumentazioneipertestuale,chepuòrivelarsipreziosainnumerosifrangenti.Javadoc consentediassociareaognielementodelcodicesorgenteungrannumerodiinformazioni,come autore,numerodiversione,datadiintroduzione,linkarisorseinreteoadaltrielementidiun programma.LatrattazionecompletadiJavadocesuladagliobiettividiquestovolume.
Istruzione elementare L’istruzioneèl’unitàdibasedelprogramma:essadescriveuncompitodaeseguirecome “sommaduenumeri”o“disegnauncerchiosulloschermo”.
xxvi Introduzione a Java L’istruzioneallaquartarigadelprogramma“HelloWorld.java”hal’effettodivisualizzare sulloschermolascrittaracchiusatravirgolette.Sipuòprovareamodificareilsorgentedel programma,cambiandolafraseconqualcosatipo “Abbasso la Squola :-P”o “Viva (nome della squadra del cuore)”.Permettereinattolemodifichesarànecessariosalvaredinuovoilfilesu discoeripeterelacompilazioneel’esecuzione. Eccounpaiodiistruzionicheverrannousateneiprossimiesempi: System.out.println(“FRASE”); FRASE
stampasuschermolafraseracchiusatravirgolette,quindivaacapo; System.out.print(“FRASE”); FRASE
stampasuschermolafraseracchiusatravirgolette,senzaandareacapo.
Sequenza Ilmodopiùsempliceperfornireistruzioniauncalcolatoreèscrivereunelencodioperazioni daeseguireunadiseguitoall’altra.L’interpreteeseguiràleistruzioniinsequenza,unaallavolta, nellostessoordineincuisonostateelencateneltestodelprogramma. Siproviamodificareilprogrammaprecedenteinquestomodo: public class HelloWorld { public static void main(String argv[]) { System.out.println(“Hello World!”); System.out.println(“Every day is a very nice day”); } }
Leistruzionidistampaorasonodue,everrannoeseguiteinsequenza.Èpossibileistruireil computeraeseguireunaqualsiasisequenzadiistruzioni: System.out.println(“Nel mezzo del cammin di nostra vita”); System.out.println(“Mi ritrovai per una selva oscura”); System.out.println(“Che la diritta via era smarrita”); ....
Seleistruzionisonoformulatecorrettamente,ilcomputerleeseguiràunaallavolta,nello stessoordineincuisonoelencatenelcodicesorgente.
ManualepraticodiJava:dallateoriaallaprogrammazionexxvii
Variabili intere Seilcomputersilimitasseastampareunelencodifrasisulloschermo,lasuautilitàsarebbe decisamentelimitata.Quellocherendeveramenteutileilcomputerèinprimoluogolasua capacitàdieseguirecalcoliaritmeticicongrandevelocitàeprecisione,mantenendoinmemoria irisultatitemporanei. Ilprincipalestrumentodimanipolazionenumericaèlavariabile:unacelladimemoriaalcuiinternoèpossibilememorizzareunnumero.Ilprogrammatorepuòricorrereallevariabilipereffettuare calcoli,memorizzareirisultatidiespressionianchemoltocomplesseedeffettuareconfronti. IllinguaggioJavapermettedigestirevariabilididiversitipi.Perilmomento,verràillustrato solol’usodellevariabiliintere.
Dichiarazione Primadiutilizzareunavariabileènecessarioeseguireunadichiarazione,inmododasegnalarealcomputerlanecessitàdiriservareunacelladimemoria.Perdichiarareunavariabilesi usalaparola“int”,seguitadaunnomesceltodalprogrammatoreedauncaratteredipunto evirgola(;): int a; int operando; int risultato;
Ilnomedellavariabiledeveesserecompostodaunacombinazionedilettereenumeri,di lunghezzaarbitraria:normalmentevienesceltoinbasealcontestodiutilizzo,inmododarendereilprogrammapiùleggibile.
Assegnamento Permemorizzareunvaloreall’internodiunavariabile,sideveeffettuareunassegnamento. Lasintassidiunassegnamentoèdatadalnomedellavariabile,seguitodalcarattereuguale(=) edaun’espressionenumerica: a = 10; operando = 15;
Nellapartedestradiunassegnamento,dopoilcarattere=,èpossibileinserireun’espressione aritmeticachefacciausodiparentesiedeinormalioperatoriaritmetici:+perlasomma,-per lasottrazione,*perlamoltiplicazione,/perladivisionee%perl’operazionedimodulo(resto diunadivisioneintera).Inquesticasilavariabileasinistraassumeràilvaloredell’espressione adestra.Peresempio,l’istruzione: risultato = ( 10 + 5 ) * 2;
assegneràilvalore30allavariabilerisultato.
xxviii Introduzione a Java La dichiarazione di una variabile e il primo assegnamento (detto anche inizializzazione) possonoessereeseguitiinun’unicaistruzione,comenelseguenteesempio: int a = 10;
Uso delle variabili Unavariabile,unavoltainizializzata,sicomportanelprogrammacomeilnumerochele vieneassegnato.Essapuòdunquecomparireall’internodiespressioni,edessereasuavolta utilizzatainunassegnamento: a = 10; b = a * 2;
Inquestoesempio,allavariabilebvieneassegnatoilvaloredellavariabileamoltiplicatoper due:dalmomentocheavale10,bassumeràilvalore20. Cosasuccedesel’espressionenellapartedestradiunassegnamentocontienelavariabileda assegnare?Peresempio:chesensohalaseguenteistruzione? a = a + 2;
Inuncasocomequesto,lavariabileaassumeilvalorechesiottienevalutandol’espressione adestradelcarattere=inbasealvalore“precedente”dellavariabile.Siosservinoperesempio leseguentiistruzioni: a = 10; a = a + 2;
Laprimaistruzioneassegnaallavariabileailvalore10.Laseconda,invece,assegnailvalore 12,datodallasommadelprecedentevaloredia,inquestocaso10,conilnumero2.
Struttura di controllo decisionale: il costrutto if - else Quandosidescriveunasequenzadioperazioni,capitatalvoltadidovermettereinpratica delledistinzioni.Sesidesideraspiegareaunamicocomesipreparaunafesta,siricorreràauna seriediistruzionidiquestotipo: comprare patatine; comprare torta; comprare piatti; ....
Masesidesiderachelafestasiaunsuccesso,ènecessarioprendereinconsiderazionealcuni fattori,eagirediconseguenza:
ManualepraticodiJava:dallateoriaallaprogrammazionexxix se gli invitati sono maggiorenni comprare birra altrimenti comprare aranciata
Questomododioperareèchiamato“condizionale”:l’esecutorevalutaunacondizionee agisceinmododifferenteasecondacheessarisultiveraofalsa.Laformulazionegeneraledel costruttocondizionaleinJavaèlaseguente: if ( condizione ) { // Istruzioni da eseguire se la condizione è vera } else { // Istruzioni da eseguire se la condizione è falsa }
Laclausolaelseèopzionale.Senonsidevespecificareunpercorsoalternativo,èpossibile ricorrereallaseguenteformulazione: if (condizione condizione ) { // Istruzioni da eseguire se la condizione è vera }
Formulazione di una condizione Unacondizionehanormalmentelaformadiunconfrontotravariabilienumeri,otravariabilievariabili.Perverificarel’uguaglianzatraduevariabili,ènecessarioutilizzarel’operatore doppiouguale(==),formatodaduecaratteri=senzaspaziatureintermedie: if( a == b ) { // Istruzioni da eseguire se a è uguale a b } else { // Istruzioni da eseguire se a è diversa da b }
L’operatore!=èl’inversodelprecedente:essopermettediverificareseduevalorisonodifferenti.Altrioperatoriimportantisono: • < pervalutarelacondizione“minoredi”; • per“maggioredi”; • >= per“maggioreouguale”.
xxx Introduzione a Java Riprendendoinesamel’esempiodellafesta,sipuòesprimerelacondizioneconilseguente pseudo-codice: if(età >= 18) { comprareBirra(); } else { comprareAranciata(); }
Struttura di controllo iterativa: l’istruzione while InunacelebrescenadelfilmShining,suuntavolodapranzonelsoggiornodell’Overlook HotelWendy(l’attriceShelleyDuval)scopreun’interarismadifoglipermacchinadascrivere consoprastampataun’unicafrase,ripetutaossessivamente,migliaiadivolte: Il mattino ha l’oro in bocca Il mattino ha l’oro in bocca Il mattino ha l’oro in bocca Il mattino ha l’oro in bocca Il mattino ha l’oro in bocca Il mattino ha l’oro in bocca
Questa scoperta fornisce la prova inconfutabile della pazzia del marito, magistralmente interpretatodalbravissimoJackNicholson. Secondolaleggenda,ilregistaStanleyKubrick,insoddisfattodallabassaqualitàdegli strumenti di riproduzione fotostatica dell’epoca, pretese che i cinquecento fogli fossero battutiamacchinaunoperunodaisuoifedeliassistentiinquattrolinguediverse,alfine diottenereilmassimogradodirealismo.Algiornod’oggiletecnologiedistampahanno raggiuntolaqualitàtipografica,epersinoKubrick,dicuieranotalapignoleria,avrebbe acconsentitoadassegnareunsimilefollelavoroauncomputermedianteunprogramma diquestotipo: public class Shining { public static void main(String argv[]) { int i = 0; while(i=0) { istruzione1; istruzione2; …. istruzioneN istruzioneN; i = i - 1; }
Programmi di esempio Ricorrendosoloaicostruttipresentatineiparagrafiprecedenti,verràoramostratocomesia giàpossibilecrearealcunisempliciesempi.Perprimacosa,siproviarealizzareunprogramma checalcolilasommadeiprimi100numeriinteri: public class SommaNumeri { public static void main(String argv[]) { int i = 0; int somma = 0; while(i = 0 ) if( x = 0 && x 0)) throw new AssertException();
Maaldilàdell’eleganzadiuncostruttocompatto,esistonosostanzialidifferenzetraidue casi, sia sul piano tecnico sia su quello filosofico. Da un punto di vista tecnico, il costrutto delleassertprevedelapossibilitàdidisabilitareinbloccoilcontrollodellecondizioni:come verràmostratopiùavanti,leassertvengonousateessenzialmenteinfaseditestedebugging: durante la normale esecuzione è possibile disabilitarle, eliminando in tal modo l’overhead legatoallalorogestione.Maesisteancheunadifferenzaassaisottilesulpianofilosofico,che rendel’assertqualcosadicompletamentediversodaqualsiasialtrocostruttopresenteinJava. Contrariamenteaquantoavvieneconicostruttistandarddeilinguaggiimperativi,unaassert nonrappresentaunordinemaunaipotesi:l’ipotesicheunacertacondizionebooleanasiavera inunadeterminatafasedell’esecuzionediunprogramma.Laviolazionediunaassertcausala chiusuradelprogramma,dalmomentochesièverificatoqualcosacheilprogrammatorenon avevaprevisto.Maieinnessuncasounaassertdovràconteneredirettivecheinfluenzinola normaleesecuzionedelprogramma. L’utilizzodelleassertpermettealprogrammatorediverificarelaconsistenzainternadiun programmaalfinedirenderlopiùstabile.Nelcontempo,leassertaggiungonoespressivitàal codice,poichéformalizzanoalcuneipotesidelprogrammatorecircalostatodelprogramma durantel’esecuzione,ipotesichepossonorivelarsifalseacausadiunbug. Per comprendere a fondo la filosofia di utilizzo delle assert, può essere utile una breve introduzione.
Sherlock Holmes e la filosofia delle Assert Nelracconto“L’avventuradegliominidanzanti”SherlockHolmes,ilpiùfamosodetective letterario,sitrovaadoveraffrontareuncasodiomicidio,perilqualevieneaccusatalapersona sbagliata.L’apparenzaavolteinganna,malalogica,seusatanelgiustomodo,puòaiutarea rimetterelecoseaposto: Lostudioeraunlocalenonmoltogrande,copertosutreparetidailibri,conunoscrittoiodi fronteadunafinestrachedavasulgiardino.Perprimacosa,dedicammolanostraattenzioneal corpodelpoverogentiluomo,lacuimassicciafiguragiacevainmezzoallastanza.Levestiindisordineindicavanocheerastatobruscamenterisvegliatodalsonno.Ilproiettile,sparatodaldavanti, erarimastonelcorpodopoavereattraversatoilcuore.Nonc’eranotraccedipolveredasparo,né sullavestaglianésullemani.Secondoilmedico,lasignorainvecemostravatraccedipolveresul visomanonsullemani. “L’assenzaditraccedipolveresullemaninonsignificanulla;avrebbeavutomoltosignificato, invece,laloropresenza”,disseHolmes.“Seilproiettilenonèdifettosoelapolverenonschizza
ManualepraticodiJava:dallateoriaallaprogrammazione
105
indietro,sipossonospararemolticolpisenzachenerimangatraccia.Orasuggerireidirimuovere ilcorpodelsignorCubitt.Immagino,dottore,cheleinonabbiarecuperatoilproiettilecheha feritolasignora?” “Primadipoterlorecuperareoccorreuncomplicatointerventochirurgico.Manellapistolaci sonoancoraquattroproiettili.Duesonostatisparati,provocandodueferite,quindiilcontodei proiettilitorna.” “Cosìsembrerebbe”,convenneHolmes.“Forsepuòanchedirmichefinehafattoilproiettile chehaovviamentecolpitoilbordodellafinestra?” Si era improvvisamente girato indicando, col lungo indice sottile, un foro che attraversava l’estremitàinferioredeltelaiodellafinestra,circaunpollicesoprailbordo. “PerGiove!”,esclamòl’ispettore.“Comediaminehafattoavederlo?” “L’hovistoperchélostavocercando.” “Fantastico!”,disseildottore.“Leihasenz’altroragione,signore;eallora,cideveesserestata unaterzapersona.Machipotevaessere,ecomehafattoadandarsene?” “Èquestoilproblemachedobbiamorisolvere”,disseHolmes.“IspettoreMartin,leiricorderà cheledomestichehannodichiaratodiaversentitoodoredipolveredasparouscendodalleloro stanze,echelehodettochesitrattavadiunelementodiestremaimportanza?” “Sì,loricordo;maconfessodinonavercapitoilmotivodellasuaraccomandazione.” “Ciportaadesumereche,almomentodellosparo,tantolafinestrachelaportadellastanza eranoaperte.Altrimenti,ilfumodell’esplosionenonsisarebbepotutodiffonderecosìrapidamente nellacasa.Perquesto,bisognavachenellastanzacifossecorrente.Portaefinestra,però,sono rimasteapertesoloperpochiminuti.” “Comepuòprovarlo?” “Perchélacandelanonavevasgocciolato.” “Magnifico!”,esclamòl’ispettore.“Magnifico!” “Essendo certo che, al momento della tragedia, la finestra era aperta, ho pensato che nella faccendapotevaesserecoinvoltaunaterzapersona,cheavevasparatodall’esterno.Unproiettile direttocontroquestapersonaavrebbepotutocolpireiltelaiodellafinestra.Hocercatoe,voilà, c’erailsegnodelproiettile.” LatecnicainvestigativadiHolmesèbasatasulladeduzione:lasuamassimapiùcelebreè“Se escludil’impossibile,ciòcherimane,perquantoimprobabile,nonpuòcheesserelaverità”. Tuttaviaininformaticanonèpermessoescluderel’impossibile:nonesistelapossibilitàdirealizzareprogrammichedimostrinolacorrettezzalogicadiungenericoaltroprogramma. Quando Holmes afferma “L’assenza di tracce di polvere sulle mani non significa nulla; avrebbeavutomoltosignificato,invece,laloropresenza”,eglienunciaunaveritàprofonda: lalogicadeduttivafunzionasoltantoinpresenzadifattidicuisianotalacondizionediverità. Inassenzadifattinonèpossibiledireconcertezzaseunadeterminataipotesisiaveraofalsa. CiòsiaccordaperfettamenteconilpensierodelcelebrescienziatoinformaticoE.W.Dijkstra, che era solito sostenere che “il collaudo permette di dimostrare la presenza di errori in un programma,nonlaloroassenza”. Seèverochenonèpossibilegarantirel’assenzadierrori,ècomunquepossibileseminare alcune“trappole”neipunticriticidelcodice,inmododaottenereilmaggiornumeropossibile
Capitolo9.AssertinJava:tecnicheefilosofiad'uso
106
diindiziqualorasiverifichiunerroreinaspettato.Persemplificarequestolavoroèpossibile ricorrere alle assert. Fondamentalmente, le assert vengono usate per controllare tre tipi di condizione:precondizioni,postcondizioniedinvarianti.Leprecondizionisonoclausoleche devonorisultarevereprimachevengaeseguitaunadeterminatasequenzadioperazioni;lepostcondizionialcontrariodevonoesserevereallafinedellasequenza;gliinvariantiinfinesono condizionichedevonosemprerisultarevere. SiosservicomeHolmesriescaafalsificareun’ipotesidapprimaverificandolaviolazionedi unacondizioneinvariante(ilnumerodeiproiettilisparatièsuperioreaquellodeiproiettilidi unasolapistola),quindicontrollandolaveritàdiunaprecondizione(lafinestraaperta)unitamenteallafalsitàdiunapostcondizione(l’assenzadisgocciolamentodellacandela).Grazie alleassertilprogrammatore,alparidiHolmes,puòraccogliereindiziimportanti,indiziche possonoaiutareaverificareleproprieipotesigraziealladeduzionelogica.
Sintassi delle assert L’istruzioneassertprevededuecostrutti: assert booleanExpression; assert booleanExpression : message;
Ilprimopermettedispecificarelacondizionedacontrollare;ilsecondocontieneancheun messaggiodavisualizzareincasodiviolazione.Talemessaggiopuòcontenereancheinformazioni dettagliatesulcasochehaprovocatoilfallimentodelprogramma,peresempio: assert a + b > c : “La somma di “ + a + “ con “ + b + “ ha dato un risultato minore o uguale a “ + c;
Compilazione ed esecuzione di codice con assert L’usodelleassertrichiedeopzionispecialiinfasedicompilazioneediesecuzione.Unesempiopasso-passodovrebbeaiutareachiariretuttoquellocheènecessariosapere.Sisuggerisce quindidicopiareilseguenteprogrammainunfiledalnomeAssertTest.java: public class AssertTest { public static void main(String args[]) { byte b = 0; for ( int i = 0; i = 0; b = (byte)(i * 2); assert b >= 0 : “Valore inaspettato: b = “ + b; System.out.println(“b = “ + b); } } }
// precondizione // assegnamento // postcondizione
ManualepraticodiJava:dallateoriaallaprogrammazione
107
Laassertinquintarigaèunesempiodiprecondizione:essaattestachelavariabileideveavere unvalorepositivoprimachevengaeseguital’operazionepresentenellarigasuccessiva.Dopo l’assegnamentoinsestariga,sipuòosservareinveceunesempiodipostcondizione,laqualeasseriscechealterminedell’operazioneilvaloredibdeveessereasuavoltapositivo,dalmomento chetalevariabilecontieneilvalorediunnumeropositivomoltiplicatoper2.D’altraparte,ilciclo forinquartarigacontieneunerrorelogico:lacondizionei path PATH=…….C:\programs\jdk1.4\bin
Aquestopunto,sipuòprovareaeseguirelaJVMconilcomando: C:\>java -version
336
AppendiceA.Installazionedell'SDK
L’opzione–versionpermettediconoscerelaversionedellaJVMinstallata.Inquestocaso,il comandorestituisceilseguenteoutput: java version “1.4.1” Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21) Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)
sesiusaunsistemabasatosuWindows95-98oME,l’impostazionedellevariabili d’ambientepuòesserefattatramiteilfileautoexec.bat.Inquestocaso,conun’istruzionedeltipo:
setJAVA_HOME=”….” Sipotràdefinirelavariabileinmodochepuntialladirectoryindicata.Sitengapresentechetali sistemioperativioffronounsupportoridottoperlosviluppoel’esecuzionediapplicazionichefanno usodeiprotocollidirete(socketTCP,databaseecc...)oserverside(servlet,webapplication,EJB,per esempio).Siconsigliapertantodiutilizzareleversionipiùevolute(NT,2000,XP),chesupportano inmodopiùcorrettoecompletolostratodinetworkTCP/IPeoffronomaggioriservizi.
Installazione su Linux Per l’installazione su Linux, la procedura è molto simile a quella per Windows: si deve scaricareunfilediinstallazioneeinstallarlo.Perquest’ultimoaspettosipuòutilizzareunrpm autoinstallanteounfileeseguibileconestensione.bin. Peresempio,sej2sdk-1.4.2-nb-3.5-bin-linux.binèilfileinstallantescaricatodalsitoSun,per primacosalosirendaeseguibileconilcomando: chmod o+x j2sdk-1.4.2-nb-3.5-bin-linux-i586.bin
quindilosimandiinesecuzionetramite: ./j2sdk-1.4.2-nb-3.5-bin-linux-i586.bin
pereseguirel’installazione.Dinorma,questoporteràall’installazionedell’SDKinunadirectoryilcuinomesegueloschemausr/java/jdk-. Questosignificachedovrannoesseremodificatediconseguenzalevariabili JAVA_HOMEe PATH,intervenendosuifilediprofilo.bashrco.bash_properties(asecondadeltipodishell usata)dell’utentechedovràusareJava: JAVA_HOME=/usr/java/jdk1.4.1/ export JAVA_HOME PATH=$JAVA_HOME/bin:$PATH export PATH
ManualepraticodiJava:dallateoriaallaprogrammazione
337
Nelcasoincuiun’applicazionedebbafarusodialtripackageoltreaquellidibasedelJava SDK,comeunparserXMLXerces(contenutoingenereinunfile xerces.jar),ilpackageJava Mail,laServletAPIoaltroancora,sidovràaggiungeremanualmentealclasspathilcontenuto ditalilibrerie.Questopuòesserefattoinduemodi. Ilprimosistemaconsistenell’aggiungeretalilibreriealclasspathdisistema,tramiteilpannello dicontrollodiWindowsomediantel’impostazioneedesportazionediunavariabileglobalesu Linux.Inquestocasosipotràesseresicurichetutteleapplicazionichedovrannoutilizzareun parserXercesoJavaMailpotrannofunzionarecorrettamentesenzaulterioriimpostazioni. Attualmente, però, lo scenario Java è molto complesso, quindi un’impostazione globale difficilmentesiadattaatutteleapplicazioni:inuncasopotrebbeesserenecessarialaversione 1.0diXerces,mentreun’altraapplicazionepotrebbefunzionaresoloconla1.2.Perquesto motivo,ingenere,sipreferisceimpostareunclasspathpersonalizzatoperogniapplicazione, passandotaleconfigurazioneallaJVMconilflag –classpatho –cp.Peresempio,inWindows sipotrebbescrivere: set MY_CP=c:\programs\mokabyte\mypackages.jar java –cp %MY_CP% com.mokabyte.mokacode.TestClasspathApp
Dove TestClasspathApppotrebbeessereun’applicazionecheabbiabisognodiunaseriedi classieinterfaccecontenuteinmypackages.jar. Inquestomodosipotrannocostruiretuttiiclasspathpersonalizzati,concatenandofilee directorydivariotipo. InambitoJ2EElecosesicomplicano:entranoinfattiingiocoiltipodiapplicazioneele regoledicaricamentodelclassloaderutilizzato.Perquestiaspetti,checomunqueriguardanoil programmatoreesperto,sirimandaalladocumentazionedelprodottoutilizzato,esiconsiglia l’adeguamentoallevarieconvenzioniimpostedallaspecificaJava.
Bibliografia [SUN]–SitowebufficialediSundedicatoaJava:http://java.sun.com [SDK]–SitowebdiSunperildownloaddell’SDKnelleversioniperlevariepiattaforme: http://java.sun.com/downloads
[JIBM]–SitowebIBMdedicatoaJava:http://www.ibm.com/java [xIBM]–“IBMDeveloperKitforLinux:Overview”:http://www-106.ibm.com/developerworks/ java/jdk/linux140/?dwzone=java
Appendice
B
Ginipad, un ambiente di sviluppo per principianti ANDREAGINI GinipadèunambientedisviluppoperJavarealizzatodaAndreaGini,unodegliautori diquestomanuale.Ginipadèstatopensatocomestrumentoperprincipianti,chenonhanno tempoovogliadibarcamenarsitraeditortestualietoolarigadicomando.Lasuainterfaccia graficasempliceedessenzialenehadecretatoilsuccessoanchepressoutentipiùesperti,che spessonecessitanodiunostrumentorapidoeleggerodaalternareagliambientidisviluppo piùcomplessi. Ginipadèstatoprogettatoperoffrireilmassimogradodifunzionalitànelmodopiùsemplice eintuitivopossibile.Bastanocinqueminutiperprendereconfidenzaconl’ambienteelesue funzioni.Questaappendicefornisceunatabellariassuntivadeiprincipalicomandieunaguida all’installazione. Siconsigliadivisitarelahomepagedelprogettopertrovaretutteleinformazioninecessarie: http://www.mokabyte.it/ginipad
Iltempodiapprendimentopuòessereridottoadappenacinqueminutigrazieaunoslideshow inPowerPoint,disponibileall’indirizzo: http://www.mokabyte.it/ginipad/download/GinipadVisualTutorial.ppt
340
AppendiceB.Ginipad,unambientedisviluppoperprincipianti
Caratteristiche principali FiguraB.1–CaratteristicheprincipalidiGinipad.
1. Pochipulsantifacilidaidentificare. 2. Possibilitàdilavoraresupiùdiundocumento. 3. EditorconSyntaxHighlight. 4. Indicenavigabiledimetodi,campieclassiinterne. 5. Autocompletamentodelledichiarazioni. 6. Hyperlinkversoglierrori.
ManualepraticodiJava:dallateoriaallaprogrammazione
341
Tabella riassuntiva dei comandi File
Edit
New
(Ctrl-N)
CreaunnuovosorgenteJava.
Open
(Ctrl-O)
Caricaunsorgentedadisco.
SaveAs
(Ctrl-S)
Salvaildocumentocorrente.
Close OpenAll Exit
(Ctrl-W)
Chiudeildocumentocorrente. Apreinunavoltasolagliultimiottosorgenti. Chiudeilprogramma.
Cut
(Ctrl-X)
Tagliailtestoselezionato.
Copy
(Ctrl-C)
Copiailtestoselezionato.
Paste
(Ctrl-V)
Incollailtestocontenutonellaclipboard.
SelectAll
(Ctrl-A)
Selezionatuttoilcontenutodell’editor.
Undo
(Ctrl-Z)
Annullal’ultimamodifica.
Redo
(Ctrl-Y)
Ripristinal’ultimamodifica.
Find
(Ctrl-F)
AprelafinestradidialogoFind.
Replace
(Ctrl-R)
AprelafinestradidialogoReplace.
Compile
(Ctrl-Shift-C)
Compilaildocumentocorrente.
Run
(Ctrl-Shift-R)
Esegueildocumentocorrente.
Stop
Interrompel’esecuzionedelprocessocorrente.
(Ctrl-Shift-F)
Esegueunaformattazionedelcodice.
HideTree
Nascondeilcomponenteadalbero.
ShowTree
Mostrailcomponenteadalbero.
HideConsole
Nascondelaconsole.
ShowConsole
Mostralaconsole.
ShowPanels
Mostratuttiipannelli.
Tools
Formatsourcecode Console
342
AppendiceB.Ginipad,unambientedisviluppoperprincipianti
FullScreen
Espandel’editorapienoschermo.
ClearConsole
Ripuliscelaconsole.
Preferences
Aprelafinestradellepreferenze.
Help
AprelafinestradiHelp.
About
AprelafinestradiAbout.
Dialog
Installazione 1.
CaricareeInstallareilJDK1.4.
2.
LanciareilfiledisetupdiGinipad.
3.
AlsecondopassaggiodellafasediinstallazioneverràrichiestodisceglierelaVirtual Machine.Siconsigliadisceglierequellapresentenellacartella\bindelJDK,comesi vedeinFigB.2.
FiguraB.2–SceltadellaVirtualMachine.
ManualepraticodiJava:dallateoriaallaprogrammazione
4.
343
Alterminedell’installazionesipuòavviareilprogramma.Alprimoavvio,Ginipad effettuaunaricercaperlocalizzarelaposizionedelJDK.Taleprocessoèautomatico etrasparenteall’utente.
Cosa fare se Ginipad non trova il JDK GinipadèingradodiidentificaredasololaposizionedelJDKsudisco,durantelafasedi installazione.Tuttavia,setaleposizionedovessecambiare,peresempioinseguitoaunaggiornamentodelJDK,all’avviosuccessivoverràrichiestodiindicarelanuovaposizionedell’ambiente disviluppo.
FiguraB.3-LafinestraperaprireilFileChooser.
Dopoaverdatol’OK,verràvisualizzataunafinestraFileChooser,tramitelaqualesidovrà localizzareladirectorydelJDKsuldisco.Unavoltatrovatalacartella,nonrestachepremere ilpulsanteLocateJDKDirectory.
Appendice
C
Parole chiave ANDREAGINI
abstract
double
int
super
boolean
else
interface
switch
break
extends
long
synchronized
byte
final
native
this
case
float
package
throw
char
for
private
throws
class
(goto)
protected
transient
(const)
if
public
try
continue
implements
return
void
default
import
short
volatile
do
instanceof
static
while
LamaggiordelleparoleriservatediJavaderivadalC,illinguaggiodalqualeJavahaereditato lasintassidellestrutturedicontrollo.LesomiglianzeconilC++,alcontrario,sonominori,dal momentocheJavaadottaunasintassidifferenteperquantoriguardaicostrutticaratteristici della programmazione a oggetti. Le parole chiave goto e const, presenti nel C, fanno parte dell’insiemedellekeyword,madifattononcompaiononellinguaggioJava:inquestomodo, ilcompilatorepuòsegnalareunospecialemessaggiodierroreseilprogrammatoreledovesse utilizzareinavvertitamente.
Appendice
D
Diagrammi di classe e sistemi orientati agli oggetti ANDREAGINI Uneffettodellastrategiadiincapsulamentoèquellodispingereilprogrammatoreaesprimereil comportamentodiunsistemaaoggettiunicamenteattraversol’interfacciadiprogrammazionedelle classi.Inquestosenso,quandounprogrammatoresitrovaadoverutilizzareunalibreriadiclassi realizzatedaqualcunaltro,nonèinteressatoacomeessasiastataeffettivamenteimplementata:di norma,èsufficienteconoscerelefirmedeimetodi,lerelazionidiparentelatraleclassi,leassociazioni eledipendenze,informazionichenondipendonodall’implementazionedeisingolimetodi. Ildiagrammadiclasseèunformalismochepermettedirappresentareperviagraficatutte questeinformazioni,nascondendonelcontempoidettaglidilivelloinferiore.L’usodeidiagrammidiclassepermettedivedereuninsiemediclassiJavadaunaprospettivapiùaltarispettoa quellafornitadalcodicesorgente,simileaquellachesihaquandosiguardaunapiantinaper vederecom’èfattaunacittà.Lapiantinanoncontienetuttiidettaglidellazonarappresentata, comelaposizionedellesingoleabitazioniodeinegozi,mariportainformazionisufficientiper orientarsiconprecisione. I diagrammi di classe fanno parte di UML (Unified Modeling Language), un insieme di notazionigrafichechepermettedifornireunarappresentazionedeidiversiaspettidiunsistemasoftwareorientatoaglioggetti,indipendentementedallinguaggiodiprogrammazione effettivamenteutilizzato.L’UMLcomprendesettetipidiversididiagrammi,chepermettono dimodellareivariaspettidell’architetturaedelcomportamentodiunsistemasoftwareprima diiniziarnelosviluppo.IdiagrammiUMLcostituisconounapartefondamentaledelladocumentazionediunsistemainformativo,efornisconounaguidaessenzialeinfasedistudioodi manutenzionedelsistemastesso. L’UMLnonèunlinguaggiodiprogrammazione,anchesenegliultimiannigliambientidi sviluppohannoiniziatoaincluderestrumentichepermettonodiprodurrecodiceapartiredai
348
AppendiceD.Diagrammidiclasseesistemiorientatiaglioggetti
diagrammieviceversa.Iseguentiparagrafivoglionofornireunaguidaessenzialeaidiagrammi diclasse,l’unicoformalismoUMLpresenteinquestolibro.
Classi e interfacce UML InUMLleclassieleinterfaccesonorappresentatecomerettangoli,suddivisiintrearee: l’areasuperiorecontieneilnomedellaclasseodell’interfaccia,quellaintermedial’elencodegli attributiequellainferiorel’elencodeimetodi:
FiguraD.1–UnesempiodiclasseediinterfacciainUML. SchedaAnagrafica -nome:String -cognome:String +getNome():String +getCognome():String +setNome(nome:String) +setCognome(nome:String)
«interface» Pesabile +getPeso():int
Entrambiidiagramminoncontengonoalcundettagliosulcontenutodeimetodi:ilcomportamentodiunaclasseodiun’interfacciaUMLèespressounicamentetramiteilnomedeisuoi metodi.Lefirmedimetodieattributiseguonounaconvenzionedifferenterispettoaquella adottatainJava:inquestocaso,ilnomeprecedeiltipo,etraiduecompareunsimbolodidue punti(:)comeseparatore.Iparametrideimetodi,quandopresenti,seguonolastessaconvenzione.Ilsimbolopiù(+),presenteall’inizio,denotaunmodificatorepublic,mentreiltrattino (-)indicaprivateeilcancelletto(#)significaprotected. Ildiagrammadiinterfacciapresentaalcunedifferenzerispettoaquellodiclasse: •
Aldisopradelnomecompareun’etichetta“interface”.
•
Gliattributi(normalmenteassenti)sonosottolineati,aindicarechesitrattadiattributi staticiimmutabili.
•
Imetodisonoscrittiincorsivo,perindicarechesonoprividiimplementazione.
SiosserviunatipicaimplementazioneJavadeldiagrammadiclassepresenteinfigura1: public class SchedaAnagrafica {
349
ManualepraticodiJava:dallateoriaallaprogrammazione private String nome; private String cognome; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCognome() { return cognome; } public void setCognome(String cognome) { this.cognome = cognome; } }
Spessoildiagrammadiclassepresentaunlivellodidettaglioinferiorerispettoalcodicesottostante:tipicamente,siusaundiagrammaperdescrivereunparticolareaspettodiunaclasse, esiomettonoimetodiegliattributichenonconcorronoadefiniretalecomportamento.In questolibro,idiagrammidiclassesonostatidisegnatisecondoquestaconvenzione.
Ereditarietà e realizzazione L’ereditarietàèrappresentatainUMLconunafrecciadallapuntatriangolare,chepartedalla classefigliaepuntaallaclassepadre:
FiguraD.2–Ereditarietàtraleclassi. �����������
����
�����
350
AppendiceD.Diagrammidiclasseesistemiorientatiaglioggetti
Larealizzazione,equivalenteall’implementazionediun’interfacciainJava,vienerappresentataconunafrecciasimileaquellausataperl’ereditarietà,matratteggiata.Sinotichesiricorre allarealizzazionesoloquandounaclasseimplementaun’interfaccia,mentreseun’interfaccia neestendeun’altrasiutilizzalanormaleereditarietà. InfiguraD.3èpossibilevedereundiagrammadiclassecontenenteunarelazionediereditarietàtrainterfacce(l’interfacciaMediaRecorderèfigliadell’interfacciaMediaPlayer)eduecasi direalizzazione(laclasseLettoreDVDrealizzal’interfacciaMediaPlayer,mentrelaclasseVideoRegistratore realizzaMediaRecorder).
FiguraD.3–Undiagrammachecontienesial’ereditarietàsialarealizzazione. «interface» MediaPlayer +play():void +fastForward():void +pause():void +rewind():void +stop():void
«interface» MediaRecorder +record():void
LettoreDVD
VideoRegistratore
Associazione L’associazione,rappresentatadaunalineachecongiungedueclassi,denotaunarelazione dipossesso.Un’associazionepuòesserebidirezionaleounidirezionale.Nelsecondocaso,al postodiunalineasemplicesiutilizzaunafreccia.Lafrecciaindicaladirezionedelflussodella comunicazione: in pratica, la classe da cui parte la freccia può chiamare i metodi di quella indicatadallapunta,manonviceversa.L’equivalenteJavadell’associazioneèlapresenzadiun attributoinunaclasse,chedifattodenotailpossessodiunparticolareoggettoelapossibilità diinvocaremetodisudiesso.
351
ManualepraticodiJava:dallateoriaallaprogrammazione
FiguraD.4–Classiunitedaassociazioni. SchedaVideo
Monitor
Computer
SchedaAudio
Speaker
InfiguraD.4èpossibileosservareuninsiemediclassicaratterizzatedaassociazionisiauni-sia bidirezionali:uncomputerècollegatoalleschedeaudioevideodaassociazionibidirezionali,a indicarechelacomunicazioneavvieneinentrambeledirezioni;ledueschede,invece,presentanoun’associazioneunidirezionalerispettivamenteconglispeakereilmonitor,poichénonè permessalacomunicazioneinsensoinverso.
Aggregazione Untipospecialediassociazioneèl’aggregazione,rappresentatadaunalineatradueclassicon un’estremitàadiamante,chedenotaun’associazioneunoamolti.InfiguraD.5sipuòosservare unarelazioneunoamoltitraunabibliotecaeilibriinessacontenuti.
FiguraD.5–Unesempiodiaggregazione. Biblioteca Libro +cercaPerLibro():Libro[] +cercaPerAutore():Libro[] +prendiInPrestito():void +restituisci():void
-Titolo:String -Autore:String
Apartelacardinalità,l’aggregazioneequivaleaun’associazione:nell’esempiodifiguraD.5 laclasseBibliotecapossiedeunacollezionedilibriepuòinvocaremetodisuognunodiessi. InJava,l’aggregazionecorrispondesolitamenteaunattributoditipoVectoroHashTable,opiù semplicementeaunarray.
352
AppendiceD.Diagrammidiclasseesistemiorientatiaglioggetti
Dipendenza La dipendenza è rappresentata da una freccia tratteggiata. Letteralmente, la dipendenza suggeriscechelaclassepuntatadallafrecciaesistaindipendentementedallaclassedacuiparte lafreccia:inJava,questosignificachelaprimapuòesserecompilataeutilizzataancheinassenza dellaseconda.
FiguraD.6–RelazionedidipendenzainUML. CDPlayer +play():void +rewind():void +fastForward():void +pause():void +stop():void
legge
CD -titolo:String -artista:String
LafiguraD.6presentaunesempiodirelazionedidipendenza:ilCD,intesocomesupporto permusicaedati,esisteindipendentementedalparticolarelettoreconcuilosilegge:lesue caratteristichesonodefinitedaundocumentodenominatoRedBook,alqualesidevonoattenere iproduttoridilettoriCD.Sinotil’etichetta“play”checomparesopralafreccia:leetichette permettonodiforniremaggioriinformazionisultipodirelazionechesussistetradueclassi.
Indice analitico A abstract77 AbstractButton194 accept()290 Accessoriedecorazioni235 Action210 usodelle211 ActionEvent206,213 ActionListener195,210,213,216 Adapter318 adapter190 addPropertyChangeListener()309 algebrabooleana3 ambientedisviluppoxix AND4,21 array assegnamento10 bidimensionali16 creazione10 dereferenziazione11 dichiarazione10 multidimensionali16 assegnamento10,xxvii divariabilifloatingpoint3 divariabililong2 assert103 abilitazione107 abilitazioneselettiva108 compilazioneedesecuzione106 controllodiinvarianti106
controllodipostcondizioni106 controllodiprecondizioni106 definizione103 filosofiad'uso104 sintassi106 AssertionError103 attributi42 definizione57 diinterfaccia82 autodecremento operatoredi6 autoincremento operatoredi6 available()113
B BeanInfo322 BeanCustomizer328 BevelBorder249 bindingdinamico74 blocco diistruzioni22 BohmCorradoxxxv BohmJacopinixxxv teoremadixxxv Boolean54 booleana algebra3 condizione21
354 Indice analitico espressione21 booleano tipodidato3 Border249 break34 Buffer112 ButtonGroup202 Byte54 byte2 ByteArrayInputStream122 ByteArrayOutputStream122 bytecodexx
C canRead()128 canWrite()128 caratteri5 case26 casting5,75 catch95 ChangeEvent223,307 ChangeListener223 char tipodidato5 classe AbstractButton194 AssertionError103 Boolean54 Byte54 Color240 Comparable83 definizione57 Double54 Event188 Exception97 FileNotFoundException94 Float54 Font242 Hashtable53 ImageIcon195 Integer54 IOException97
Iterator51 Long54 Short54 String44 Throwable96 Vector50 classi anonime191 astratte77 contestostatico79 ereditarietà68 finalizzatori67 interne85 metodidiclasse79 overloading(dicostruttori)71 overloading(dimetodi)70 overriding72 variabilidiclasse79 Client–Server276 close()112,113 Color240 commentoxxv competizionefrathread158 compilatorexx comunicazione trathread167 conflittodinomi86 const345 continue34 costruttore66
D deadlock164,165 DeamonThread172 dereferenziazione11 destinataridieventi316 dichiarazionexxvii do30 DomainNameService(DNS)277 dotnotation60,86 Double54 double3 downcasting75
Indice analitico 355
E eccezioni94 catene99 cattura95 creazione100 generazione98 gerarchia96 propagazione97 else23,xxviii EmptyBorder250 equals45 ereditariet‡ traclassi68 trainterfacce82 ereditariet‡multipla82 errori93 escape caratteredi5 sequenzedi5 espressionicondizionali27 Event188,318 eventi ActionEvent195,213 addXxxListener()188 Bean315 ChangeEvent223 gestionedegli188 ItemEvent198 ListSelectionEvent219 MouseEvent208 removeXxxListener()188 eventdelegation188 eventforwarding188 Exception97 extends70
F FactoryMethods254 false4,21 FeatureDescriptors323 FIFO(FirstInFirstOut)110
FileDescriptor132 filterstream116 final91 finalizzatori67 finally96 fireChangeEvent()309 Float54 float3 floatingpoint tipinumerici2 flush()112 Font242 FontChooser242 for30 FTP(FileTransferProtocol)276
G garbage41 garbagecollection67 getAbsolutePath()128 getCanonicalPath()128 getInputStream()287 getOutputStream()287 getPath()128 getPriority()149,174 getSoTimeout()287 getter42 GIF195,229 goto345 green-thread140
H Hashtable53 metodidi53 HelloWorldxxi HTMLeinterfacceSwing194
I if23,xxviii ImageIcon195 implements82
356 Indice analitico import88 incapsulamento58 indirizzoIP276 InputStream111 inputstream110 instanceof operatore75 int1 tiponumericoxxvii Integer54 interfacce80 dichiarazione82 implementazione82 interne85 interface82 interi tipinumerici1 interrupt()154 InterruptedException154 IntrospectionException325 invarianti106 IOException97 IPC(InterProcessCommunication)138 IP(InternetProtocol)294 isDirectory()128 isFile()128 isInterrupted()154 istanza57 istruzione abstrace77 assert103 break34 case26 catch95 continue34 do30 else23 extends70 final91 finally96 for30 if23 implements82
import88 instanceof75 native92 new41,58 package86 private90 protected90 public90 static79 strictfp92 super72 switch26 synchronized92 this72 throw98 throws97 transient92 try95 volatile92 while29 istruzioneelementarexxv ItemEvent198 ItemListener195 Iterator51
J JacopiniGiuseppexxxv JAR creazionedifile313 JAVA_HOME336 javac88 javadocxxv Java2 enterpriseedition(J2EE)332 microedition(J2ME)332 piattaforma331 standardedition(J2SE)332 JavaBeans deployment306 eventi305 IndexedProperty307 introspezione305 metodi304
Indice analitico 357
persistenza305 personalizzazione305 proprietà304 proprietà:bound307 JavaDevelopmentKit331 JavaVirtualMachinexx JButton196 JCheckBox200 JColorChooser240 JComboBox215 JDialogButtonItemListener200 JDK InstallazionesuWindows332 javac331 jdbg331 JFileChooser238 JList217 JMenu205 JMenuItem205 JOptionPane235 JPasswordField214 JPEG195,229 JPopupMenu205,207 JRadioButton202 JScrollPane229 JSlider222 JSplitPane229,231 JTabbedPane233 JTextArea226 JTextField213 JToggleButton198 JToolBar204 JVMxx VedereJavaVirtualMachine;
K Kubrickxxx
L labeledstatement36 LIFO66 linguaggiodiprogrammazionexix listener
ActionListener195,198,213,216 ChangeListener223 ListSelectionListener219 MouseListener208 PropertyChangeListener241 ListModel218 ListSelectionEvent219 ListSelectionListener219 Lock162 scopedel164 Long54 long2 Look&Feel247
M MalformedURLException281 mantissa2 mappahash53 mark()114 markSupported()114 MatteBorder250 MenuContainer205 MenuItem205 MenuBar204 Metal246 metaprogrammazione103 metodi42 definizione57 metodo chiamataa60 dichiarazione59 dichiarazione(conparametri)60 equals45 equals()76 finalize()67 modificatori90 final91 native92 packageprotection90 private90 protected90 public90 static79
358 Indice analitico strictfp92 synchronized92 transient92 volatile92 Motif246 MouseEvent208 MouseListener208 multitasking135,136 cooperative13 6 preemptive136 multithreading135,138
N nameclash86 namespace89 naming convenzioni68 native92 new10,41,58 NOT4,22 null10,58
O Object70 oggetti definizione39 metafora37,39 operatorirelazionali4 OR4,22 OutputStream111 outputstream110 overloading70 overriding72
P package86 compilazioneedesecuzione87 dichiarazione86 packageprotection90 pannellispecializzati229 parametri60
attuali62 formali62 passaggiobyref63 passaggiobyvalue63 pattern Delegation143 Strategy143 pila66 PipedInputStream122 PipedOutputStream122 PluggableLook&Feel246 polimorfismo85 portaTCP276 postcondizioni106 precondizioni106 preemptive137 PrintStream115 private90 processo136 programmazione concorrente135 promozione5,75 PropertyChangeEvent307,310 PropertyChangeListener241,307,309,310 PropertyChangeSupport307 protected90 public90 pulsanti193
R reference10,41,57,58 removePropertyChangeListener()309 reset()114,123 ricorsione65 round-robin137 run()141 Runnable140
S scheduler137 scheduling137 scopeVederevariabili
Indice analitico 359
SDK331 criteridiscelta331 sequenzaxxvi serializzazione329 ServerSocket290 setMaxPriority()174 setPriority()149 setSoTimeout()287 setter42 SherlockHolmes104 Shiningxxx Short54 short2 shortcircuit22 skip()113 Socket276 SocketInputStream287 SocketOutputStream287 sorgentexix sorgenti dieventi317 unicast317 sottoclasse68 spaziodeinomi89 stack66 start()141 static79 stop()142,155 Stream109 filtro116 strictfp92 String44 metodidi46 stringhe concatenazione45 creazione44 strongtyping85 strutturadicontrollo decisionalexxviii iterativaxxx super72,73 superclasse69 switch26
synchronized92,162,164 System.in116 System.out115
T TCP/IP277 TCP(TransferControlProtocol)294 Telnet276 this72 Thread138,140 ThreadGroup173 throw98 Throwable96 throws97 time-slicing137 tipiprimitivi1 TitledBorder250 ToolBar204 transient92 true4,21 try95
U Unicode5 UnknownHostException278 upcasting75 URL(UniformResourceLocator)279 UserDatagramProtocol(UDP)294 UserThread172
V variabilixxvii locali64 visibilit‡(scope)64 Vector50 metodidi50 vettori9.Vederearray VirtualMachinexx visibilit‡dellevariabili64 void59 volatile92
360 Indice analitico
W Web276 while29,xxx wrapperclass54 metodidi55 write()111 writeUTF()119
X XOR4,22