Indice generale Prefazione xvu Modulo 1 - Introduzione a Java 7 1 1.1 Introduzione a Java 1.1.1 Cosa èjava 1.1.2 Breve storia di Java 1.1.3 Perché Java (why) 1.1.4 Caratteristiche di Java 2 2 3 5 6 1.2 Situazione attuale 11 1.3 Ambiente di sviluppo 1.3.1 Ambienti di sviluppo più complessi 11 12 1.4 Struttura del JDK 1.4.1 Guida dello sviluppatore passo dopo passo 13 14 1.5 Primo approccio al codice 16 1.6 Analisi del programma "HelloWorId" 17 1.7 Compilazione ed esecuzione del programma HelloWorId 20 1.8 Possibili problemi in fase di compilazione ed esecuzione 1.8.1 Possibili messaggi di errore in fase di compilazione 1.8.2 Possibili messaggi relativi alla fase di interpretazione 21 21 22 1.9 Riepilogo 23 1.10 Esercizi modulo 1 24 1.11 Soluzioni esercizi modulo 1 26 Modulo 2 - Componenti fondamentali di un programma Java 29 2.1 Componenti fondamentali di un programma Java 2.1.1 Convenzione per la programmazione Java 30 30 2.2 Le basi della programmazione object oriented: classi e oggetti 2.2.1 Osservazione importante sulla classe Punto 2.2.2 Osservazione importante sulla classe Principale 2.2.3 Un'altra osservazione importante 31 35 36 37 2.3 I metodi in Java 2.3.1 Dichiarazione di un metodo 2.3.2 Chiamata (o invocazione) di un metodo 2.3.3 Varargs 38 39 41 43 2.4 Le variabili in Java 2.4.1 Dichiarazione di una variabile: 2.4.2 Variabili d'istanza 2.4.3 Variabili locali 2.4.4 Parametri formali 43 43 44 45 45 2.5 I metodi costruttori 2.5.1 Caratteristiche di un costruttore 2.5.2 Costruttore di default 2.5.3 Package 46 46 48 50 2.6 Riepilogo 50 2.7 Esercizi modulo 2 52 2.8 Soluzioni esercizi modulo 2 54 Modulo 3 - Identificatori, tipi di dati e d array 59 3.1 Stile di codifica 3.1.1 Schema Libero 3.1.2 Case sensitive 3.1.3 Commenti 3.1.4 Regole per gli identificatori 3.1.5 Regole facoltative per gli identificatori e convenzioni per i nomi 60 60 62 62 63 64 3.2 Tipi di dati primitivi 3.2.1 Tipi di dati interi, casting e promotion 3.2.2 Tipi di dati a virgola mobile, casting e promotion 3.2.3 Underscore in tipi di dati numerici 3.2.4 Tipo di dato logico-booleano 3.2.5 Tipo di dato primitivo letterale 66 66 71 73 74 75 3.3 Tipi di dati non primitivi: reference 3.3.1 Passaggio di parametri per valore 3.3.2 Inizializzazione delle variabili d'istanza 76 78 80 3.4 Introduzione alla libreria standard 3.4.1 II comando import 3.4.2 La classe String 3.4.3 La documentazione della libreria standard di Java 3.4.4 Lo strumento javadoc 3.4.5 Gli array in Java 3.4.6 Dichiarazione 3.4.7 Creazione 81 82 83 85 86 87 87 88 VI 3.4.8 Inizializzazione 3.4.9 Array multidimensionali 3.4.10 Limiti degli array 88 89 89 3.5 Riepilogo 90 3.6 Esercizi modulo 3 91 3.7 Soluzioni esercizi modulo 3 93 Modulo 4 - Operatori e gestione del flusso di esecuzione 97 4.1 Operatori di base 4.1.1 Operatore di assegnazione 4.1.2 Operatori aritmetici 4.1.3 Operatori (unari) di pre e post-incremento (e decremento) 4.1.4 Operatori bitwise 4.1.5 Operatori relazionali o di confronto 4.1.6 Operatori logico-booleani 4.1.7 Concatenazione di stringhe con + 4.1.8 Priorità degli operatori 97 98 98 99 100 102 105 106 106 4.2 Gestione del flusso di esecuzione 107 4.3 Costrutti di programmazione semplici 4.3.1 II costrutto if 4.3.2 L'operatore ternario 4.3.3 II costrutto while 108 108 110 110 4.4 Costrutti di programmazione avanzati 4.4.1 II costrutto for 4.4.2 II costrutto do 4.4.3 Ciclo for migliorato 4.4.4 II costrutto switch 4.4.5 Due importanti parole chiave: break e continue 111 111 113 114 115 117 4.5 Riepilogo 119 4.6 Esercizi modulo 4 120 4.7 Soluzioni esercizi modulo 4 121 Modulo 5 - Programmazione ad oggetti utilizzando Java: incapsulamento ed ereditarietà 12.5 5.1 Breve storia della programmazione ad oggetti 126 5.2 I paradigmi della programmazione ad oggetti 5.2.1 Astrazione e riuso 128 128 VII 5.3 Incapsulamento 5.3.1 Prima osservazione sull'incapsulamento 5.3.2 Seconda osservazione sull'incapsulamento 5.3.3 II reference this 5.3.4 Due stili di programmazione a confronto 130 135 136 137 138 5.4 Quando utilizzare l'incapsulamento 140 5.5 Ereditarietà 5.5.1 La parola chiave extends 5.5.2 Ereditarietà multipla e interfacce 5.5.3 La classe Object % 143 143 144 144 5.6 Quando utilizzare l'ereditarietà 5.6.1 La relazione "is a" 5.6.2 Generalizzazione e specializzazione 5.6.3 Rapporto ereditarietà-incapsulamento 5.6.4 Modificatore protected 5.6.5 Conclusioni 145 145 146 147 147 148 5.7 Riepilogo 148 5.8 Esercizi modulo 5 149 5.9 Soluzioni esercizi modulo 5 156 Modulo 6 - Programmazione ad oggetti utilizzando Java: polimorfismo 161 6.1 Polimorfismo 6.1.1 Convenzione per i reference 161 162 6.2 Polimorfismo per metodi 6.2.1 Overload 6.2.2 Varargs 6.2.3 Override 6.2.4 Override e classe Object: metodi toString(), clone(), equalsQ e hashcode() 6.2.5 Annotazione sull'override 164 164 166 167 170 173 6.3 Polimorfismo per dati 6.3.1 Parametri polimorfi 6.3.2 Collezioni eterogenee 6.3.3 Casting di oggetti 6.3.4 Invocazione virtuale dei metodi 6.3.5 Esempio d'utilizzo del polimorfismo 6.3.6 Conclusioni 174 175 176 179 180 182 184 6.4 Riepilogo 184 6.5 Esercizi modulo 6 185 6.6 Soluzioni esercizi modulo 6 187 Vili Modulo 7 - Un esempio guidato alla programmazione ad oggetti 191 7.1 Perché questo modulo 191 7.2 Esercizio 7.a 193 7.3 Risoluzione dell'esercizio 7.a 7.3.1 Passo 1 7.3.2 Passo 2 7.3.3 Passo 3 7.3.4 Passo 4 7.3.5 Passo 5 7.4 Introduzione al test e al debug 7.4.1 Unit Testing in teoria 7.4.2 Unit Test in pratica conJUnit 7.4.3 Debug 193 193 195 196 198 201 202 202 204 208 7.5 Riepilogo 209 7.6 Esercizi modulo 7 211 7.7 Soluzioni esercizi modulo 7 212 Modulo 8 - Caratteristiche a v a n z a t e d e l linguaggio 213 8.1 Costruttori e polimorfismo 8.1.1 Overload dei costruttori 8.1.2 Override dei costruttori 214 216 217 8.2 Costruttori ed ereditarietà 217 8.3 super: un "super reference" 8.3.1 super e i costruttori 219 220 8.4 Altri componenti di un'applicazione Java: classi innestate e anonime 8.4.1 Classi innestate: introduzione e storia 8.4.2 Classe innestata: definizione 8.4.3 Classi innestate: proprietà 8.4.4 Classi anonime: definizione 223 223 226 226 229 8.5 Riepilogo 230 8.6 Esercizi modulo 8 231 8.7 Soluzioni esercizi modulo 8 231 Modulo 9 - Modificatori, package e interfacce 233 9.1 Modificatori fondamentali 234 9.2 Modificatori d'accesso 235 IX 9.3 Gestione dei package 9.3.1 Classpath 9.3.2 FileJAR 9.3.3 Classpath efileJAR 9.3.4 Gestione "a mano" 236 238 239 239 240 9.4 II modificatore final 242 9.5 II modificatore static 9.5.1 Metodi statici 9.5.2 Variabili statiche (di classe) 9.5.3 Inizializzatori statici e inizializzatori d'istanza 9.5.4 Static import 243 243 244 246 248 9.6 II modificatore abstract 9.6.1 Metodi astratti 9.6.2 Classi astratte 250 250 250 9.7 Interfacce 9.7.1 Regole di conversione dei tipi 9.7.2 Ereditarietà multipla 9.7.3 Differenze tra interfacce e classi astratte 252 253 254 255 9.8 Tipi enumerazioni 9.8.1 Ereditarietà ed enum 9.8.2 Costruttori ed enum 9.8.3 Quando utilizzare un'enum 256 257 257 258 9.9 Modificatori di uso raro: native, volatile e strictfp 9.9.1 II modificatore strictfp 9.9.2 II modificatore native 9.9.3 II modificatore volatile 260 261 261 263 9.10 Riepilogo 264 9.11 Esercizi modulo 9 265 9.12 Soluzioni esercizi modulo 9 266 Modulo 10 - Eccezioni e asserzioni 269 10.1 Eccezioni, errori e asserzioni 269 10.2 Gerarchle e categorizzazioni 270 10.3 Meccanismo per la gestione delle eccezioni 272 10.4 Try with resources 278 10.5 Eccezioni personalizzate e propagazione dell'eccezione 10.5.1 Precisazione sull'override 279 286 10.6 Introduzione alle asserzioni 10.6.1 Progettazione per contratto 287 289 10.6.2 Uso delle asserzioni 10.6.3 Note per la compilazione di programmi che utilizzano la parola assert 10.6.4 Note per l'esecuzione di programmi che utilizzano la parola assert 10.6.5 Quando usare le asserzioni 10.6.6 Conclusioni 290 290 291 293 298 10.7 Riepilogo 299 10.8 Esercizi modulo 10 300 10.9 Soluzioni esercizi modulo 10 302 Modulo 1 1 - Gestione dei thread 305 11.1 Introduzione ai thread 11.1.1 Definizione provvisoria di thread 11.1.2 Cosa significa "multithreading" 306 306 307 11.2 La classe Thread e la dimensione temporale 11.2.1 Analisi di ThreadExists 11.2.2 L'interfaccia Runnable e la creazione dei thread 11.2.3 Analisi di ThreadCreation 11.2.4 La classe Thread e la creazione dei thread 308 309 310 312 316 11.3 Priorità, scheduler e sistemi operativi 11.3.1 Analisi di ThreadRace 11.3.2 Comportamento Windows (time slicing o round-robin scheduling) 11.3.3 Comportamento Unix (preemptive scheduling) 317 319 320 320 11.4 Thread e sincronizzazione 11.4.1 Analisi di Synch 11.4.2 Monitor e Lock 323 325 331 11.5 La comunicazione fra thread 11.5.1 Analisi di IdealEconomy 331 333 11.6 Concorrenza 337 11.7 Riepilogo 339 11.8 Esercizi modulo 1 1 340 11.9 Soluzioni esercizi modulo 11 341 Modulo 12 - Le librerie alla base del linguaggio: java.lang e java.util 343 12.1 Package java.util 12.1.1 Framework Collections 12.1.2 Implementazioni di Map e SortedMap 344 344 346 XI 12.1.3 Implementazioni di Set e SortedSet 12.1.4 Implementazioni di List 12.1.5 Le interfacce Queue, BlockingQueue e ConcurrentMap 12.1.6 Algoritmi e utilità 12.1.7 Collection personalizzate 12.1.8 Collections e Generics 12.1.9 Le classi Properties e Preferences 12.1.10 Classe Locale e internazionalizzazione 12.1.11 La classe ResourceBundle 12.1.12 Date, orari e valute 12.1.13 La classe StringTokenizer 12.1.14 Espressioni regolari 348 349 352 354 357 357 359 363 364 366 368 369 12.2 Introduzione al package java.lang 12.2.1 La classe String 12.2.2 La classe System 12.2.3 La classe Runtime 12.2.4 La classe Class e Reflection 12.2.5 Le classi wrapper 12.2.6 La classe Math 371 372 374 375 376 378 380 12.3 Riepilogo 381 12.4 Esercizi modulo 12 382 12.5 Soluzioni esercizi modulo 12 384 Modulo 13 - Comunicare con Java: input, output e networking 387 13.1 Introduzione all'input-output 387 13.2 Pattern Decorator 13.2.1 Descrizione del pattern 388 388 13.3 Descrizione del package 13.3.11 Character Stream 13.3.2 I Byte Stream 13.3.3 Le superinterfacce principali 13.3.4 Chiusura degli stream 393 394 396 397 398 13.4 Input e output "classici" 13.4.1 Lettura di input da tastiera 13.4.2 Gestione dei 13.4.3 Serializzazione di oggetti 399 399 402 406 file 13.5 NIO 2.0 (New Input Output aggiornato a Java 7) 13.5.1 L'interfaccia Path 13.5.2 La classe Files 409 410 412 13.6 Introduzione al networking 417 XII 13.7 Riepilogo 421 13.8 Esercizi modulo 13 422 13.9 Soluzioni esercizi modulo 13 424 Modulo 14 - Java e la gestione dei dati: supporto a SQL e XML 427 14.1 Introduzione a JDBC 428 14.2 Le basi di JDBC 14.2.1 Implementazione del vendor (Driver JDBC) 14.2.2 Implementazione dello sviluppatore (Applicazione JDBC) 14.2.3 Analisi dell'esempio JDBCApp 429 430 430 431 14.3 Altre caratteristiche di JDBC 14.3.1 Indipendenza dal database 14.3.2 Altre operazioni JDBC (CRUD) 14.3.3 Statement parametrizzati 14.3.4 Stored procedure 14.3.5 Mappatore Java - SQL 14.3.6 Transazioni 14.3.7 Evoluzione di JDBC 14.3.8 JDBC 2.0 14.3.9JDBC 3.0 14.3.10 JDBC 4.0 e 4.1 434 434 435 435 436 436 439 439 440 441 442 14.4 Supporto a XML: JAXP 14.4.1 Creare un documento DOM a partire da un file XML 14.4.2 Recuperare la lista dei nodi da un documento DOM 14.4.3 Recuperare particolari nodi 14.4.4 XPATH 14.4.5 Modifica di un documento XML 14.4.6 Analisi di un documento tramite parsing SAX 14.4.7 Trasformazioni XSLT 449 450 451 451 453 455 456 458 14.5 Riepilogo 459 14.6 Esercizi modulo 14 460 14.7 Soluzioni esercizi modulo 14 462 Modulo 15 - Interfacce grafiche (GUI) con AWT, Applet e Swing 465 15.1 Introduzione alla Graphical User Interface (GUI) 465 15.2 Introduzione ad Abstract Window Toolkit (AWT) 15.2.1 Struttura della libreria AWT ed esempi 468 469 15.3 Creazione di interfacce complesse con i layout manager 472 XIII 15.3.1 II FlowLayout 15.3.2 II BorderLayout 15.3.3 II GridLayout 15.3.4 Creazione di interfacce grafiche complesse 15.3.5 II GridBagLayout 15.3.6 II CardLayout 15.4 Gestione degli eventi 15.4.1 Observer e Listener 15.4.2 Classi innestate e classi anonime 15.4.3 Altri tipi di eventi 15.5 La classe Applet 15.6 Introduzione a Swing 15.6.1 Swing vs AWT 15.6.2 Le ultime novità per Swing 15.6.3 FileJAR eseguibile 15.7 Riepilogo 15.8 Esercizi modulo 15 15.9 Soluzioni esercizi modulo 15 474 476 477 478 480 480 482 482 485 487 Modulo 16 - Autoboxing, Autounboxing e Generics 505 16.1 Introduzione a Tiger 16.1.1 Perché Java 5? 16.2 Autoboxing e Autounboxing 16.2.1 Impatto su Java 506 508 Assegnazione di un valore nuli al tipo wrapper Costrutti del linguaggio e operatori relazionali Overload 16.3 Generics 16.3.1 Dietro le quinte 16.3.2 Tipi primitivi 16.3.3 Interfaccia Iterator 16.3.4 Interfaccia Map 16.3.5 Ereditarietà dei Generics 16.3.6 Wildcard 16.3.7 Creare propri tipi generici 16.3.8 Java 7 e la deduzione automatica del tipo 16.3.9 Impatto su Java Compilazione Cambiamento di mentalità Parametri covarianti Casting automatico di reference al loro tipo "intersezione" nelle operazioni condizionali XIV 491 494 495 499 500 501 502 503 508 510 511 511 512 513 515 515 516 517 517 518 520 524 525 526 528 528 532 16.4 Riepilogo 534 16.5 Esercizi modulo 16 535 16.6 Soluzioni esercizi modulo 16 538 Modulo 1 7 - Ciclo for migliorato ed enumerazioni 541 17.1 Ciclo for migliorato 17.1.1 Limiti del ciclo for migliorato 17.1.2 Implementazione di un tipo Iterable 17.1.3 Impatto su Java 541 543 544 545 17.2 Tipi Enumerazioni 17.2.1 Perché usare le enumerazioni 17.2.2 Proprietà delle enumerazioni Le enumerazioni sono trasformate in classi dal compilatore Un'enumerazione non può estendere altre enumerazioni né altre classi, ma può implementare interfacce Gli elementi di un'enumerazione sono istanze dell'enumerazione stessa Gli elementi di un'enumerazione sono implicitamente public, static e Le enumerazioni non possono dichiarare costruttori public La classe java.lang.Enum 17.2.3 Caratteristiche avanzate di un'enumerazione Enumerazioni innestate (in classi) o enumerazioni membro Enumerazioni e metodi Enumerazioni e metodi specifici degli elementi 17.2.4 Impatto su Java Nuova parola chiave enum Costrutti Interfacce 545 548 550 550 final 550 551 551 551 551 552 553 554 555 556 556 557 558 17.3 Riepilogo 559 17.4 Esercizi modulo 17 560 17.5 Soluzioni esercizi modulo 17 563 Modulo 18 - Varargs e static import 565 18.1 Varargs 18.1.1 Approfondimento sui varargs 18.1.2 Impatto su Java Flessibilità con il polimorfismo Override Formattazioni di output 565 569 570 570 571 571 XV 18.2 Static importi 18.2.1 Un parere personale 18.2.2 Impatto su Java Reference ambigui Shadowing 573 575 577 578 579 18.3 Riepilogo 579 18.4 Esercizi modulo 18 580 18.5 Soluzioni esercizi modulo 18 582 Modulo 19 - Annotazioni (metadati) 585 19.1 Introduzione al modulo 585 19.2 Definizione di annotazione (metadato) 19.2.1 Primo esempio 19.2.2 Tipologie di annotazioni e sintassi 586 589 592 19.3 Annotare annotazioni (metaannotazioni) 19.3.1 Target 19.3.2 Retention 19.3.3 Documented 19.3.4 Inherited 19.3.5 Override 19.3.6 Deprecated 19.3.7 SuppressWarnings 19.3.8 Impatto su Java 596 597 598 599 601 602 603 604 606 19.4 Riepilogo 607 19.5 Ed ora? 607 19.6 Esercizi modulo 19 608 19.7 Soluzioni esercizi modulo 19 610 Indice analitico XVI 613