2010-12-14 79 views
18

Doublons possibles:
Abstract class and Interface class?
Java: interface/abstract classes/abstract methodQuelle est l'utilisation réelle de l'interface dans Java?

En Java, quelle que soit l'utilisation de l'interface est remplie par classe abstraite. Je sais qu'un avantage des interfaces est que si nous implémentons une interface, nous pouvons aussi étendre une autre classe. Y at-il un autre usage ou avantage de l'interface en Java?

+1

Cette question a été posée plusieurs fois auparavant, sous différentes formes. –

+0

Pour implémenter une interface, toutes les méthodes définies par cette interface doivent apparaître dans son code source avant que la classe ne compile correctement. Cette interface permet à une classe de devenir plus formelle sur le comportement qu'elle promet de fournir. –

Répondre

23

Ce que vous aimez: des milliers de méthodes abstraites dans une classe abstraite et hériteront de cette classe ou faire autant d'interfaces pour les méthodes abstraites spécifiques et d'utiliser ceux que vous voulez en héritant autant d'interfaces que nécessaire ...

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

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

Donc, utilisez uniquement cette méthode en héritant d'une interface particulière, si vous héritez de classes Abstract, vous héritez inutilement de toutes les méthodes dont vous n'avez pas besoin dans une classe et qui peuvent être nécessaires dans d'autres classes.

7

Plusieurs interfaces peuvent être implémentées, mais une seule classe peut être étendue. Une classe complètement abstraite ressemble beaucoup à une interface, sauf qu'une classe abstraite peut contenir des variables.

Cela dépend vraiment de ce dont vous avez besoin. C++ vous permet d'étendre autant de classes que vous le souhaitez, et cela se transforme en un désastre. La bonne chose à propos d'avoir une seule superclasse est qu'il n'y a qu'un seul autre ensemble d'implémentations dont vous avez à vous soucier (même si le parent a un parent, la combinaison particulière du parent devient votre parent ...)

Interfaces un objet pour jouer de nombreux rôles, mais ils ne permettent pas la réutilisation du code. C'est vraiment pour simplifier la réflexion sur l'héritage. Sur la balance, je pense qu'ils ont bien compris.

+0

grâce à fournir des informations précieuses. – kandarp

1

Interfaces permettent le nominative typing en Java à fonctionnent à travers disjoint class hierarchies.

Ceci est dû à la limitation "single inheritance" sur une hiérarchie de classes et aux "types fermés". Je vais tenir ma langue sur subtype polymorphism et la mise en œuvre de Java ;-)

Il existe d'autres solutions à ce problème telles que le typage dynamique, le typage structurel, l'héritage multiple et les traits, etc. Chaque approche a des avantages et des désavantages . Les interfaces étaient juste l'approche que Java a prise.

+0

merci de répondre à mon message – kandarp

0

Interface Java - fournit le data encapsulation ce qui signifie que l'implémentation des méthodes est invisible. La classe qui étend cette interface doit implémenter toutes les méthodes déclarées dans celle-ci.

plus d'info: wiki answer

0

Avantages sur une classe abstraite? sauf le fait que vous pouvez implémenter plusieurs interfaces mais étendre une seule classe (abstraite ou non), c'est la même chose qu'une classe abstraite dont toutes les méthodes sont abstraites et publiques

51

Les interfaces vous permettent d'utiliser des classes dans différentes hiérarchies, polymorphically .

Par exemple, supposons que vous avez l'interface suivante:

public interface Movable { 
    void move(); 
} 

Un nombre quelconque de classes, à travers des hiérarchies de classes pourraient mettre en œuvre Movable à leur manière spécifique, mais encore être utilisé par un appelant dans un uniforme façon.

Donc, si vous avez les deux catégories suivantes:

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! 
    } 
} 

Du point de vue de l'appelant, il est juste un Movable

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

J'espère que cela aide.

+1

merci de m'aider à comprendre la différence entre l'interface et l'abstrait avec un exemple approprié. – kandarp