2010-12-14 18 views
18

Possibili duplicati:
Abstract class and Interface class?
Java: interface/abstract classes/abstract methodqual è l'effettivo utilizzo dell'interfaccia in java?

In Java, qualunque sia l'uso dell'interfaccia è soddisfatta dalla classe astratta. So che un vantaggio delle interfacce è che se implementiamo un'interfaccia, possiamo anche estendere un'altra classe. C'è qualche altro uso o vantaggio dell'interfaccia in Java?

+1

Questa domanda è stata posta molte volte prima, in diverse forme. –

+0

Per implementare un'interfaccia, tutti i metodi definiti da tale interfaccia devono apparire nel codice sorgente prima che la classe venga compilata correttamente. In questo modo l'interfaccia consente a una classe di diventare più formale riguardo al comportamento che promette di fornire. –

risposta

23

Cosa ti piace: migliaia di metodi astratti in una classe astratta ed ereditare questa classe o fare il maggior numero di interfacce per specifici metodi astratti e utilizzare solo quelli che si vogliono ereditando il maggior numero di interfacce come necessario ...

abstract class A 
{ 
//thousands of abstract method(); 
abstract methodA(); 
abstract methodB(); 
abstract methodC(); 
} 

//OR 
interface ForOnlymethodA 
{ 
void methodA(); 
} 
interface FormethodBandmethodC 
{ 
void methodB(); 
void methodC(); 
} 

Quindi, usa quel metodo solo quello che ti serve ereditando una particolare interfaccia, se stai ereditando le classi Abstract, allora stai ereditando inutilmente tutti i metodi che non hai bisogno in una classe e potrebbe essere necessario in alcune altre classi ..

7

È possibile implementare più interfacce, ma è possibile estendere solo una classe. Una classe completamente astratta è molto simile a un'interfaccia, tranne che una classe astratta può contenere variabili.

Dipende davvero da ciò che ti serve. C++ ti consente di estendere tutte le classi che desideri e diventa un po 'disastroso. La cosa bella di avere una sola superclasse è che c'è solo un altro insieme di implementazioni di cui devi preoccuparti (anche se il genitore ha un genitore, la particolare combinazione del genitore diventa tuo genitore ...)

Le interfacce permettono un oggetto per svolgere molti ruoli, ma non consentono il riutilizzo del codice.

È davvero per semplificare il pensiero sull'ereditarietà. A conti fatti, penso che abbiano capito bene.

+0

grazie per fornire preziose informazioni. – kandarp

1

interfacce consentono al nominative typing in Java per lavoro su disgiunti class hierarchies.

Ciò è dovuto alla limitazione "single inheritance" su una gerarchia di classi e "tipi chiusi". Terrò la mia lingua su subtype polymorphism e l'implementazione di Java ;-)

Ci sono altre soluzioni a questo problema come digitazione dinamica, tipizzazione strutturale, ereditarietà multipla e tratti, ecc. Ogni approccio ha vantaggi e svantaggi . Le interfacce erano solo l'approccio adottato da Java.

+0

grazie per rispondere al mio post – kandarp

0

Interfaccia Java - fornisce il data encapsulation che significa che l'implementazione dei metodi non può essere vista. La classe che estende questa interfaccia deve implementare tutti i metodi dichiarati in essa.

maggiori informazioni: wiki answer

0

Vantaggi rispetto ad una classe astratta? tranne il fatto che è possibile implementare più interfacce ma estendere solo una classe (astratta o non), è la stessa di una classe astratta che tutti i metodi sono astratti e pubblici

51

Le interfacce consentono di utilizzare le classi in diverse gerarchie, polymorphically .

Per esempio, supponiamo di avere la seguente interfaccia:

public interface Movable { 
    void move(); 
} 

Qualsiasi numero di classi, attraverso gerarchie di classi potrebbe implementare Movable a loro modo specifico, ma ancora essere utilizzati da alcuni chiamante in uniforme modo.

Quindi, se si hanno le seguenti due classi:

public class Car extends Vehicle implements Movable { 
    public void move() { 
     //implement move, vroom, vroom! 
    } 
} 

public class Horse extends Animal implements Movable { 
    public void move() { 
     //implement move, neigh! 
    } 
} 

Dal punto di vista del chiamante, è solo una Movable

Movable movable = ...; 
movable.move(); //who am I? 

Spero che questo aiuta.

+1

grazie per aiutarmi a capire la differenza tra interfaccia e astratto con l'esempio corretto. – kandarp

Problemi correlati