Premessa

Portale di appartenenza: Programmazione orientata agli oggetti.

Cosa troverai in questa nota:

Prerequisiti: per comprendere pienamente il contenuto di questa nota, oltre le conoscenze minime che do per scontato che tu sappia giΓ , ti consiglio di aver letto in precedenza queste altre note:

Buona lettura! β˜οΈπŸ€“

In Java, il concetto di classe della programmazione orientata agli oggetti Γ¨ fondamentale, infatti ogni frammento di codice viene racchiuso all’interno di una classe.

1 - Definizione e istanziazione di una classe

Sintassi: definizione di una classe in Java

In Java, la sintassi per definire una classe Γ¨ la seguente:

[Β«visibilitΓ Β»] class Β«NomeClasseΒ» {
    Β«contenuto della classeΒ»
}

dove:

Sintassi: definizione dei campi di una classe in Java

In Java, la sintassi per definire i campi di una classe Γ¨ la seguente:

[Β«visibilitΓ Β»] [Β«modificatoriΒ»] Β«tipoΒ» Β«nomeCampoΒ» [= Β«valore_inizialeΒ»]

dove:

  • [Β«visibilitΓ Β»] (opzionale): visibilitΓ  del campo. PuΓ² assumere uno dei seguenti valori:
  • [Β«modificatoriΒ»] (opzionale): modificatori del campo. PuΓ² assumere uno o piΓΉ dei seguenti valori:
    • static: rende il campo statico (di default Γ¨ dinamico).
    • final: rende il campo costante e gli si puΓ² assegnare un valore una sola volta.
    • transient: esclude il campo dalla serializzazione.
    • volatile: garantisce la visibilitΓ  dei cambiamenti tra thread.
  • Β«tipoΒ»: tipo del campo.
  • Β«nomeCampoΒ»: nome del campo, convenzionalmente scritto in lowerCamelCase.
  • [= Β«valore_inizialeΒ»] (opzionale): valore iniziale assegnato al campo quando viene creata l’istanza.

Osservazione: differenza tra le struct di C e le classi di Java

Per certi versi, le struct di C possono sembrare molto simili alle classi in Java: entrambi rappresentano una collezione di variabili (che nel caso delle classi sono rappresentate dai campi), anche di tipo eterogeneo, ed entrambi possono essere usati come tipi di variabili.

Tuttavia, ci sono alcune importanti differenze tra questi due concetti:

  • Le classi possono contenere al loro interno anche dei metodi, mentre le struct possono contenere solo variabili.
  • Le struct sono sempre accessibili da qualsiasi punto del programma, mentre le classi possono avere una determinata visibilitΓ  che le puΓ² nascondere ad alcuni pezzi del programma.

Sintassi: istanziazione di una classe in Java

In Java, la sintassi per istanziare una classe Γ¨ la seguente:

Β«NomeClasseΒ» Β«nome_istanzaΒ» = new Β«NomeClasseΒ»([Β«argomentiΒ»]);

dove:

  • Β«NomeClasseΒ»: nome della classe di cui vogliamo creare un’istanza.
  • Β«nome_istanzaΒ»: nome della variabile che conterrΓ  l’istanza della classe.
  • [Β«argomentiΒ»] (opzionale): argomenti da passare al costruttore.

1.1 - Valori dei campi

Sintassi: riferimento a un campo di una classe in Java

In Java, la sintassi per riferirsi a un campo di una classe Γ¨ la seguente:

Β«nome_istanzaΒ».Β«nome_campoΒ»

dove:

  • Β«nome_istanzaΒ»: nome della variabile che contiene l’istanza della classe. Se ci si vuole riferire a un campo all’interno della stessa classe in cui Γ¨ definito, allora si usa la parola chiave this.
  • Β«nome_campoΒ»: nome del campo della classe a cui ci si vuole riferire.

Questi campi possono essere considerati come delle variabili a tutti gli effetti, alle quali Γ¨ ovviamente possibile anche assegnare valori con la seguente sintassi:

Β«nome_istanzaΒ».Β«nome_campoΒ» = Β«valoreΒ»

1.2 - La parola chiave this

Definizione: parola chiave this

In Java, this Γ¨ una parola chiave riservata che rappresenta un riferimento implicito all’oggetto corrente, cioΓ¨ all’istanza della classe all’interno della quale Γ¨ in esecuzione il codice, ed Γ¨ usato per accedere ai suoi campi e metodi.

2 - Metodi delle classi

Sintassi: definizione di un metodo in Java

In Java, la sintassi per definire un metodo Γ¨ la seguente:

[Β«visibilitΓ Β»] [Β«modificatoriΒ»] Β«tipoRestituitoΒ» Β«nomeMetodoΒ»(Β«parametriΒ») {
    Β«corpo del metodoΒ»
}

dove:

  • [Β«visibilitΓ Β»] (opzionale): visibilitΓ  del metodo. PuΓ² assumere uno dei seguenti valori:
  • [Β«modificatoriΒ»] (opzionale): modificatori del metodo. PuΓ² assumere uno o piΓΉ dei seguenti valori:
    • abstract: rende il metodo astratto. È incompatibile con metodi statici, finali o con visibilitΓ  privata.
    • static: rende il metodo statico (di default Γ¨ dinamico). È incompatibile con metodi astratti.
    • final: impedisce al metodo di essere sovrascritto da sottoclassi. È incompatibile con metodi astratti.
    • synchronized: permette l’esecuzione del metodo su un solo thread alla volta negli ambienti multithread.
    • native: permette l’implementazione del metodo usando codice nativo come C o C++.
    • strictfp: forza il rispetto degli standard IEEE 754 per i calcoli con la virgola mobile, assicurando la coerenza dei risultati su diverse piattaforme.
  • Β«tipoRestituitoΒ»: tipo del valore restituito dal metodo.
  • Β«nomeMetodoΒ»: nome del metodo, convenzionalmente in lowerCamelCase.
  • Β«parametriΒ»: elenco (eventualmente vuoto) dei parametri formali, ciascuno specificato come tipo nome.
  • Β«corpo del metodoΒ»: corpo del metodo. Se il metodo Γ¨ astratto, il corpo Γ¨ assente e la definizione termina con ;.

2.1 - Il metodo main e l’eseguibilitΓ  delle classi

Definizione: metodo main

In Java, il main Γ¨ un metodo di una classe che rappresenta il punto d’ingresso per l’esecuzione di un programma Java.

Il metodo main in Java Γ¨ molto simile alla funzione main in C: una classe Γ¨ eseguibile solo se contiene un metodo main, altrimenti puΓ² solo essere utilizzata come libreria da altre classi.

Il metodo main accetta un solo parametro: un array di elementi di tipo String (convenzionalmente scritto come String[] args).

2.2 - Metodi getter e setter

Proprio in virtΓΉ del concetto di incapsulamento, spesso Γ¨ bene rendere privati i campi di una classe per proteggerli da eventuali accessi esterni indesiderati: per questo, se si vuole offrire un accesso β€œcontrollato” a questi campi privati, bisogna che la classe fornisca dei metodi appositi per accedervi: i metodi getter e setter.

Definizione: metodi getter e setter

In Java, i getter e setter sono metodi pubblici usati rispettivamente per accedere e per modificare i campi privati di una classe.

2.3 - Overloading di metodi

In Java Γ¨ possibile definire piΓΉ versioni dello stesso metodo attraverso l’overloading.

Definizione: overloading

In Java, l’overloading Γ¨ il meccanismo tramite cui Γ¨ possibile definire piΓΉ versioni dello stesso metodo variando la sua firma, per esempio modificando il numero e il tipo dei parametri o la sua visibilitΓ . Le versioni multiple possono essere definite tutte all’interno della stessa classe o anche in sottoclassi derivate.

3 - Costruttori

Le classi, oltre agli attributi (che in Java vengono chiamati campi per sottolineare la loro implementazione a livello di codice) e metodi, possono avere anche dei costruttori, che sono delle procedure speciali che restituiscono come risultato un’istanza della classe.

Definizione: costruttore

In Java, un costruttore Γ¨ una porzione di codice speciale che viene eseguita quando si crea un’istanza di una classe, ed Γ¨ usata per inizializzare l’oggetto. Presenta le seguenti caratteristiche:

  • Ha lo stesso nome della classe.
  • Non ha tipo di ritorno, nemmeno il tipo void.
  • PuΓ² essere sovraccaricato, cioΓ¨ si possono definire piΓΉ costruttori con parametri diversi.
  • Se non si definisce esplicitamente alcun costruttore, Java fornisce un costruttore di default (senza parametri).

Osservazione: un costruttore non Γ¨ un metodo

Sebbene comunemente venga confuso con un metodo, un costruttore non Γ¨ un metodo, e trattarlo come tale puΓ² portare a errori concettuali. In particolare, non puΓ² essere ereditato da altri oggetti e non puΓ² essere chiamato direttamente come un metodo, ma Γ¨ strettamente vincolato alla creazione dell’oggetto.

Attenzione: costruttori espliciti sovrascrivono automaticamente quello di default

Se definiamo dei costruttori espliciti, anche con zero parametri, il costruttore di default non Γ¨ piΓΉ accessibile perchΓ© sarΓ  stato automaticamente sovrascritto.

Per esempio, nel seguente codice, l’invocazione alla riga 15 fallisce perchΓ© il costruttore di default non Γ¨ piΓΉ disponibile avendone dichiarato uno noi esplicitamente:

Persona.java
class Persona {
    String nome;
    int eta;
 
    // Costruttore
    public Persona(String nome, int eta) {
        this.nome = nome;
        this.eta = eta;
    }
 
	public static void main(String[] args) {
		Persona p = new Persona("Mario", 30);  // Invocazione del nostro costruttore
		System.out.println("Nome: " + p.nome);
		System.out.println("EtΓ : " + p.eta);
        Persona q = new Persona();  // Invocazione del costruttore di default
	}
}
 

4 - Package e modificatori

PoichΓ© un software scritto nel linguaggio Java puΓ² essere composto da centinaia o migliaia di file, ha senso mantenere tutto organizzato collocando le classi e le interfacce correlate all’interno di package.

Definizione: package

In Java, un package Γ¨ un nome di spazio che identifica un insieme coerente di classi e interfacce, organizzandole in modo ordinato per migliorarne la modularitΓ , la leggibilitΓ , e per evitare conflitti di nomi.

Concettualmente, puoi pensare ai package come a cartelle diverse sul tuo computer.

4.1 - VisibilitΓ  delle classi

Ogni file puΓ² contenere una o piΓΉ classi, ognuna delle quali ha una propria visibilitΓ .

Definizione: visibilitΓ  di una classe

In Java, la visibilitΓ  di una classe indica la proprietΓ  di una classe di poter essere visibile da determinate altre classi. PuΓ² essere di due tipi:

  • Privata: la classe Γ¨ visibile solo alle classi all’interno dello stesso package in cui Γ¨ stata definita.
  • Pubblica: la classe Γ¨ visibile anche alle classi all’esterno del package in cui Γ¨ stata definita, previo l’utilizzo di istruzioni di import, o assegnazione delle variabili d’ambiente, o di opportuni parametri dati al compilatore.

4.2 - VisibilitΓ  dei campi

Definizione: visibilitΓ  di un campo

In Java, la visibilitΓ  di un campo indica la proprietΓ  di un campo di poter essere visibile da determinate altre classi. PuΓ² essere di quattro tipi:

  • Default (anche detta package): il campo Γ¨ visibile solo a classi dello stesso package in cui Γ¨ stato definito.
  • Privata: il campo Γ¨ visibile solo all’interno della stessa classe in cui Γ¨ stato definito.
  • Protetta: il campo Γ¨ visibile solo a classi dello stesso package in cui Γ¨ stato definito e anche a sottoclassi in altri package.
  • Pubblica: il campo Γ¨ visibile anche alle classi all’esterno del package in cui Γ¨ stato definito.

4.3 - VisibilitΓ  dei metodi

Definizione: visibilitΓ  di un metodo

In Java, la visibilitΓ  di un metodo indica la proprietΓ  di un metodo di poter essere visibile da determinate altre classi. PuΓ² essere di quattro tipi:

  • Default (anche detta package): il metodo Γ¨ visibile solo a classi dello stesso package in cui Γ¨ stato definito.
  • Privata: il metodo Γ¨ visibile solo all’interno della stessa classe in cui Γ¨ stato definito.
  • Protetta: il metodo Γ¨ visibile solo a classi dello stesso package in cui Γ¨ stato definito e anche a sottoclassi in altri package.
  • Pubblica: il metodo Γ¨ visibile anche alle classi all’esterno del package in cui Γ¨ stato definito.

4.4 - VisibilitΓ  dei costruttori

Definizione: visibilitΓ  di un costruttore

In Java, la visibilitΓ  di un costruttore indica la proprietΓ  di un costruttore di poter essere visibile da determinate altre classi. PuΓ² essere di quattro tipi:

  • Default (anche detta package): il costruttore Γ¨ visibile solo a classi dello stesso package in cui Γ¨ stato definito.
  • Privata: il costruttore Γ¨ visibile solo all’interno della stessa classe in cui Γ¨ stato definito.
  • Protetta: il costruttore Γ¨ visibile solo a classi dello stesso package in cui Γ¨ stato definito e anche a sottoclassi in altri package.
  • Pubblica: il costruttore Γ¨ visibile anche alle classi all’esterno del package in cui Γ¨ stato definito.

4.5 - StaticitΓ  e dinamicitΓ  di campi e metodi

Definizione: campi e metodi statici di una classe

In Java, un campo o un metodo di una classe Γ¨ statico quando appartiene alla classe stessa anzichΓ© alle singole istanze. CiΓ² implica che:

  • In memoria esiste una sola copia condivisa di quel campo o metodo.
  • Ci si puΓ² accedere direttamente tramite il nome della classe, quindi non serve istanziare un oggetto della classe.

Definizione: campi e metodi dinamici di una classe

In Java, un campo o un metodo di una classe Γ¨ dinamico (o di istanza) quando appartiene alle singole istanze. CiΓ² implica che:

  • In memoria esiste una copia per ogni istanza di quel campo o metodo.
  • Ci si puΓ² accedere tramite il nome dell’istanza, quindi Γ¨ necessario istanziare un oggetto della classe.

5 - EreditarietΓ 

In Java Γ¨ possibile implementare il principio dell’ereditarietΓ , per il quale una classe puΓ² ereditare metodi e campi da un’altra classe.

Sintassi: definizione di una sottoclasse in Java

In Java, la sintassi per definire una sottoclasse Γ¨ la seguente:

[Β«visibilitΓ Β»] class Β«NomeClasseΒ» extends Β«NomeSuperclasseΒ» {
    Β«contenuto della classeΒ»
}

dove:

All’interno del costruttore della sottoclasse, la prima istruzione a dover essere eseguita dev’essere l’istruzione super(Β«parametriΒ»), dove i Β«parametriΒ» sono i parametri del costruttore della superclasse che si vuole usare.

Osservazione: perchΓ© Γ¨ obbligatorio invocare il costruttore della superclasse

L’obbligatorietΓ  di invocare e eseguire un costruttore della superclasse Γ¨ data dal fatto che la responsabilitΓ  di inizializzare i campi della superclasse Γ¨ della superclasse stessa.

E se non invochiamo il costruttore della superclasse?

Attenzione: usare sempre super quando ci sono costruttori espliciti nella superclasse

Se il costruttore della sottoclasse non richiama esplicitamente un costruttore della superclasse tramite la funzione super, viene chiamato automaticamente il costruttore predefinito della classe superiore, quello senza parametri. Tuttavia,Β se la classe superiore ha costruttori espliciti ma non ha un costruttore senza parametri, il compilatore genera un errore, perchΓ© il costruttore di default sarΓ  stato sovrascritto automaticamente da quelli espliciti.

5.1 - La parola chiave super

Similmente a quanto avviene per la parola chiave this, la parola chiave super puΓ² essere usata per invocare metodi della superclasse.

Definizione: parola chiave super

In Java, super Γ¨ una parola chiave riservata che rappresenta un riferimento implicito alla superclasse della classe in cui viene usata.

Questo puΓ² essere utile nel caso in cui una sottoclasse sovrascrive un metodo della superclasse, ma quest’ultimo rimane accessibile tramite la parola chiave super.

5.2 - Overriding di metodi

In Java Γ¨ possibile definire sovrascrivere un metodo con una sua versione modificata nelle sottoclassi attraverso l’overriding.

Definizione: overriding

In Java, l’overriding Γ¨ il meccanismo tramite cui Γ¨ possibile sovrascrivere un metodo in sottoclassi derivate modificando il suo corpo.

Attenzione: non confondere overriding e overloading!

Fai attenzione a non confondere l’overriding con l’overloading! Mentre con l’overriding il metodo nella superclasse viene completamente sostituito da quello nella sottoclasse che ha la stessa firma ma corpo diverso, nell’overloading lo stesso metodo ha molteplici versioni ognuna delle quali con una firma e un corpo diversi.

6 - La classe Object

Definizione: classe Object

In Java, Object Γ¨ la superclasse di tutte le classi: ogni classe in Java deriva implicitamente da Object.

Si trova nella libreria java.lang, per questo non va importata.

La classe Object contiene al suo interno alcuni metodi che vengono automaticamente ereditati da tutte le classi in Java.

6.1 - Il metodo toString

Definizione: metodo toString

In Java, toString Γ¨ un metodo pubblico dinamico che appartiene alla classe Object, ha tipo di ritorno String e nessun parametro. Restituisce una rappresentazione testuale dell’oggetto su cui viene chiamato, stampando l’indirizzo in memoria (in esadecimale) dell’oggetto:

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Osservazione: sovrascrittura del metodo toString

Come ogni altro metodo ereditato da una superclasse, anche il metodo toString puΓ² venire sovrascritto per costruire una stringa diversa, per esempio per fare il β€œpretty printing” dei valori dei campi degli oggetti.

6.2 - Il metodo equals e l’uguaglianza tra oggetti

Definizione: metodo equals

In Java, equals Γ¨ un metodo pubblico dinamico che appartiene alla classe Object, ha tipo di ritorno boolean e come parametro un oggetto obj di tipo Object. Restituisce true se l’oggetto puntato dalla parola chiave this e quello puntato da obj corrispondono allo stesso indirizzo, false altrimenti:

public boolean equals(Object obj) {
    return (this == obj);
}

7 - Classi astratte

Definizione: classe astratta

In Java, una classe astratta è una classe senza costruttori (e quindi non istanziabile) e può contenere, oltre a metodi concreti (cioè con un corpo), anche metodi astratti. Il suo scopo principale è fornire una struttura comune a tutte le sue sottoclassi.

Sintassi: definizione di una classe astratta in Java

In Java, la sintassi per definire una classe astratta Γ¨ la seguente:

[Β«visibilitΓ Β»] abstract class Β«NomeClasseΒ» {
    Β«contenuto della classeΒ»
}

dove:

Definizione: metodo astratto

In Java, un metodo astratto Γ¨ un metodo dichiarato in una classe astratta con la parola chiave abstract e con il corpo vuoto. Esso rappresenta un comportamento che le sottoclassi non astratte sono obbligate a definire sovrascrivendolo.

Per vedere come definire un metodo astratto, vedi la sintassi per definire un metodo in generale.

8 - Interfacce

Definizione: interfaccia

In Java, un’interfaccia Γ¨ una collezione di variabili e di metodi astratti, statici o default, con visibilitΓ  pubblica o privata che possono essere implementati da una o piΓΉ classi. Serve a definire un comportamento comune, senza imporre una struttura gerarchica rigida come nelle classi astratte.

Osservazione: differenze tra interfacce e classi astratte

È bene non confondere l’uso di interfacce e classi astratte:

9 - Classi generiche

PuΓ² capitare, in Java, che esistano copie di alcuni metodi che si comportano allo stesso modo ma operano su diversi tipi di attributi. Per esempio, un metodo sort() che ordina un array di elementi potrebbe avere due versioni:

  • Una versione che ordina gli array di stringhe in ordine alfabetico.
  • Una versione che ordina gli array di interi in ordine crescente.

È facilmente intuibile come ci sia bisogno di due versioni diverse perchΓ© due stringhe non possono essere comparate nello stesso modo di due interi: per gli interi serve l’operatore >, per le stringhe va invocato un metodo che confronti le due stringhe lettera per lettera.

PoichΓ© la programmazione orientata agli oggetti ha come obiettivo il riuso del codice e la riduzione della scrittura di codice (ove possibile), Java ha introdotto il concetto di classi generiche.

Definizione: classe generica

Una classe Γ¨ detta generica (o parametrica) se contiene nella sua definizione variabili di tipo, ossia delle variabili che non contengono al loro interno dei valori ma che sono dei placeholder per tipi di dato derivati.

Vediamo la sintassi per definire una classe generica.

Sintassi: definizione di una classe generica in Java

In Java, la sintassi per definire una classe generica Γ¨ la seguente:

[Β«visibilitΓ Β»] class Β«NomeClasseΒ»<Β«variabili di tipoΒ»> {
    Β«contenuto della classeΒ»
}

dove:

  • [Β«visibilitΓ Β»] (opzionale): visibilitΓ  della classe. PuΓ² assumere due valori:
  • Β«NomeClasseΒ»: nome della classe, convenzionalmente scritto in UpperCamelCase.
  • Β«variabili di tipoΒ»: nomi delle variabili che verranno usati come placeholder per i tipi generici.
  • Β«contenuto della classeΒ»: campi e metodi della classe, possono usare le variabili di tipo specificate in Β«variabili di tipoΒ» come placeholder per i tipi di campi e variabili.

Vediamo la sintassi per istanziare una classe generica.

Sintassi: istanziazione di una classe generica in Java

In Java, la sintassi per istanziare una classe generica Γ¨ la seguente:

Β«NomeClasseΒ»<Β«variabili di tipoΒ»> Β«nome_istanzaΒ» = new Β«NomeClasseΒ»<Β«variabili di tipoΒ»>([Β«argomentiΒ»]);

dove:

  • Β«NomeClasseΒ»: nome della classe di cui vogliamo creare un’istanza.
  • Β«variabili di tipoΒ»: nomi delle variabili che verranno usati come placeholder per i tipi generici.
  • Β«nome_istanzaΒ»: nome della variabile che conterrΓ  l’istanza della classe.
  • [Β«argomentiΒ»] (opzionale): argomenti da passare al costruttore.

Vediamo un esempio di definizione e istanziazione di una classe generica.

È possibile evitare di definire esplicitamente le variabili di tipo nell’istanziazione usando la diamond notation.

Sintassi: istanziazione di una classe generica in Java con la diamond notation

In Java, nell’istanziazione di una classe generica, Γ¨ possibile evitare di definire esplicitamente le variabili di tipo non inserendo nulla all’interno delle parentesi angolate <> (che sembra appunto il simbolo di un diamante, da cui il nome della notazione):

Β«NomeClasseΒ»<> Β«nome_istanzaΒ» = new Β«NomeClasseΒ»<>([Β«argomentiΒ»]);

dove:

  • Β«NomeClasseΒ»: nome della classe di cui vogliamo creare un’istanza.
  • Β«nome_istanzaΒ»: nome della variabile che conterrΓ  l’istanza della classe.
  • [Β«argomentiΒ»] (opzionale): argomenti da passare al costruttore.

In questo modo, il compilatore capirΓ  in automatico dagli argomenti passati al costruttore quali sono le variabili di tipo.

9.1 - Classi generiche raw type

Java permette l’uso di classi generiche senza specificare esplicitamente le loro variabili di tipo, tramite la sintassi della diamond notation, ma omettendo le parentesi angolate <> queste diventano dei raw type.

Definizione: classe generica raw type

Una classe generica Γ¨ detta raw type se, nella sua istanziazione, non vengono specificate le sue variabili di tipo, nemmeno implicitamente attraverso l’uso della diamond notation.

In pratica, si utilizza la classe come se non fosse generica, il che disattiva parte della sicurezza offerta da questo tipo di classi. Vediamo un esempio.

Attenzione: evitare l'uso dei raw type

I raw type esistono per motivi compatibilità con codice precedente a Java 5, cioè prima che le classi generiche venissero introdotte. Non dovrebbero essere usati nel codice moderno a meno che non sia assolutamente necessario (es. interazione con librerie legacy).

9.2 - Classi wrapper

Una difficoltΓ  nell’uso delle classi generiche Γ¨ che Java considera una classe come un insieme di indirizzi di dati: in base a questa definizione, i tipi primitivi (come int, bool, double, ecc.) non sono classi e non possono quindi essere sostituiti alle variabili di tipo.

Per ovviare a questo problema, Java ci fornisce le classi wrapper.

Definizione: classe wrapper

Un wrapper Γ¨ una classe composta da un indirizzo che punta a un oggetto contenente un dato di tipo primitivo.

Le classi wrapper in Java sono:

  • Integer per il tipo int.
  • Boolean per il tipo boolean.
  • Double per il tipo double.

I processi che permettono di passare da un tipo primitivo alla sua classe wrapper sono detti autoboxing e unboxing.

Definizione: autoboxing e unboxing

L’autoboxing Γ¨ il processo automatico mediante cui Java converte un tipo primitivo nel corrispondente tipo wrapper della libreria standard.

Il processo inverso, da wrapper a tipo primitivo, Γ¨ l’unboxing.

Osservazione: interscambiabilitΓ  di tipi primitivi e wrapper

Nella maggior parte dei casi, possiamo scrivere un wrapper al posto del suo corrispondente tipo primitivo e viceversa senza problemi poichΓ©, se necessario, la JVM li trasforma automaticamente attraverso l’autoboxing e unboxing.

9.3 - Classi generiche vincolate

È possibile β€œvincolare” il tipo che puΓ² assumere una variabile di tipo solamente a classi che implementano una determinata interfaccia.

Definizione: classe generica vincolata

Una classe generica Γ¨ detta vincolata se le sue variabili di tipo devono essere classi che implementano necessariamente un’interfaccia.

Fonti