Giuseppe Callegarin Java, Oggetti e Strutture Dati Cedam 2004 www.javaOSD.org INDICE CAP. 1 Macchine, linguaggi e comunicazioni ..................................................... 1 1.1 Dai grandi elaboratori all’era dei dispositivi programmabili e comunicanti......... 1 1.2 Ostacoli alla comunicazione e possibili soluzioni .................................................... 3 Piattaforme e portabilità ............................................................................................... 3 Interfacciamento con l'utente........................................................................................ 4 La torre di Babele dei linguaggi di programmazione ..................................................... 5 Distribuzione e protocolli ............................................................................................. 6 Sicurezza ..................................................................................................................... 7 Il concetto di interoperabilità........................................................................................ 7 La comunicazione di documenti e XML ....................................................................... 8 I Servizi Web ............................................................................................................. 10 Modellare con UML................................................................................................... 11 1.3 Macchine e linguaggi ............................................................................................. 12 Macchine astratte e concrete ...................................................................................... 13 Interpretazione........................................................................................................... 13 Compilazione ............................................................................................................. 14 Macchine virtuali........................................................................................................ 15 Linguaggi intermedi (bytecode) .................................................................................. 16 1.4 La programmazione ad oggetti.............................................................................. 18 Origini e motivazioni della OOP ................................................................................. 18 Terminologia essenziale sugli oggetti.......................................................................... 19 Creazione ed uso di oggetti ........................................................................................ 22 Classi clienti e messaggi ............................................................................................. 22 Messaggi e diagrammi di sequenza ............................................................................. 23 Metodi che modificano e metodi che osservano .......................................................... 24 Information hiding e astrazione................................................................................... 25 Ereditarietà ................................................................................................................ 26 Overriding (ridefinizione) di metodi............................................................................ 28 Ereditarietà multipla ................................................................................................... 29 Polimorfismo.............................................................................................................. 30 Classi e metodi astratti ............................................................................................... 31 Interfacce................................................................................................................... 33 ESERCIZI §1.4 ............................................................................................................ 34 1.5 Il fenomeno Java .................................................................................................... 36 La genesi di Java ........................................................................................................ 36 Caratteristiche di Java ................................................................................................ 36 viii Indice Edizioni e versioni di Java .......................................................................................... 37 Primi esempi di Java................................................................................................... 38 1.6 Strutture dati, algoritmi e oggetti.......................................................................... 40 COMPLEMENTI al Cap. 1 ....................................................................................... 42 C1.1 Sviluppare ed eseguire programmi Java ............................................................ 42 C1.2 La proposta alternativa della Microsoft (dot net).............................................. 46 TEST DI AUTOVERIFICA ........................................................................................ 48 CAP. 2 Introduzione a Java............................................................................... 49 2.1 Preliminari, tipi, espressioni e riferimenti............................................................. 50 "Hello" e commenti .................................................................................................... 50 Blocchi e istruzioni..................................................................................................... 52 Regola del punto e virgola.......................................................................................... 52 Scrittura a video ed espressioni .................................................................................. 53 Letterali e UNICODE ................................................................................................ 54 Lettura dei parametri della linea comando................................................................... 54 Prime eccezioni .......................................................................................................... 55 Regole per gli identificatori ........................................................................................ 55 Variabili e assegnamento ............................................................................................ 56 Durata e campo d'azione delle variabili locali.............................................................. 58 Costanti simboliche .................................................................................................... 60 Tipi riferimento e variabili riferimento......................................................................... 60 Riferimento null ...................................................................................................... 62 "Hello" ad oggetti ...................................................................................................... 62 Effetti collaterali su oggetti ........................................................................................ 63 Uso e significato della variabile this ......................................................................... 64 Classificazione dei tipi di Java..................................................................................... 65 Comandi ed espressioni .............................................................................................. 66 Tipi primitivi e classe Math ........................................................................................ 67 I tipi integrali.............................................................................................................. 68 I tipi in virgola mobile ................................................................................................ 68 Sequenze di escape per i caratteri ............................................................................... 69 Operatori e precedenze............................................................................................... 70 Controllo forte dei tipi................................................................................................ 72 Casting e promozioni (conversioni di tipo) ................................................................. 72 Conversioni da stringa a numero e viceversa............................................................... 74 Problemi risolti........................................................................................................... 76 ESERCIZI §2.1 ............................................................................................................ 77 2.2 Metodi e attributi statici........................................................................................ 79 Metodi statici ............................................................................................................. 79 Attributi statici e inizializzatore statico ....................................................................... 81 ESERCIZI §2.2 ............................................................................................................ 82 2.3 Rudimenti di input/output .................................................................................... 83 Standard input e output .............................................................................................. 83 Lettura da tastiera e importazione di classi.................................................................. 84 ESERCIZI §2.3 ............................................................................................................ 86 2.4 Java funzionale....................................................................................................... 86 Definire funzioni statiche............................................................................................ 86 Firma di un metodo .................................................................................................... 87 Indice ix Funzioni ricorsive ed espressioni condizionali ............................................................. 87 Altri esempi di funzioni ricorsive ................................................................................ 89 ESERCIZI §2.4 ............................................................................................................ 91 2.5 Costrutti di controllo ............................................................................................. 92 Costrutto if .............................................................................................................. 92 Costrutto switch...................................................................................................... 96 Costrutto while ........................................................................................................ 97 Obblighi di inizializzazione ......................................................................................... 99 Costrutto for .......................................................................................................... 100 Costrutto do-while ............................................................................................... 102 Istruzioni break e continue nei cicli .................................................................... 103 ESERCIZI §2.5 .......................................................................................................... 104 2.6 Gli array ............................................................................................................... 105 Array monodimensionali e valori di default ............................................................... 105 Matrici ed array multidimensionali............................................................................ 108 Soluzione di problemi sugli array con uso di funzioni................................................ 110 ESERCIZI §2.6 .......................................................................................................... 113 2.7 Procedure e passaggio di parametri .................................................................... 114 Procedure (funzioni void ) ...................................................................................... 114 Ordinamento di un array........................................................................................... 116 Passaggio dei parametri............................................................................................ 117 Procedure ricorsive .................................................................................................. 119 ESERCIZI §2.7 .......................................................................................................... 123 2.8 Elaborazione di stringhe ...................................................................................... 123 Operazioni sulle stringhe .......................................................................................... 123 Confronto tra stringhe e tra oggetti .......................................................................... 124 Elaborazioni efficienti con StringBuffer e StringBuilder (Java 1.5) ........... 127 ESERCIZI §2.8 .......................................................................................................... 130 2.9 Oggetti immutabili............................................................................................... 130 Classi BigInteger e BigDecimal ....................................................................... 132 Definiamo la classe Razionale .............................................................................. 133 ESERCIZI §2.9 .......................................................................................................... 133 2.10 Ritardi, numeri casuali e grafica elementare .................................................... 135 Generazione di ritardi............................................................................................... 135 Generazione di numeri casuali .................................................................................. 136 Rudimenti di grafica elementare................................................................................ 138 Caricamento di immagini.......................................................................................... 142 ESERCIZI §2.10 ....................................................................................................... 144 2.11 Package utente e di piattaforma........................................................................ 145 I package ................................................................................................................. 145 Costruiamo dei package ........................................................................................... 145 I package di piattaforma........................................................................................... 148 ESERCIZI §2.11 ....................................................................................................... 150 2.12 Modificatori e visibilità...................................................................................... 150 Elenco dei modificatori............................................................................................. 150 Modificatori di accesso............................................................................................. 152 Assegnare la visibilità ad ogni entità ......................................................................... 153 Classi interne e classi anonime .................................................................................. 154 ESERCIZI §2.12 ....................................................................................................... 155 COMPLEMENTI al Cap. 2 ..................................................................................... 156 x Indice C2.1 Documentazione automatica con javadoc ...................................................... 156 C2.2 Espressioni regolari ........................................................................................... 162 TEST DI AUTOVERIFICA ...................................................................................... 164 CAP. 3 Approfondimenti su Java .................................................................... 165 3.1 Classi, tipi e involucri (box) ................................................................................. 165 Differenza tra classe e tipo ....................................................................................... 165 Sottotipi e supertipi.................................................................................................. 167 Il principio di sostituibilità ........................................................................................ 168 Regole sui tipi .......................................................................................................... 168 Upcasting/Downcasting............................................................................................ 169 Operatore instanceof .......................................................................................... 170 Le classi involucro (wrapper) ................................................................................... 171 Boxing/Unboxing ..................................................................................................... 172 Boxing/Unboxing impliciti (Java 1.5)........................................................................ 173 Tipi con ordinamento: l'interfaccia Comparable ..................................................... 174 ESERCIZI §3.1 .......................................................................................................... 176 3.2 Eccezioni e loro trattamento ................................................................................ 177 Cosa sono e come nascono le eccezioni.................................................................... 177 Leggere la "stack trace" ........................................................................................... 178 Trattare le eccezioni: un primo esperimento.............................................................. 179 Catena di rifiuti e conseguenze ................................................................................. 181 Costruire la robustezza............................................................................................. 181 Rifiuti e obblighi di trattamento (eccezioni controllate) ............................................. 182 Istruzione try-catch ............................................................................................ 184 Classe Throwable e classificazione delle eccezioni ................................................. 186 Istruzione throw ..................................................................................................... 187 Un esempio riassuntivo ............................................................................................ 187 ESERCIZI §3.2 .......................................................................................................... 189 3.3 Asserzioni (Java 1.4) ............................................................................................ 189 Cos'è un'asserzione ? ................................................................................................ 189 Simulare le asserzioni con le eccezioni...................................................................... 192 Verificare da programma l'abilitazione delle asserzioni.............................................. 193 ESERCIZI §3.3 .......................................................................................................... 194 3.4 Introduzione ai thread ......................................................................................... 194 Il concetto di thread ................................................................................................. 194 La creazione di thread .............................................................................................. 196 Sincronizzazione dei thread - Atomicità.................................................................... 199 Sincronizzazione su condizioni: wait e notify ...................................................... 204 Evoluzione degli stati di un thread ............................................................................ 207 Stallo e starvation..................................................................................................... 208 Esercizi §3.4 .............................................................................................................. 210 3.5 Array dinamici in Java: Vector ed ArrayList................................................ 210 La classe Vector .................................................................................................... 211 La classe ArrayList .............................................................................................. 213 3.6 La genericità (Java 1.5) ....................................................................................... 215 Il problema............................................................................................................... 215 La soluzione del problema: le classi generiche .......................................................... 216 Costruiamo una nostra classe generica...................................................................... 217 Indice xi Limitazioni sull'uso................................................................................................... 219 Il tipo grezzo di una classe generica.......................................................................... 219 Uso di più parametri ed espressioni di tipo "tipo"...................................................... 220 Genericità vincolata.................................................................................................. 220 Esercizi §3.6 ............................................................................................................... 222 3.7 Gli stream e la gestione dei file ............................................................................ 222 Il concetto di flusso .................................................................................................. 222 Concatenazione di flussi ........................................................................................... 224 Operazioni generali sui file ....................................................................................... 225 Creazione, scrittura e lettura di file testo................................................................... 226 Flussi di valori e di oggetti........................................................................................ 228 La gestione di file e cartelle ...................................................................................... 231 ESERCIZI §3.7 .......................................................................................................... 232 3.8 Uguaglianza e copia degli oggetti ..................................................................... 232 Ridefinire equals .................................................................................................. 233 Ridefinire e usare clone() per effettuare le copie .................................................. 235 Copie superficiali e copie profonde........................................................................... 237 ESERCIZI 3.8 ............................................................................................................ 239 3.9 Eventi e interfacce utente grafiche................................................................... 239 La programmazione guidata dagli eventi................................................................... 239 Gestione degli eventi con il modello di delegazione................................................... 240 Un primo esempio di ascolto .................................................................................... 242 Tipi di ascoltatori ..................................................................................................... 244 Gli adattatori............................................................................................................ 247 Componenti e contenitori ......................................................................................... 249 Componenti di testo ................................................................................................. 255 Gestione del Layout ................................................................................................. 257 Disegnare con il mouse............................................................................................. 259 Esercizi §3.9 ............................................................................................................... 261 3.10 Applet ................................................................................................................. 262 Cos'è una applet ? .................................................................................................... 262 Applet e sicurezza .................................................................................................... 263 Un'applet bottone e la console Java .......................................................................... 264 La lettura di parametri dalla pagina HTML............................................................... 266 Aprire pagine web da un'applet................................................................................. 268 Animazione con un'applet......................................................................................... 270 Visualizzazione di immagini...................................................................................... 272 ESERCIZI 3.10 .......................................................................................................... 274 COMPLEMENTI al Cap. 3. ..................................................................................... 274 C3.1 Garbage collection e finalize ........................................................................ 274 C3.2 Un esempio con le Swing................................................................................... 276 TEST DI AUTOVERIFICA ...................................................................................... 278 CAP.4 La progettazione ad oggetti.................................................................. 279 4.1 Oggetti, classi e relazioni tra classi ...................................................................... 279 Oggetti, astrazione e responsabilità........................................................................... 280 Stato di un oggetto - information hiding - metodi e attributi..................................... 281 Messaggi e classificazione dei metodi ....................................................................... 282 Il concetto di classe.................................................................................................. 283 Da UML a Java........................................................................................................ 285 xii Indice Creare gli oggetti: l'uso dei costruttori...................................................................... 286 Uso delle classi......................................................................................................... 287 La parola this e la memorizzazione degli oggetti................................................... 287 La relazione di dipendenza tra classi ......................................................................... 288 Evitare l'uso di oggetti globali (static) .................................................................. 289 La relazione di composizione.................................................................................... 291 La relazione di aggregazione .................................................................................... 291 La relazione di ereditarietà ....................................................................................... 293 Polimorfismo e collegamento ritardato ..................................................................... 296 La visibilità non può diminuire nelle sottoclassi......................................................... 296 Overloading e overriding .......................................................................................... 297 Metodi astratti e classi astratte ................................................................................. 298 Interfacce e relazione di implementazione................................................................. 301 La catena dei costruttori in Java ............................................................................... 305 Il costruttore di default e i codici hash ...................................................................... 306 Gli oggetti come stringhe: ridefinire toString ...................................................... 307 ESERCIZI §4.1 .......................................................................................................... 309 4.2 Progettiamo una piccola Virtual Machine .......................................................... 311 Le specifiche del problema ....................................................................................... 312 Analisi del problema................................................................................................. 314 Una proposta di soluzione ........................................................................................ 316 Il codice Java ........................................................................................................... 317 4.3 Il progetto per contratto ...................................................................................... 320 Specificare precondizioni.......................................................................................... 320 Specificare postcondizioni........................................................................................ 321 Il contratto ............................................................................................................... 322 Programmazione per contratto in Java 1.4 ................................................................ 323 ESERCIZI §4.3 .......................................................................................................... 326 4.4 Introduzione ai design pattern ............................................................................ 327 COMPLEMENTI al Cap. 4 ...................................................................................... 330 C4.1 Progettare interfacce grafiche per gli oggetti ................................................... 330 C4.2 Le classi come oggetti: una prova di riflessione ............................................... 334 TEST DI AUTOVERIFICA ...................................................................................... 336 CAP. 5 Introduzione alle strutture dati........................................................... 337 5.1 Liste concatenate.................................................................................................. 338 Liste astratte e concrete............................................................................................ 338 Nodi concatenabili.................................................................................................... 339 Costruzione di liste concatenate ............................................................................... 340 Visita iterativa di una lista concatenata ..................................................................... 342 Visita ricorsiva di una lista concatenata .................................................................... 343 Inserimento in "mezzo" o in coda ............................................................................. 344 Inserimento di un elemento in testa........................................................................... 346 Cancellazione di un elemento.................................................................................... 346 Nodi sentinella ......................................................................................................... 348 Liste circolari ........................................................................................................... 349 Liste doppiamente concatenate................................................................................. 349 Problemi risolti sulle liste concatenate....................................................................... 350 ESERCIZI §5.1 .......................................................................................................... 354 5.2 Pile ........................................................................................................................ 355 Indice xiii Il concetto di pila ..................................................................................................... 355 Implementazione a lista ............................................................................................ 356 Implementazione con un vettore............................................................................... 358 Un'applicazione delle pile: la valutazione di espressioni RPN .................................... 359 ESERCIZI §5.2 .......................................................................................................... 362 5.3 Iteratori ................................................................................................................ 362 Analisi del problema................................................................................................. 362 Il concetto................................................................................................................ 363 La soluzione del problema........................................................................................ 366 Attraversamenti multipli ........................................................................................... 368 Problemi degli iteratori............................................................................................. 369 Gli iteratori della libreria standard di Java ................................................................. 369 Gli iteratori impliciti e il " foreach" (Java 1.5).......................................................... 371 ESERCIZI §5.3 .......................................................................................................... 373 5.4 Code...................................................................................................................... 374 Il concetto di coda.................................................................................................... 374 Impleme7ntazione con le liste concatenate................................................................ 375 Implementazione per code limitate............................................................................ 377 Code doppie e classe LinkedList ......................................................................... 378 Code con priorità ..................................................................................................... 380 Esercizi §5.4 ............................................................................................................... 381 5.5 Alberi binari......................................................................................................... 381 Definizione di albero binario ..................................................................................... 381 Operazioni sugli alberi binari .................................................................................... 383 Visite degli alberi binari............................................................................................ 383 Gli alberi binari come oggetti.................................................................................... 385 Problemi risolti sugli alberi binari.............................................................................. 388 Visite iterative e iteratore per gli alberi binari............................................................ 393 ESERCIZI §5.5 .......................................................................................................... 397 5.6 Alberi binari di ricerca ........................................................................................ 398 Definizione di albero binario di ricerca...................................................................... 398 Ricerca negli ABR................................................................................................... 400 Inserimenti e cancellazioni in un ABR....................................................................... 400 Alberi binari di ricerca come oggetti ......................................................................... 402 Un iteratore per gli alberi binari di ricerca................................................................. 404 ESERCIZI §5.6 .......................................................................................................... 407 5.7 Alberi.................................................................................................................... 408 Definizione di albero ................................................................................................ 408 Visite di un albero .................................................................................................... 410 La rappresentazione in memoria di alberi e foreste.................................................... 411 Rappresentare gli alberi con gli alberi binari: la rappresentazione naturale ................. 411 Gli alberi come oggetti ............................................................................................. 412 Iteratori per alberi .................................................................................................... 414 ESERCIZI §5.7 .......................................................................................................... 417 5.8 Grafi ..................................................................................................................... 418 Definizioni di grafo e terminologia............................................................................ 418 Rappresentazioni dei grafi ........................................................................................ 420 Visite (ricerche) in profondità e in larghezza sui grafi................................................ 422 I grafi come oggetti.................................................................................................. 423 Cammini minimi da un nodo (algoritmo di Dijkstra).................................................. 428 Esercizi §5.8 ............................................................................................................... 434 xiv Indice 5.9 Strutture basate sulla trasformazione hash......................................................... 435 Dizionari o mappe .................................................................................................... 436 La trasformazione hash............................................................................................. 436 Collisioni.................................................................................................................. 437 Risoluzione delle collisioni ....................................................................................... 440 Prestazioni e limiti delle tabelle hash ......................................................................... 442 Tabelle e insiemi hash di Java ................................................................................... 443 ESERCIZI §5.9 .......................................................................................................... 445 COMPLEMENTI al Cap. 5 ...................................................................................... 445 C5.1 Notazione O-grande e complessità computazionale ......................................... 445 C5.2 Introduzione al Collections Framework di Java 1.5 ........................................ 449 TEST DI AUTOVERIFICA ...................................................................................... 451 Idee per progetti............................................................................................... 452 Appendice A.1. Installazione dei package di javaOSD ................................... 453 Appendice A.2 ndice delle tabelle su Java....................................................... 455 Bibliografia essenziale...................................................................................... 456 Sitografia essenziale ......................................................................................... 456 Indice analitico ................................................................................................. 457