Manuale di Java 9. Programmazione orientata agli oggetti con Java standard edition 9 8820383020, 9788820383022

Java non sarà mai più lo stesso! Il Manuale di Java 9 è stato strutturato per soddisfare le aspettative di aspiranti pro

2,576 252 7MB

Italian Pages 736 [884] Year 2018

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Manuale di Java 9. Programmazione orientata agli oggetti con Java standard edition 9
 8820383020, 9788820383022

Table of contents :
Frontespizio
Copyright
Indice
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 signiica 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 codiica, tipi di dati ed array
3.1 Stile di codiica
3.1.1 Schema Libero
3.1.2 Commenti
3.1.3 Regole per gli identiicatori
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 lusso 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 Modiicatori d’accesso
6.7.1 Modiicatore public
6.7.2 Modiicatore protected
6.7.3 Nessun modiicatore d’accesso
6.7.4 Modiicatore private
6.8 Il modiicatore 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 modiicatore 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 modiicatori
7.5.5 Ereditarietà e inizializzatori
7.5.6 Generalizzazione e specializzazione
7.6 Il modiicatore abstract
7.6.1 Metodi astratti
7.6.2 Classi astratte
7.7 Interfacce
7.7.1 Deinizione 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 Conlitto tra un metodo astratto e uno concreto
7.7.5.3 Conlitto tra due metodi astratti
7.7.5.4 Conlitto tra metodi rideiniti
7.7.5.5 Class always wins
7.7.6 Differenze tra interfacce e classi astratte
Riepilogo
Capitolo 8 - Polimorismo
8.1 Polimorismo
8.1.1 Convenzione per i reference
8.2 Polimorismo per metodi
8.2.1 Overload
8.2.2 Varargs
8.2.3 Override
8.2.4 Annotazione sull’override
8.3 Polimorismo per dati
8.3.1 Parametri polimori
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 polimorismo
8.3.6 Polimorismo 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: deinizione
10.1.2 Classi innestate: proprietà
10.1.3 Quando usare le classi innestate
10.2 Classi anonime: deinizione
10.2.1 Quando usare le classi innestate
10.3 Tipi Enumerazioni
10.3.1 Ereditarietà e polimorismo 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 speciici 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 relection
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

Citation preview

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