761 122 7MB
Italian Pages 736 [884] Year 2018
MANUALE DI JAVA 9
Claudio De Sio Cesari
MANUALE DI JAVA 9 Programmazione orientata agli oggetti con Java Standard Edition 9
EDITORE ULRICO HOEPLI MILANO
Copyright © Ulrico Hoepli Editore S.p.A. 2018 via Hoepli 5, 20121 Milano (Italy) tel. +39 02 864871 – fax +39 02 8052886 e-mail [email protected]
www.hoepli.it Seguici su Twitter: @Hoepli_1870 www.hoepli.it Tutti i diritti sono riservati a norma di legge e a norma delle convenzioni internazionali ISBN EBOOK 978-88-203-8302-2 Progetto editoriale: Emanuele Giuliani ([email protected]) Copertina: Sara Taglialegne Realizzazione digitale: Promedia, Torino
Indice generale Prefazione
Parte I - Le basi del linguaggio Capitolo 1 - Introduzione a Java 1.1 Prerequisiti: concetti informatici di base 1.1.1 Hardware 1.1.2 Software 1.1.3 Linguaggi di programmazione 1.2 Introduzione a Java 1.2.1 Cos’è Java 1.2.2 Caratteristiche del linguaggio Java 1.3 Ambiente di sviluppo 1.3.1 Struttura del JDK 1.3.2 Guida per sviluppare passo dopo passo 1.4 Primo approccio al codice 1.4.1 Analisi del programma HelloWorld 1.4.2 Compilazione ed esecuzione del programma HelloWorld 1.4.3 La nostra interazione con il computer 1.5 Possibili problemi in fase di compilazione ed esecuzione 1.5.1 Possibili messaggi di errore in fase di compilazione 1.5.2 Possibili messaggi relativi alla fase di interpretazione
1.6 Altri ambienti di sviluppo Riepilogo
Capitolo 2 - Componenti fondamentali di un programma Java 2.1 Cosa significa creare un programma Java 2.1.1 Programmazione e paradigmi 2.1.2 Le basi della programmazione ad oggetti (OOP) 2.2 Le basi della programmazione object oriented: classi ed oggetti 2.2.1 Osservazione importante sulla classe Punto 2.2.2 Osservazione importante sulla classe TestOggettiPunto 2.2.3 Un’altra osservazione importante 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 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 2.5 I metodi costruttori 2.5.1 Caratteristiche di un costruttore 2.5.2 Costruttore di default 2.6 Introduzione ai package 2.6.1 Package e import 2.6.2 Gestione dei package manuale 2.7 Altri componenti fondamentali della programmazione Java 2.7.1 Interfacce 2.7.2 Enumerazioni 2.7.3 Annotazioni
2.7.4 Moduli 2.7.5 Inizializzatori 2.7.6 Classi innestate 2.7.7 Espressioni lambda Riepilogo
Capitolo 3 - Stile di codifica, tipi di dati ed array 3.1 Stile di codifica 3.1.1 Schema Libero 3.1.2 Commenti 3.1.3 Regole per gli identificatori 3.1.4 Standard e convenzioni per i nomi 3.2 Gestione della memoria 3.2.1 Byte 3.2.2 Sistemi numerici 3.2.3 Complemento a due 3.3 Tipi di dati primitivi 3.3.1 Tipi di dati interi 3.3.1.1 Promozione automatica nelle espressioni 3.3.1.2 Casting 3.3.1.3 Operazioni con interi 3.3.2 Tipi di dati a virgola mobile, casting e promotion 3.3.3 Underscore in tipi di dati numerici 3.3.4 Tipo di dato logico - booleano 3.3.5 Tipo di dato primitivo letterale 3.4 Tipi di dati non primitivi: reference 3.4.1 Passaggio di parametri per valore 3.4.2 Inizializzazione delle variabili d’istanza 3.5 Introduzione alla libreria standard 3.5.1 Il comando import 3.5.2 La classe String 3.5.3 La documentazione della libreria standard di Java
3.5.4 Lo strumento javadoc 3.6 Gli array in Java 3.6.1 Dichiarazione 3.6.2 Creazione 3.6.3 Inizializzazione 3.6.4 Array Multidimensionali 3.6.5 String args[] Riepilogo
Capitolo 4 - Operatori e Gestione del flusso di esecuzione 4.1 Operatori di base 4.1.1 Operatore d’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 4.2 Costrutti di programmazione semplici 4.2.1 Il costrutto if 4.2.2 Il costrutto while 4.3 Costrutti di programmazione avanzati 4.3.1 Il costrutto for 4.3.2 Il costrutto do 4.3.3 Ciclo for migliorato 4.3.4 Il costrutto switch 4.3.5 L’operatore ternario 4.3.6 break e continue 4.4 Programmare meglio
4.4.1 Approccio alla programmazione 4.4.2 Algoritmo 4.4.3 Introduzione ad UML Riepilogo
Capitolo 5 - Sviluppare realmente con Java 5.1 JShell 5.1.1 HelloWorld con JShell 5.1.2 JShell e codice Java 5.1.2.1 Esempi pratici 5.1.2.2 Regole JShell 5.1.3 Comandi JShell 5.1.3.1 Comandi esplorativi 5.1.3.2 Comandi esecutivi 5.1.4 Strumenti ausiliari di JShell 5.1.4.1 Variabili implicite 5.1.4.2 Forwarding reference 5.1.4.3 Auto-completamento 5.1.4.4 Il comando /edit 5.1.4.5 Scorciatoie da tastiera (shortcuts) 5.2 Integrated Development Environment (IDE) 5.2.1 Progetto 5.2.2 Editor 5.2.3 Debugger 5.2.4 Integrazioni 5.3 Realtà aziendale 5.3.1 Architettura 5.3.2 Conoscenze 5.3.3 Tipologie di programmi 5.3.4 Ruoli 5.3.5 Metodologia 5.4 Caso di studio
5.4.1 Raccolta requisiti con Use case e scenari 5.4.1.1 Use case diagram 5.4.1.2 Scenari dei casi d’uso 5.4.2 Architettura di alto livello 5.4.3 Key abstraction 5.4.4 Progettazione con diagrammi di interazione Riepilogo
Parte II - Object Orientation Capitolo 6 - Incapsulamento e visibilità 6.1 Breve storia della programmazione ad oggetti 6.2 I paradigmi della programmazione ad oggetti 6.2.1 Astrazione 6.2.2 Riuso 6.2.3 UML: Diagramma delle classi 6.3 Incapsulamento 6.3.1 Incapsulamento funzionale 6.3.2 Incapsulamento e riuso 6.3.3 Il reference this 6.3.4 Uso di this con variabili 6.3.5 Uso di this con metodi e costruttori 6.4 Quando utilizzare l’incapsulamento 6.5 Come usare l’incapsulamento 6.6 Gestione dei package 6.6.1 Gestione manuale 6.6.2 Moduli 6.7 Modificatori d’accesso 6.7.1 Modificatore public
6.7.2 Modificatore protected 6.7.3 Nessun modificatore d’accesso 6.7.4 Modificatore private 6.8 Il modificatore static 6.8.1 Metodi statici 6.8.2 Variabili statiche (di classe) 6.8.3 Inizializzatori statici ed inizializzatori d’istanza 6.8.4 Static import 6.8.5 Quando usare static 6.8.6 Design Pattern Singleton Riepilogo
Capitolo 7 - Ereditarietà ed interfacce 7.1 Ereditarietà 7.1.1 La parola chiave extends 7.2 Il modificatore final 7.3 La classe Object 7.4 Rapporto ereditarietà-incapsulamento 7.5 Quando utilizzare l’ereditarietà 7.5.1 La relazione “is a” 7.5.2 Ereditarietà e costruttori 7.5.3 La parola chiave super 7.5.4 Ereditarietà e modificatori 7.5.5 Ereditarietà e inizializzatori 7.5.6 Generalizzazione e specializzazione 7.6 Il modificatore abstract 7.6.1 Metodi astratti 7.6.2 Classi astratte 7.7 Interfacce 7.7.1 Definizione classica (pre-Java 8)
7.7.2 Metodi statici 7.7.3 Metodi di default 7.7.4 Interfacce funzionali 7.7.5 Ereditarietà multipla 7.7.5.1 Diamond Problem 7.7.5.2 Conflitto tra un metodo astratto e uno concreto 7.7.5.3 Conflitto tra due metodi astratti 7.7.5.4 Conflitto tra metodi ridefiniti 7.7.5.5 Class always wins 7.7.6 Differenze tra interfacce e classi astratte Riepilogo
Capitolo 8 - Polimorfismo 8.1 Polimorfismo 8.1.1 Convenzione per i reference 8.2 Polimorfismo per metodi 8.2.1 Overload 8.2.2 Varargs 8.2.3 Override 8.2.4 Annotazione sull’override 8.3 Polimorfismo per dati 8.3.1 Parametri polimorfi 8.3.2 Collezioni eterogenee 8.3.3 Casting di oggetti 8.3.4 Invocazione virtuale dei metodi 8.3.5 Esempio d’utilizzo del polimorfismo 8.3.6 Polimorfismo e interfacce Riepilogo
Capitolo 9 - Eccezioni ed asserzioni 9.1 Eccezioni, errori ed asserzioni
9.2 Gerarchie e categorizzazioni 9.3 Meccanismo per la gestione delle eccezioni 9.4 Try with resources 9.5 Eccezioni personalizzate e propagazione dell’eccezione 9.5.1 Warnings 9.5.2 Altra regola sull’override 9.6 Introduzione alle asserzioni 9.6.1 Progettazione per contratto 9.6.2 Note per l’esecuzione di programmi che utilizzano la parola assert 9.6.3 Quando usare le asserzioni 9.6.3.1 Consiglio 1 9.6.3.2 Consiglio 2 9.6.3.3 Consiglio 3 9.6.4 Conclusioni Riepilogo Conclusioni Parte II
Parte III - Caratteristiche avanzate Capitolo 10 - Enumerazioni e Tipi Innestati 10.1 Classi innestate: classi interne 10.1.1 Classe innestata: definizione 10.1.2 Classi innestate: proprietà 10.1.3 Quando usare le classi innestate 10.2 Classi anonime: definizione 10.2.1 Quando usare le classi innestate 10.3 Tipi Enumerazioni 10.3.1 Ereditarietà e polimorfismo con enum
10.3.2 Metodi, variabili, costruttori e tipi innestati in una enumerazione 10.3.3 Quando utilizzare una enum 10.3.4 Enumerazioni innestate (in classi) o enumerazioni membro 10.3.5 Enumerazioni e metodi specifici degli elementi 10.3.6 Switch e enum Riepilogo
Capitolo 11 - Generics 11.1 Generics e tipi parametro 11.1.1 Generics e collection 11.1.2 Tipi primitivi e autoboxing-autounboxing 11.1.3 Interfaccia Iterator 11.1.4 Interfaccia Map 11.1.5 Deduzione automatica del tipo 11.1.6 Raw type e XLint 11.2 Ereditarietà e tipi generici 11.2.1 Ereditarietà e tipo parametro 11.2.2 Type erasure 11.2.3 Wildcard 11.3 Creare propri tipi generici 11.3.1 Parametri bounded 11.3.2 Wildcard bounded 11.3.3 Metodi generici 11.3.4 Wildcard capture e metodi helper 11.4 Parametri covarianti 11.4.1 Problema dei parametri covarianti 11.4.2 Soluzione con bounded parameter Riepilogo
Capitolo 12 - La libreria indispensabile: il package java.lang
12.1 La classe Object 12.1.1 Il metodo equals() 12.1.2 Il metodo hashcode() 12.1.3 Il metodo toString() 12.1.4 Il metodo clone() 12.2 La classe System 12.2.1 Input e output 12.2.2 Le properties 12.2.3 Altri metodi di System 12.2.4 Garbage collection 12.3 La classe Runtime 12.4 La classe Class e Reflection 12.4.1 Istanziare un oggetto Class 12.4.2 Class è un tipo generico 12.4.3 Un esempio di reflection 12.4.4 Nomi dei parametri dei metodi 12.5 La classe String 12.5.1 Gestione in memoria 12.5.2 Dichiarazione della classe String 12.5.3 I metodi di String 12.5.3.1 char charAt(int index) 12.5.3.2 String concat(String other) 12.5.3.3 int compareTo(String other) 12.5.3.4 boolean endsWith(String suffix) 12.5.3.5 boolean equals(Object ob) 12.5.3.6 boolean equalsIgnoreCase(String s) 12.5.3.7 static String format(String format, Object... args) 12.5.3.8 int indexOf(int ch) 12.5.3.9 int indexOf(int ch, int fromIndex) 12.5.3.10 String intern() 12.5.3.11 static String join(CharSequence delimiter, CharSequence... elements)
12.5.3.12 static join(CharSequence delimiter, Iterable