Sobes.tech
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