2011-01-20 11 views
5

Come sappiamo che possiamo dichiarare solo la firma del metodo e inoltre non possiamo creare l'istanza di un'interfaccia. allora perché abbiamo bisogno dell'interfaccia. Non necessario il suo caricamento in JVM. Questo è anche un calo delle prestazioni. Stiamo creando l'interfaccia e diverse classi che implementano quell'interfaccia e definiscono tutti i metodi dell'interfaccia. In realtà ciò che abbiamo ottenuto da questa interfaccia. Potresti per favore darmi un esempio.perché abbiamo bisogno dell'interfaccia invece della classe e cosa stiamo ottenendo dall'interfaccia

+1

possibile duplicato di [Java: interfaccia/classi astratte/metodo astratto] (http://stackoverflow.com/questions/2124951/java-interface-abstract-classes-abstract-method) –

risposta

9

L'interfaccia è che si sta costringendo il client a implementare una cosa specifica, l'implementazione rimarrà al client. Inoltre java non supporta l'ereditarietà multipla estendendo più classi è possibile implementare più interfacce.

Ad esempio: List dichiara il metodo add(..) tutte le implementazioni di List le implementa.

Più semplice sarebbe.

Si definisce un'interfaccia e un metodo speak() significa che tutti gli animali dovranno parlare con diverse implementazioni differenti. L'uomo parlerà, il cane abbaierà, il leone ruggirà.

Perché dovremmo andare per creare un animale di classe. Possiamo dichiarare il speak() in ogni classe. Qual è il befit che otterremo dalla classe Animal e implementeremo speak() in tutte le sottoclassi. Ancora non ho avuto questo concetto

vantaggio principale è ereditarietà e polimorfismo [concetti fondamentali della programmazione orientata agli oggetti]

Sei specificando il comportamento di animali anche qui.

Si può avere

Animal obj = new Man(); 

Animal obj = getAnimalForThisCriteria(something here);//this will return some animal at runtime so you can catch instance using Animal. 

Si potrebbe avere tre diversi Classe Ma, Cane, Leone con lo stesso metodo, ma non c'è modo di dire sono tutti animali a meno che non si estende o implementa classe o interfaccia comune, qui arriva il concetto di struttura

+0

Perché dovremmo andare per creare una classe Animale in più Possiamo dichiarare il speak() in ogni classe. Qual è il befit che otterremo dalla classe Animal e implementeremo speak() in tutte le sottoclassi. Ancora non ho capito questo concetto. – Nishi

+0

Verifica aggiornamento ......... –

+0

@JigarJoshi buona spiegazione +1 – SpringLearner

4

Avere interfacce separate dalle classi consente di cancellare la separazione tra, beh, l'interfaccia di un oggetto e la sua implementazione. Senza di essi non si avrebbe alcun modo standard per indicare che alcune classi non dovrebbero contenere dettagli di implementazione.

In secondo luogo, poiché Java non supporta l'ereditarietà multipla, le interfacce rappresentano una soluzione parziale, consentendo l'ereditarietà delle funzionalità esterne della classe.

1

Le interfacce sono per quando ci si preoccupa solo delle capacità di un oggetto, non di come le raggiunge.

Supponiamo che si stia scrivendo il codice di controllo di alto livello per un robot. Non ti importa di come funziona veramente il robot, vuoi solo essere in grado di dire di andare avanti, indietro, girare a sinistra o destra, ecc. Senza interfacce, dovresti implementare una classe astratta chiamata AbstractRobot che ha tutti i metodi come metodi astratti. A questo punto hai praticamente creato un'interfaccia, ma sotto forma di una classe astratta, ma che è "più pesante" del necessario.

Infine, una classe può conformarsi alle più interfacce, ma può solo ereditare da una classe. Ciò consente alcuni schemi di progettazione che si basano sull'ereditarietà multipla.

0

Proverò a spiegarlo in parole semplici.

Considerate il vostro gioco per computer preferito, ad esempio Counter Strike. In questo gioco, i giocatori (terroristi o antiterroristi) usano le armi.

Se insegniamo il giocatore come utilizzare weapon (analogo a Interface), si può usare qualsiasi arma come AK47, Maverick, Shotgun, Sniper (analogo a classi che ereditano l'interfaccia Arma).

Il vantaggio di questo è considerare Bazooka (che implementa Arma) è stato sviluppato nelle versioni future. Quindi il giocatore corrente sarà in grado di usarlo senza alcuna modifica, poiché sa come usare l'interfaccia di Armi :-)

Questo è solo un semplice esempio. Ci sono molti altri motivi per usare le interfacce.

+1

Questo esempio funzionerebbe anche se non esistessero interfacce. Dovresti solo definire una classe madre di armi. –

+0

Oh sì, è corretto. Ma è meglio usare Interface, dato che le classi saranno in grado di ereditare altre classi. Se usiamo la classe madre Weapon, le classi derivate non saranno in grado di ereditare da qualsiasi altra classe a causa della non esistenza dell'eredità multipla in Java. – Trivikram

0

Semplice. Penso che le classi Interfaces e Abstract abbiano lo stesso scopo. La differenza è che se estendi una classe astratta, non potresti estendere nessun'altra classe in Java. Motivo: Java non supporta l'ereditarietà multipla. Allo stesso tempo, puoi implementare qualsiasi numero di interfaccia per una classe.

2

Quali dovresti utilizzare, classi o interfacce astratte?

considerare l'utilizzo di classi astratte se uno di questi affermazioni si applicano alla vostra situazione:

  • si desidera condividere il codice tra le diverse classi strettamente correlati.
  • Ci si aspetta che le classi che estendono la classe astratta abbiano molti metodi o campi comuni o richiedano modificatori di accesso diversi da pubblico (come protetto e privato).
  • Si desidera dichiarare campi non statici o non finali. Ciò consente di definire metodi che possono accedere e modificare lo stato dell'oggetto a cui appartengono.

considerare l'utilizzo di interfacce se uno di questi affermazioni si applicano alla vostra situazione:

  • ci si aspetta che le classi non correlate sarebbe implementare l'interfaccia. Ad esempio, le interfacce Comparable e Cloneable sono implementate da molte classi non correlate.
  • Si desidera specificare il comportamento di un particolare tipo di dati, ma non si preoccupa di chi ne implementa il comportamento.
  • Si desidera sfruttare l'ereditarietà multipla del tipo.
0

L'uso più importante delle interfacce come vedo è passare il codice (anonymous inner class o lambda) a un metodo come parametro.

Esempio:

supponiamo di voler fare un metodo che può restituire il tempo di esecuzione necessario per eseguire un pezzo di codice. Vogliamo passare il nostro codice come parametro a questo metodo.

interface Code{ 
    public void run(); 
} 


long getExectutionTime(Code code){ 

    long startTime = System.nanoTime();  
    code.run();  
    return System.nanoTime() - startTime; 
} 


getExecutionTime(new Code(){ 

    public void run(){ 
      //the code to be executed 
    } 
}); 

in Java 8,

getExecutionTime(()->{ 
    //the code to be executed 
}); 
0

interfaccia non è altro che la sua una linea guida per la nuova implementazione fornisce alcune istruzioni per la nuova implementazione e categorizzare la funzionalità dell'oggetto .In dettagli come se creiamo un'interfaccia quindi creiamo un'istruzione per l'implementazione.

0

Un'analogia per un'interfaccia è pensare a una classe che utilizza un'interfaccia come se fosse una presa elettrica e pensare all'implementazione come spina. Alla presa non importa cosa c'è dietro la spina, purché si inserisca nella presa. In termini psuedocodarlo potrebbe essere scritto in questo modo:

public interface ElectricOutlet { 
    public void powerUp(); 
} 

E una classe che implementa ElectricOutlet potrebbe assomigliare a questo:

public class Appliance implements ElectricOutlet { 
    //member variables 
    public void powerUp() { 
     //Draw power from the wall 
    } 
    ... 
} 

Così come si usa l'interfaccia? In questo modo:

//lots of other code 
ElectricOutlet out = new Appliance(); //plug the appliance into the outlet 
out.powerUp; //power it up! 

Ovviamente, non deve essere un'appliance collegata a una presa. Potrebbe essere una TV, un laptop o un tosaerba, ma tutti si comportano allo stesso modo dal punto di vista della presa. Quindi, come si applica alla programmazione? Allo stesso modo:

List<String> list = new ArrayList<String>(); // create a new List of Strings 

Ho appena creato una nuova (vuota) lista di stringhe. Se si scopre che ArrayList non fornisce la prestazione giusta, e LinkedList funziona meglio, posso tornare indietro e cambiare quella linea a questo:

List<String> = new LinkedList<String>(); //should work better now 

posso fare questo perché sia ​​ArrayList e LinkedList implementano l'interfaccia List e quindi forniscono lo stesso comportamento (API), anche se le implementazioni interne potrebbero essere diverse. Dal punto di vista della lista, tuttavia, non importa quale sia il funzionamento interno, purché l'interfaccia sia presente. Ciò consente una grande indipendenza tra le classi e consente un maggiore riutilizzo.

Problemi correlati