Interfacce: Definire Comportamenti
🎯 Obiettivi della lezione
- Comprendere cosa sono le interfacce
- Differenze tra interfacce e classi astratte
- Implementare interfacce multiple
- Usare interfacce per il polimorfismo
- Interfacce comuni di Java
💡 Cos'è un'Interfaccia?
Un'interfaccia è un contratto che definisce COSA deve fare una classe, ma non COME.
Contiene solo dichiarazioni di metodi (senza implementazione) e costanti.
Una classe può implementare multiple interfacce!
📝 Sintassi
// Dichiarazione interfaccia
public interface Volabile {
// Tutti i metodi sono public abstract (implicito)
void vola();
void atterra();
// Costanti (public static final implicito)
int ALTITUDINE_MASSIMA = 10000;
}
// Implementare l'interfaccia
public class Aereo implements Volabile {
private String modello;
private boolean inVolo;
public Aereo(String modello) {
this.modello = modello;
this.inVolo = false;
}
// DEVI implementare TUTTI i metodi dell'interfaccia
@Override
public void vola() {
inVolo = true;
System.out.println(modello + " sta volando!");
}
@Override
public void atterra() {
inVolo = false;
System.out.println(modello + " è atterrato.");
}
}
// Altra classe che implementa la stessa interfaccia
public class Uccello implements Volabile {
private String specie;
public Uccello(String specie) {
this.specie = specie;
}
@Override
public void vola() {
System.out.println("L'uccello " + specie + " vola con le ali! 🦅");
}
@Override
public void atterra() {
System.out.println("L'uccello " + specie + " si è posato.");
}
public void canta() {
System.out.println("Cip cip! 🎵");
}
}
🧪 Test Interfacce
public class TestVolabili {
public static void main(String[] args) {
// Array polimorfico di Volabile
Volabile[] oggetti = new Volabile[3];
oggetti[0] = new Aereo("Boeing 747");
oggetti[1] = new Uccello("Aquila");
oggetti[2] = new Aereo("Airbus A380");
// Faccio volare tutti gli oggetti
System.out.println("=== Decollo ===");
for (Volabile v : oggetti) {
v.vola();
}
System.out.println("\n=== Atterraggio ===");
for (Volabile v : oggetti) {
v.atterra();
}
System.out.println("\nAltitudine massima: " + Volabile.ALTITUDINE_MASSIMA + " m");
}
}
=== Decollo ===
Boeing 747 sta volando!
L'uccello Aquila vola con le ali! 🦅
Airbus A380 sta volando!
=== Atterraggio ===
Boeing 747 è atterrato.
L'uccello Aquila si è posato.
Airbus A380 è atterrato.
Altitudine massima: 10000 m
🔄 Interfacce Multiple
Una classe può implementare più interfacce (impossibile con ereditarietà multipla!):
// Interfaccia 1
public interface Nuotabile {
void nuota();
}
// Interfaccia 2
public interface Volabile {
void vola();
}
// Classe che implementa ENTRAMBE
public class Anatra implements Volabile, Nuotabile {
private String nome;
public Anatra(String nome) {
this.nome = nome;
}
@Override
public void vola() {
System.out.println(nome + " vola!");
}
@Override
public void nuota() {
System.out.println(nome + " nuota! 🦆");
}
public void faiQuack() {
System.out.println("Quack quack!");
}
}
// Test
Anatra paperino = new Anatra("Paperino");
paperino.vola();
paperino.nuota();
paperino.faiQuack();
🆚 Interfacce vs Classi Astratte
| Caratteristica | Interfaccia | Classe Astratta |
|---|---|---|
| Metodi | Solo abstract (Java 7) Può avere default (Java 8+) |
Abstract E concreti |
| Attributi | Solo costanti (final) | Qualsiasi attributo |
| Costruttori | ❌ No | ✅ Sì |
| Implementazione multipla | ✅ Sì | ❌ No (solo singola) |
| Quando usare | Definire comportamenti | Condividere codice |
| Parola chiave | implements | extends |
📚 Interfacce Comuni di Java
Comparable - Confrontare oggetti
public class Studente implements Comparable {
private String nome;
private double media;
// ...
@Override
public int compareTo(Studente altro) {
// Confronta per media
if (this.media > altro.media) return 1;
if (this.media < altro.media) return -1;
return 0;
}
}
// Ora puoi ordinare!
ArrayList studenti = new ArrayList<>();
// ... aggiungi studenti
Collections.sort(studenti); // Ordina automaticamente!
✏️ Esercizi Guidati
Esercizio 1: Sistema di Pagamento
MEDIORequisiti:
- Interfaccia Pagabile con metodo paga(double importo)
- Classi: CartaCredito, PayPal, Contanti
- Ogni classe implementa il pagamento in modo diverso
- Test con array di Pagabile
Esercizio 2: Forme e Colori
MEDIORequisiti:
- Interfaccia Disegnabile con metodo disegna()
- Interfaccia Colorabile con metodo colora(String colore)
- Classe Cerchio che implementa entrambe
💪 Esercizi da Svolgere
Esercizio 3: Media Player
FACILEInterfaccia Riproducibile (play, stop, pause):
- Classi: Video, Audio, Streaming
Esercizio 4: Sistema Notifiche
MEDIOInterfaccia Notificabile (invia, ricevi):
- Email, SMS, Push
🎯 Concetti Chiave
- Interfaccia = contratto di comportamento
- Usa implements
- Tutti i metodi sono public abstract
- Multiple interfacce: implements A, B, C
- Perfette per definire capacità (Volabile, Nuotabile, etc.)