Differenza tra classe astratta e interfaccia in Java

Differenza chiave tra classe astratta e interfaccia in Java

  • In Interface, una classe può implementare più interfacce, mentre la classe può ereditare solo una classe astratta.
  • Nell'interfaccia non sono presenti modificatori di accesso. Si presuppone che tutto ciò che è definito all'interno dell'interfaccia abbia un modificatore pubblico, mentre la classe astratta può avere un modificatore di accesso.
  • L'interfaccia non può contenere campi dati, mentre la classe astratta può avere campi dati.
  • Le interfacce aiutano a definire le capacità periferiche di una classe, mentre una classe astratta definisce l'identità di una classe.

Interfaccia vs Classe astratta in Java

Che cosa è una classe astratta?

Una classe che ha la parola chiave abstract nella sua dichiarazione è chiamata classe astratta. Le classi astratte dovrebbero avere zero o più metodi astratti, ovvero metodi senza un corpo. Può avere più metodi concreti. Le classi astratte consentono di creare progetti per classi concrete. Ma la classe ereditaria dovrebbe implementare il metodo astratto. Le classi astratte non possono essere istanziate.

Motivi importanti per l'utilizzo delle interfacce

  • Le interfacce sono utilizzate per raggiungere astrazione.
  • Progettato per supportare la risoluzione dinamica del metodo in fase di esecuzione
  • Ti aiuta a ottenere un accoppiamento allentato.
  • Consente di separare la definizione di un metodo dalla gerarchia di ereditarietà

Motivi importanti per l'utilizzo della classe astratta

  • Le classi astratte offrono funzionalità predefinite per le sottoclassi.
  • Fornisce un modello per classi specifiche future
  • Ti aiuta a definire un'interfaccia comune per le sue sottoclassi
  • La classe astratta consente la riusabilità del codice.

Cos'è un'interfaccia?

L'interfaccia è un blueprint che può essere utilizzato per implementare una classe. L'interfaccia non contiene alcun metodo concreto (metodi che hanno codice). Tutti i metodi di un'interfaccia sono metodi astratti. Un'interfaccia non può essere istanziata. Tuttavia, le classi che implementano interfacce possono essere istanziate. Le interfacce non contengono mai variabili di istanza, ma possono contenere variabili finali statiche pubbliche (ad esempio, variabili di classe costanti)

Differenza tra interfaccia e classe astratta in Java

Una classe astratta ti consente di creare funzionalità che le sottoclassi possono implementare o sovrascrivere mentre un'interfaccia ti consente solo di dichiarare la funzionalità ma non di implementarla. Una classe può estendere solo una classe astratta mentre una classe può implementare più interfacce.

parametri Interfaccia Classe astratta
Velocità Rallentare Connessione
Molteplici ereditarietà Implementare diverse interfacce Una sola classe astratta
Structure Metodi astratti Metodi astratti e concreti
Quando usare Miglioramento futuro Per evitare l'indipendenza
Ereditarietà/Implementazione Una classe può implementare più interfacce La classe può ereditare solo una classe astratta
Implementazione predefinita Mentre si aggiungono nuove cose all'interfaccia, è un incubo trovare tutti gli implementatori e implementare cose appena definite. Nel caso della classe astratta è possibile sfruttare l'implementazione predefinita.
Modificatori di accesso L'interfaccia non dispone di modificatori di accesso. Tutto ciò che è definito all'interno dell'interfaccia viene considerato modificatore pubblico. La classe astratta può avere un modificatore di accesso.
Quando usare È preferibile utilizzare l'interfaccia quando varie implementazioni condividono solo la firma del metodo. Gerarchia polimorfica dei tipi di valore. Dovrebbe essere utilizzato quando diverse implementazioni dello stesso tipo condividono un comportamento comune.
Campi dati l'interfaccia non può contenere campi dati. la classe può avere campi dati.
Impostazione predefinita dell'ereditarietà multipla Una classe può implementare numerose interfacce. Una classe eredita solo una classe astratta.
Implementazione/Attuazione Un'interfaccia è astratta, quindi non può fornire alcun codice. Una classe astratta può fornire un codice completo e predefinito che dovrebbe essere sovrascritto.
Utilizzo dei modificatori di accesso Non è possibile utilizzare modificatori di accesso per il metodo, le proprietà, ecc. È possibile utilizzare una classe astratta che contiene modificatori di accesso.
Impiego Le interfacce aiutano a definire le capacità periferiche di una classe. Una classe astratta definisce l'identità di una classe.
Campi definiti Nessun campo può essere definito Una classe astratta consente di definire sia campi che costanti
Eredità Un'interfaccia può ereditare più interfacce ma non una classe. Una classe astratta può ereditare una classe e più interfacce.
Costruttore o distruttori Un'interfaccia non può dichiarare costruttori o distruttori. Una classe astratta può dichiarare costruttori e distruttori.
Limite delle estensioni Può estendere qualsiasi numero di interfacce. Può estendere solo una classe o una classe astratta alla volta.
Parola chiave astratta In una parola chiave dell'interfaccia astratta, è facoltativo per dichiarare un metodo come astratto. In una classe astratta, la parola chiave abstract è obbligatoria per dichiarare un metodo come astratto.
Tipo di classe Un'interfaccia può avere solo metodi astratti pubblici. Una classe astratta ha metodi astratti protetti e pubblici.

Codice di esempio per interfaccia e classe astratta in Java

Di seguito è riportato un codice di esempio per creare un'interfaccia e una classe astratta in Java

Sintassi dell'interfaccia

interface name{
//methods
}

Java Esempio di interfaccia:

interface Pet {
    public void test();
}
class Dog implements Pet {
    public void test() {
        System.out.println("Interface Method Implemented");
    }
    public static void main(String args[]) {
        Pet p = new Dog();
        p.test();
    }
}

Sintassi della classe astratta

abstract class name{
    // code
}

Esempio di classe astratta:

abstract class Shape {
    int b = 20;
    abstract public void calculateArea();
}

public class Rectangle extends Shape {
    public static void main(String args[]) {
        Rectangle obj = new Rectangle();
        obj.b = 200;
        obj.calculateArea();
    }
    public void calculateArea() {
        System.out.println("Area is " + (b * b));
    }
}