Differenza chiave: l' interfaccia o un protocollo è un modo comune che consente a oggetti non correlati di comunicare tra loro. Rappresenta un comportamento concordato che facilita l'interazione tra i due oggetti. Una classe astratta è una classe di oggetti che non può essere istanziata o impostare un'istanza di un oggetto. Questa classe potrebbe non avere implementazione o avere un'implementazione incompleta.
Java è un linguaggio di programmazione, che è stato influenzato dal linguaggio C. Deriva gran parte della sua sintassi da C e C ++, tuttavia ha meno strutture di basso livello di entrambi. Java è un linguaggio di programmazione generico progettato per avere meno dipendenze di implementazione rispetto alle lingue precedenti. È concomitante, basato su classi e un linguaggio orientato agli oggetti.
Java è stato sviluppato da James Gosling presso Sun Microsystems ed è stato rilasciato nel 1995. È stato originariamente rilasciato come componente principale della piattaforma Java di Sun Microsystems. Da allora Sun ha nuovamente licenziato la maggior parte delle sue tecnologie Java sotto la GNU General Public License. Ciò significa che tutta la tecnologia sotto licenza GNU General Public License è open source e generalmente disponibile gratuitamente. Alla fine Sun Microsystems si è fusa in Oracle Corporation. A partire dal 2012, Java è diventato uno dei linguaggi di programmazione più popolari per l'uso. Questo è particolarmente vero per le applicazioni Web client-server. Molti altri sistemi hanno sviluppato implementazioni alternative delle tecnologie Sun, come GNU Compiler per Java e GNU Classpath.
Una classe astratta è una classe di oggetti che non può essere istanziata o impostare un'istanza di un oggetto. Questa classe potrebbe non avere implementazione o avere un'implementazione incompleta. Può anche avere metodi o proprietà astratti condivisi da tutte le sottoclassi. In alcuni linguaggi di programmazione, i tipi astratti senza implementazione sono noti come interfacce. In Java, un tipo astratto può essere creato usando la parola chiave "abstract" nella definizione della classe. Lo scopo di avere una classe astratta per posizionare tutti i metodi che non sono implementati nella classe astratta e lasciarlo alla sottoclasse per determinare come implementare queste classi. Se una classe ha un singolo metodo astratto, la classe deve essere dichiarata come una classe astratta, sebbene non sia necessario avere almeno un singolo metodo per dichiarare un estratto di classe.
Malliktalksjava.in elenca le principali differenze tra interfaccia e astratto come:
- La classe astratta ha il costruttore, ma l'interfaccia no.
- Le classi astratte possono avere implementazioni per alcuni dei suoi membri (metodi), ma l'interfaccia non può avere l'implementazione per nessuno dei suoi membri.
- Le classi astratte dovrebbero avere sottoclassi che saranno inutili.
- Le interfacce devono avere implementazioni di altre classi altrimenti inutili
- Solo un'interfaccia può estendere un'altra interfaccia, ma qualsiasi classe può estendere una classe astratta.
- Tutte le variabili nelle interfacce sono definitive per impostazione predefinita
- Le interfacce forniscono una forma di ereditarietà multipla. Una classe può estendere solo un'altra classe.
- Le interfacce sono limitate a metodi e costanti pubblici senza implementazione. Le classi astratte possono avere un'implementazione parziale, parti protette, metodi statici, ecc.
- Una classe può implementare diverse interfacce. Ma in caso di classe astratta, una classe può estendere solo una classe astratta.
- Le interfacce sono lente in quanto richiede un'ulteriore indiretta per trovare il metodo corrispondente nella classe effettiva. Le lezioni astratte sono veloci.
- Il modificatore di accessibilità (pubblico / privato / interno) è consentito per la classe astratta. L'interfaccia non consente il modificatore di accessibilità
- Una classe astratta può contenere metodi completi o incompleti. Le interfacce possono contenere solo la firma di un metodo ma nessun corpo. Quindi una classe astratta può implementare metodi ma un'interfaccia non può implementare metodi.
- Una classe astratta può contenere campi, costruttori o distruttori e implementare proprietà. Un'interfaccia non può contenere campi, costruttori o distruttori e ha solo la firma della proprietà ma nessuna implementazione.
- Vari modificatori di accesso come astratto, protetto, interno, pubblico, virtuale, ecc. Sono utili nelle classi astratte ma non nelle interfacce.
- La portata astratta spetta alla classe derivata.
- L'ambito dell'interfaccia è fino a qualsiasi livello della catena di ereditarietà.
Le informazioni per il tavolo sono gentilmente concesse da codeproject.com e mindprod.com
Interfaccia | Classe astratta | |
Eredità multipla | Una classe può ereditare diverse interfacce. | Una classe può ereditare solo una classe astratta. |
Implementazione predefinita | Un'interfaccia non può fornire alcun codice, solo la firma. | Una classe astratta può fornire un codice completo e predefinito e / o solo i dettagli che devono essere sovrascritti. |
Modificatori di accesso | Un'interfaccia non può avere modificatori di accesso per i sottotitoli, le funzioni, le proprietà ecc. Tutto viene assunto come pubblico. | Una classe astratta può contenere modificatori di accesso per i sottotitoli, le funzioni, le proprietà. |
Core vs. Peripheral | Le interfacce sono utilizzate per definire le abilità periferiche di una classe. In altre parole, sia Human che Vehicle possono ereditare da un'interfaccia IMovable. | Una classe astratta definisce l'identità di base di una classe e lì viene utilizzata per oggetti dello stesso tipo. |
Omogeneità | Se varie implementazioni condividono solo firme del metodo, allora è meglio usare le interfacce. | Se varie implementazioni sono dello stesso tipo e usano comportamenti o stati comuni, la classe astratta è meglio usarla. |
Velocità | Richiede più tempo per trovare il metodo effettivo nelle classi corrispondenti. | Veloce |
Aggiunta di funzionalità | Se aggiungiamo un nuovo metodo a un'interfaccia, dobbiamo rintracciare tutte le implementazioni dell'interfaccia e definire l'implementazione per il nuovo metodo. | Se aggiungiamo un nuovo metodo a una classe astratta, abbiamo la possibilità di fornire un'implementazione predefinita e quindi tutto il codice esistente potrebbe funzionare correttamente. |
Campi e costanti | Nessun campo può essere definito nelle interfacce. | Una classe astratta può avere campi e costanti definiti. |
Concisione | Le dichiarazioni costanti in un'interfaccia sono tutte presunte statiche finali pubbliche. | Il codice condiviso può essere aggiunto in una classe astratta. |
costanti | Solo le costanti statiche finali possono utilizzarle senza qualificazione nelle classi che implementano l'interfaccia. | Sono possibili sia l'istanza che le costanti statiche. Sia il codice interstiziale statico che quello istanza sono anche possibili per calcolare le costanti. |
Convenienza di terzi | Un'implementazione dell'interfaccia può essere aggiunta a qualsiasi classe di terze parti esistente. | Una classe di terze parti deve essere riscritta per estendersi solo dalla classe astratta. |
is-a vs. -able o can-do | Le interfacce sono spesso utilizzate per descrivere le abilità periferiche di una classe, non la sua identità centrale, ad esempio una classe di Automobile potrebbe implementare l'interfaccia Riciclabile, che potrebbe applicarsi a molti oggetti altrimenti completamente non correlati. | Una classe astratta definisce l'identità centrale dei suoi discendenti. Le interfacce implementate enumerano le cose generali che una classe può fare, non le cose di una classe. In un contesto Java, gli utenti dovrebbero in genere implementare l'interfaccia Runnable piuttosto che estendere Thread, perché non sono realmente interessati a fornire alcune nuove funzionalità di Thread, normalmente vogliono solo che alcuni codici abbiano la capacità di funzionare in modo indipendente. Vogliono creare qualcosa che può essere eseguito in un thread, non un nuovo tipo di thread. Il dibattito simile è -uno contro ha-un arriva quando si decide di ereditare o delegare. |
Collegare | L'utente può scrivere un nuovo modulo sostitutivo per un'interfaccia che non contenga un solo stick di codice in comune con le implementazioni esistenti. Quando l'utente implementa l'interfaccia, inizia da zero senza alcuna implementazione predefinita. L'utente deve ottenere strumenti da altre classi; niente viene fornito con l'interfaccia diversa da alcune costanti. Ciò dà all'utente la libertà di implementare un design interno radicalmente diverso. | L'utente deve utilizzare la classe astratta così com'è per il codice base, con tutto il suo bagaglio, buono o cattivo. L'autore della classe astratta ha imposto la struttura all'utente. |
Manutenzione | Se il codice client parla solo in termini di un'interfaccia, è possibile modificare facilmente l'implementazione concreta dietro ad essa, utilizzando un metodo factory. | Se il codice client parla solo in termini di una classe astratta, è possibile modificare facilmente l'implementazione concreta dietro ad essa, utilizzando un metodo factory. |