Index
Related
TLDR
Un’interfaccia specifica un insieme di metodi che una classe deve implementare se vuole implementare quell’interfaccia
Introduzione
In Java, un’interfaccia è un tipo di riferimento che può contenere solo:
- Metodi astratti
- Campi costanti (che sono implicitamente
public
,static
, efinal
Le interfacce vengono utilizzate per definire un contratto che deve essere implementato da una classe concreta. In altre parole, una classe che implementa un’interfaccia deve fornire una implementazione per tutti i metodi definiti nell’interfaccia.
Esempio
Implementazione
Implementare un interfaccia significa creare una classe che implementa i metodi (astratti) contenuti dall’interfaccia
Esempio
In questo esempio, abbiamo definito una classe
Cerchio
che implementa l’interfacciaFormaGeometrica
. La classeCerchio
deve fornire una implementazione per i metodiarea()
eperimetro()
definiti nell’interfaccia.
Metodi Default e Statici
Le interfacce possono anche contenere metodi di default e statici, che possono essere implementati direttamente nell’interfaccia stessa.
Metodi di Default
Definendo metodi con implementazione di default all’interno delle interfacce diamo la libertà a chi implementa l’interfaccia di scegliere se sovrascrivere il metodo di default o utilizzare l’implementazione predefinita.
Metodi Statici
Definendo metodi statici all’interno delle interfacce. Questi metodi possono essere chiamati utilizzando il nome dell’interfaccia seguito dal nome del metodo.
Esempio
Eredità Multipla
Java supporta l’ereditarietà multipla tramite le interfacce. Una classe può implementare più di un’interfaccia, consentendo così di ereditare comportamenti da più fonti.
Tuttavia, Java non supporta direttamente l’ereditarietà multipla per le classi. Ciò significa che una classe in Java può estendere solo una singola classe base. Tuttavia, Java supporta l’ereditarietà multipla indiretta attraverso l’utilizzo di interfacce.
Esempio
Estendibilità
Le interfacce possono estendere altre interfacce, consentendo la creazione di gerarchie di interfacce. Una classe che implementa un’interfaccia estesa deve fornire implementazioni per tutti i metodi definiti nelle interfacce padre.
Esempio
In questo esempio, l’interfaccia
FormaStampabile
estende le interfacceForma
eStampabile
, il che significa che una classe che implementaFormaStampabile
deve fornire implementazioni per i metodi astrattiarea()
estampa()
ereditati daForma
eStampabile
, nonché per il metodo astrattoperimetro()
definito inFormaStampabile
.
Interfacce Funzionali
Le interfacce funzionali sono un tipo speciale di interfacce che hanno un solo metodo astratto, che può essere implementato come una funzione lambda. Queste interfacce sono anche note come interfacce a singolo metodo o SAM (Single Abstract Method) interfaces.
Le interfacce funzionali sono state introdotte per semplificare l’uso delle funzioni lambda in Java, che sono blocchi di codice anonimi che possono essere passati come argomenti a metodi o assegnati a variabili. Le funzioni lambda possono essere utilizzate per creare oggetti che implementano interfacce funzionali, il che può semplificare il codice e renderlo più conciso ed espressivo.
Esempio
In questo esempio, l’interfaccia
Calcolatrice
è una interfaccia funzionale che definisce un metodo astrattocalcola()
che prende due argomenti interi e restituisce un intero. Nella classeMain
, creiamo due oggettiCalcolatrice
che implementano il metodocalcola()
come funzioni lambda. Questo ci permette di creare oggettiCalcolatrice
in modo conciso e di utilizzarli per eseguire calcoli semplici.