parola chiave interface. Le interfacce permettono di modellare comportamenti comuni a classi (anche se non sono in relazione gerarchica in Java non è consentito estendere più di una classe, ma una classe può implementare tutte le interfacce desiderate).

  • definiscono e standardizzano l’interazione fra oggetti tramite un insieme di operazioni limitato.
  • specificano solo il comportamento che un oggetto deve presentare all’esterno (quello che l’oggetto può fare) - l’implementazione di tale operazioni non viene definita.
  • sono classi astratte se non definiamo metodi di default.
metodi e interfacce
  • è possibile specificare delle implementazioni di default di metodi non statici mediante la parola default.
  • è anche possibile implementare metodi statici (che non godono di polimorfismo).
  • da java 9 in poi, è possibile definire metodi privati all’interno di un’interfaccia (che possono essere chiamati solo dai metodi dell’interfaccia stessa).

Un’interfaccia è quindi una classe che può contenere soltanto:

  • costanti
  • metodi astratti
  • (java 8): implementazione di default di metodi e metodi statici
  • (java 9): metodi privati tipicamente da invocare in metodi di default

visibilità di default

  • tutti i metodi dichiarati in un’interfaccia sono implicitamente public abstract.
  • tutti i campi dichiarati in un’interfaccia sono implicitamente public static final.

attenzione

Tranne nel caso dei metodi di default o statici, non è possibile specificare alcun dettaglio implementativo dei metodi.


dichiarazione di un’interfaccia


implementazione

Per realizzare un’interfaccia, è necessario che una classe la implementi tramite la parola chiave implements.

  • una classe che implementa un’interfaccia espone pubblicamente il comportamento descritto dall’interfaccia.
  • è obbligatorio che ogni metodo abbia la stessa intestazione che presenta nell’interfaccia.

Per una classe che implementa un’interfaccia, ci sono 3 possibilità:

  1. fornire un’implementazione concreta di tutti i metodi
  2. fornire un’implementazione concreta di parte dei metodi
  3. non fornire implementazioni concrete

attenzione

negli ultimi due casi, la classe andrà dichiarata abstract


relazione interfacce-classi

Quando una classe C implementa un’interfaccia I, tra queste due classi c’è una relazione di tipo is-a (la classe C è di tipo I).

  • anche per le interfacce valgono le regole del polimorfismo:
    • si possono usare oggetti di sottoclassi come fossero del tipo dell’interfaccia: Interfaccia oggetto = new Sottoclasse()

doppia implementazione e metodi di default

Quando ho una classe che sta implementando due classi con già definiti due metodi di default, quando chiamo questo metodo sulla classe che sto definendo quale metodo viene chiamato? Chiamo quello giusto con la sintassi Interfaccia.super.metodo();


interfacce ed ereditarietà

Le interfacce possono ereditare più interfacce, rendendo quindi possibile l’ereditarietà multipla in Java. Quando un’interfaccia eredita più interfacce, fa una specie di “merge” tra di esse.


interfacce funzionali (o SAM)

a partire da Java8, è disponibile la nuova annotazione @FunctionalInterface, che garantisce che l’interfaccia sia dotata di un solo metodo astratto (può avere vari metodi di altri tipi)

  • le interfacce funzionali si chiamano anche Single Abstract Method

le interfacce funzionali implementano spesso lambda functions.