538 votes

Différence entre une Interface et une classe abstraite ?

Récemment, j'ai assisté à une entrevue de MNC.

J'ai été invité à expliquer les Différences entre une Interface et une classe Abstraite.

C'est une question que j'ai préparé avant l'entrevue.

Je lui ai dit:

Principale différence est que les méthodes d'une interface Java sont implicitement abstrait et ne peut pas avoir des implémentations. Une classe abstraite Java peut avoir les méthodes d'instance qui implémente un comportement par défaut.

Les Variables déclarées dans une interface Java est par défaut final. Un classe abstraite peut contenir des non-final variables.

Les membres d'une interface Java sont publics par défaut. Java abstrait classe peut avoir l'habitude des saveurs de membres de la classe comme privé, la protection, etc..

Java de l'interface doit être implémentée à l'aide du mot clé "met en œuvre"; Java classe abstraite doit être étendu à l'aide du mot clé "extends".

Une interface peut étendre une autre interface Java seulement, une classe abstraite peut étendre une autre classe Java et d'implémenter plusieurs interfaces Java.

Une classe Java peut implémenter plusieurs interfaces, mais il peut s'étendre qu' une classe abstraite.

Mais le truc, c'est après avoir décrit ces différences, il n'était pas satisfait.

Il m'a dit que ces différences représenté livre de la connaissance.

Il m'a demandé qui quand dois-je choisir une classe abstraite via une interface et de donner quelques exemples pratiques.

je veux aussi savoir que là Où j'ai fait de mal?

567voto

Vimal Bera Points 2705

Je vais vous donner un exemple:

public interface LoginAuth{
   public String encryptPassword(String pass);
   public void checkDBforUser();
}

Maintenant, supposons que vous disposez de 3 bases de données dans votre application. Ensuite, chaque mise en œuvre de cette base de données doit définir le ci-dessus 2 méthodes:

public class DBMySQL implements LoginAuth{
          // Needs to implement both methods
}
public class DBOracle implements LoginAuth{
          // Needs to implement both methods
}
public class DBAbc implements LoginAuth{
          // Needs to implement both methods
}

Mais que faire si encryptPassword() n'est pas la base de données dépend, et c'est la même chose pour chaque classe? Ensuite, le ci-dessus ne serait pas une bonne approche.

Au lieu de cela, envisager cette approche:

public abstract class LoginAuth{
   public String encryptPassword(String pass){
            // Implement the same default behavior here 
            // that is shared by all subclasses.
   }

   // Each subclass needs to provide their own implementation of this only:
   public abstract void checkDBforUser();
}

Maintenant à chaque enfant de la classe, nous avons seulement besoin de mettre en œuvre une méthode - la méthode qui est à la base de données dépendantes.

J'ai essayé de mon mieux et Espère que cela va effacer vos doutes.

222voto

Shailesh Saxena Points 834

Rien n'est parfait dans le monde. Ils pourraient s'attendre à quelque chose avec une approche pratique.

Mais après votre explication, vous pouvez ajouter ces lignes avec une approche légèrement différente.

  1. Les Interfaces sont des règles (Règles, parce que vous devez donner à une mise en œuvre à et que vous ne pouvez pas l'ignorer ou de les éviter, de sorte que sont imposées comme les règles) qui fonctionne comme une compréhension commune de document parmi les les différentes équipes dans le développement de logiciels.

  2. Interfaces donner l'idée de ce qui est à faire, mais pas comment il sera fait. Donc
    la mise en œuvre dépend entièrement de développeur en suivant les règles qui lui sont données(Moyens compte tenu de la signature de ces méthodes).

  3. Les classes abstraites ne peuvent contenir que des résumé des déclarations ou seulement des implémentations concrètes ou mixte.

  4. Résumé des déclarations sont comme des règles à suivre et des implémentations concrètes sont comme les lignes directrices(Vous pouvez l'utiliser comme il est, ou vous pouvez l'ignorer en remplaçant et en donnant votre propre choix de mise en œuvre).

  5. En outre, les méthodes de même signature peut changer le comportement dans contexte différent sont fournis à titre déclarations interface que des règles à mettre en œuvre en conséquence dans des contextes différents.

195voto

Daniel Lerps Points 1207

Vous avez fait un bon résumé de la pratique, des différences dans l'utilisation et la mise en œuvre, mais n'a rien dit à propos de la différence de sens.

Une interface est une description du comportement de mise en œuvre de la classe. La mise en œuvre de la classe assure, qu'il aura ces méthodes qui peuvent être utilisées sur elle. Il s'agit essentiellement d'un contrat ou d'une promesse de la classe a à faire.

Une classe abstraite est une base pour les différentes sous-classes qui partagent un comportement qui n'a pas besoin d'être à plusieurs reprises être créé. Les sous-classes doivent remplir le comportement et ont la possibilité de le remplacer prédéfinir comportement (tant qu'elle n'est pas définie en tant que final ou private).

Vous trouverez de bons exemples dans l' java.util package qui comprend les interfaces List et les classes abstraites comme AbstractList qui déjà implémente l'interface. La documentation officielle décrit l' AbstractList comme suit:

Cette classe fournit un squelette de mise en œuvre de la Liste de l'interface afin de minimiser l'effort requis pour mettre en œuvre cette interface soutenu par un "accès aléatoire" magasin de données (comme un tableau).

99voto

Satya Points 58

Une interface est composée de singleton variables(public static final) et les méthodes abstraites. Normalement, nous préférons interface en temps réel quand on sait quoi faire, mais ne savent pas comment le faire. Ce concept peut être comprendre en prenant un exemple simple:

Considérons que nous avons un Paiement de classe. le paiement peut être fait dans beaucoup de façons, comme paypal, carte de crédit Donc, nous avons l'habitude de prendre le Paiement comme notre interface qui contient makePayment() la méthode et la Carte de crédit et PayPal sont les deux classes d'implémentation.

public interface Payment
{
    void makePayment();//by default it is a abstract method
}
public class PayPal implements Payment
{
    public void makePayment()
    {
        //some logic for paypal payment
        //like paypal uses username and password for payment
    }
}
public class CreditCard implements Payment
{
    public void makePayment()
    {
        //some logic for CreditCard payment
        //like CreditCard uses card number, date of expiry etc...
    }
}

Dans l'exemple ci-dessus par Carte de crédit et PayPal sont deux classes d'implémentation /stratégies. L'Interface permet également la notion d'héritage multiple en java, ce qui ne peut pas être obtenu par la classe abstraite.

Venant de la classe abstraite nous choisissons classe abstraite quand nous savons que certaines fonctions de comment le faire et certaines fonctionnalités quoi faire

Prenons un exemple

public abstract class Burger
{
    public void packing()
    {
        //some logic to packing a berger
    }
    public abstract void price();//here price is different for different catagories.Thats why abstract method
}
public class VegBerger extends Burger
{
    public void price()
    {
        //set price for a veg burger.
    }
}
public class NonVegBerger extends Burger
{
    public void price()
    {
        //set price for a non-veg burger.
    }
}

Si, à l'avenir, nous ajoutons une méthode quelconque(peut être en béton de la méthode/de la méthode abstraite), puis la mise en œuvre de la classe n'aurez pas besoin d'un changement au code de l'étiquette . Mais si nous ajoutons la méthode, dans une interface à l'avenir, alors il est obligatoire de changer tous sa classe d'implémentation de l'ensemble de ses étiquettes à code sinon erreur de compilation se produit. Il y a encore un peu plus la différence, mais ce sont les principales différences qui peuvent votre interviewer prévu . J'espère que ce sera peu utile

24voto

Vijairam Points 356

Votre explication a l'air correct, mais peut-être il a regardé comme si vous étiez à la lecture de tout cela dans un livre? :-/

Ce que je suis plus dérangé, c'est la façon solide a été votre exemple? Avez-vous la peine d'inclure presque toutes les différences entre l'abstrait et interfaces?

Personnellement, je vous suggère ce lien: http://mindprod.com/jgloss/interfacevsabstract.html#TABLE

pour une liste exhaustive des différences..

Espérons qu'il vous aide, vous et tous les autres lecteurs dans leurs futurs entretiens

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X