Middle
Quando si dovrebbe usare un'interfaccia e quando una classe astratta?
sobes.tech AI
Risposta dell'AI
Utilizziamo una classe astratta per creare funzionalità di base e uno stato generale che possono essere ereditati dalle sottoclassi. È adatta quando ci sono metodi comuni con implementazione e metodi che devono essere sovrascritti. La classe astratta può avere campi e costruttori.
// Classe astratta
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
abstract void makeSound(); // Metodo astratto
void eat() { // Metodo con implementazione
System.out.println(name + " sta mangiando.");
}
}
Usiamo un'interfaccia per definire un contratto che descrive un insieme di metodi che devono essere implementati dalle classi. È adatta per raggiungere comportamenti multipli (ereditarietà multipla di funzionalità). L'interfaccia non può avere stato (campi di istanza, tranne costanti) né costruttori (prima di Java 8).
// Interfaccia
interface Flyable {
void fly(); // Metodo astratto
}
Tabella comparativa delle differenze:
| Caratteristica | Classe astratta | Interfaccia |
|---|---|---|
| Tipo di membri | Campi, metodi astratti e concreti, costruttori | Costanti, metodi astratti (di default), metodi statici e default (da Java 8) |
| Implementazione dei metodi | Può avere metodi con implementazione | Solo metodi astratti fino a Java 8, con Java 8 - static e default |
| Stato | Può avere stato (campi) | Non può avere stato (campi di istanza) |
| Eredità | Eredità singola | Implementazione multipla |
| Uso | "è un" (is-a) - tipo di base | "ha" (has-a) - contratto di comportamento |