Differenza tra classe astratta e interfaccia in Java

La differenza tra una classe astratta e un’interfaccia è una delle domande più popolari nei colloqui. Classe astratta e interfaccia sono una parte fondamentale del linguaggio di programmazione Java. La scelta tra l’utilizzo di un’interfaccia o di una classe astratta è una decisione di design che ogni architetto deve affrontare. Nei miei ultimi articoli, ho fornito il maggior numero possibile di dettagli su interfaccia Java e classe astratta. In questo post, impareremo la differenza tra classe astratta e interfaccia e quando dovremmo utilizzare un’interfaccia invece di una classe astratta e viceversa.

Differenza tra classe astratta e interfaccia

  1. La parola chiave abstract viene utilizzata per creare una classe astratta e può essere utilizzata anche con i metodi, mentre la parola chiave interface viene utilizzata per creare un’interfaccia e non può essere utilizzata con i metodi.
  2. Le sottoclassi utilizzano la parola chiave extends per estendere una classe astratta e devono fornire l’implementazione di tutti i metodi dichiarati nella classe astratta, a meno che la sottoclasse sia anch’essa una classe astratta, mentre le sottoclassi utilizzano la parola chiave implements per implementare le interfacce e devono fornire l’implementazione di tutti i metodi dichiarati nell’interfaccia.
  3. Le classi astratte possono avere metodi con implementazione, mentre le interfacce forniscono un’astrazione assoluta e non possono avere alcuna implementazione dei metodi. Tieni presente che a partire da Java 8 possiamo creare metodi predefiniti e statici nelle interfacce che contengono le implementazioni dei metodi.
  4. Le classi astratte possono avere costruttori, ma le interfacce non possono avere costruttori.
  5. Le classi astratte hanno tutte le caratteristiche di una normale classe Java, ad eccezione del fatto che non possono essere istanziate. Possiamo utilizzare la parola chiave abstract per rendere una classe astratta, ma le interfacce sono un tipo completamente diverso e possono contenere solo costanti public static final e dichiarazioni di metodi.
  6. I metodi delle classi astratte possono avere modificatori di accesso come public, private, protected, static, ma i metodi delle interfacce sono implicitamente public e abstract, non possiamo utilizzare altri modificatori di accesso con i metodi delle interfacce.
  7. A subclass can extend only one abstract class but it can implement multiple interfaces.
  8. Le classi astratte possono estendere altre classi e implementare interfacce, ma le interfacce possono solo estendere altre interfacce.
  9. Possiamo eseguire una classe astratta se ha un metodo main(), ma non possiamo eseguire un’interfaccia perché non può avere un’implementazione del metodo main.
  10. Le interfacce vengono utilizzate per definire un contratto per le sottoclassi, mentre le classi astratte definiscono anche un contratto, ma possono fornire altre implementazioni dei metodi per le sottoclassi da utilizzare.

Questo è tutto per la differenza tra un’interfaccia e una classe astratta, ora possiamo passare a capire quando dovremmo usare l’interfaccia al posto della classe astratta e viceversa.

Interfaccia o Classe Astratta

La scelta tra Interfaccia o classe astratta per fornire un contratto alle sottoclassi è una decisione di progettazione e dipende da molti fattori. Vediamo quando le Interfacce sono la scelta migliore e quando possiamo utilizzare classi astratte.

  1. Java non supporta l’ereditarietà multipla a livello di classe, quindi ogni classe può estendere solo una superclasse. Ma una classe può implementare più interfacce. Quindi, nella maggior parte dei casi, le Interfacce sono una buona scelta per fornire la base per la gerarchia delle classi e il contratto. Inoltre, codificare in termini di interfacce è una delle migliori pratiche per programmazione in Java.
  2. Se ci sono molti metodi nel contratto, allora la classe astratta è più utile perché possiamo fornire un’implementazione predefinita per alcuni dei metodi comuni a tutte le sottoclassi. Inoltre, se le sottoclassi non devono implementare un particolare metodo, possono evitare di fornire l’implementazione. Ma nel caso delle interfacce, la sottoclasse dovrà fornire l’implementazione per tutti i metodi, anche se non serve e l’implementazione è solo un blocco vuoto.
  3. Se il nostro contratto di base continua a cambiare, le interfacce possono causare problemi perché non possiamo dichiarare metodi aggiuntivi all’interfaccia senza cambiare tutte le classi di implementazione. Con la classe astratta, possiamo fornire un’implementazione predefinita e cambiare solo le classi di implementazione che utilizzeranno effettivamente i nuovi metodi.

Usare classi astratte e interfacce contemporaneamente

Utilizzare insieme interfacce e classi astratte è l’approccio migliore per progettare un sistema. Ad esempio, in JDK, java.util.List è un’interfaccia che contiene molti metodi, quindi esiste una classe astratta java.util.AbstractList che fornisce un’implementazione scheletrica per tutti i metodi dell’interfaccia List, in modo che ogni sottoclasse possa estendere questa classe e implementare solo i metodi necessari. Dovremmo sempre iniziare con un’interfaccia come base e definire i metodi che ogni sottoclasse dovrebbe implementare. Se ci sono alcuni metodi che solo alcune sottoclassi dovrebbero implementare, possiamo estendere l’interfaccia di base e creare una nuova interfaccia con quei metodi. Le sottoclassi avranno l’opzione di scegliere tra l’interfaccia di base o l’interfaccia figlia da implementare secondo i propri requisiti. Se il numero di metodi cresce molto, non è una cattiva idea fornire una classe astratta scheletrica che implementa l’interfaccia figlia, dando flessibilità alle sottoclassi di scegliere tra interfaccia e classe astratta.

Cambiamenti nell’interfaccia Java 8

Dal Java 8 in poi, è possibile avere implementazioni dei metodi nelle interfacce. Possiamo creare metodi di default e statici nelle interfacce e fornire un’implementazione per essi. Ciò ha colmato il divario tra le classi astratte e le interfacce, e ora le interfacce sono la scelta ideale perché possiamo estenderle ulteriormente fornendo implementazioni predefinite per nuovi metodi. Per ulteriori dettagli, consulta Metodi predefiniti e statici delle interfacce Java 8.

Source:
https://www.digitalocean.com/community/tutorials/difference-between-abstract-class-and-interface-in-java