Maison  >  Article  >  Java  >  Quand utiliser une classe abstraite et quand utiliser une interface en Java ?

Quand utiliser une classe abstraite et quand utiliser une interface en Java ?

WBOY
WBOYavant
2023-08-21 08:17:091918parcourir

Quand utiliser une classe abstraite et quand utiliser une interface en Java ?

Les interfaces peuvent être utilisées pour définir des contrats comportementaux et servir également de contrats d'interaction entre deux systèmes, tandis que les classes abstraites sont principalement utilisées pour définir les comportements par défaut des sous-classes, ce qui signifie que toutes les sous-classes doivent exécuter la même fonction.

Quand utiliser la classe abstraite

  • Si nous utilisons le concept d'héritage, la classe abstraite est un bon choix car elle fournit une implémentation de classe de base commune pour les classes dérivées.
  • Si nous souhaitons déclarer des membres non publics, les classes abstraites sont également un bon choix. Dans une interface, toutes les méthodes doivent être publiques.
  • Si nous souhaitons ajouter de nouvelles méthodes à l'avenir, les classes abstraites sont un meilleur choix. Car si l’on ajoute une nouvelle méthode à une interface, toutes les classes qui implémentent déjà l’interface doivent être modifiées pour implémenter la nouvelle méthode.
  • Si nous souhaitons créer plusieurs versions de notre composant, nous pouvons créer une classe abstraite. Les classes abstraites offrent un moyen facile à utiliser de versionner les composants. En mettant à jour la classe de base, toutes les classes héritées sont automatiquement mises à jour. Une fois l'interface créée, elle ne peut plus être modifiée. Si une nouvelle version d'une interface est requise, une toute nouvelle interface doit être créée.
  • Les classes abstraites ont une meilleure compatibilité ascendante. Une fois qu'un client utilise une interface, nous ne pouvons pas la modifier ; s'il utilise une classe abstraite, nous pouvons toujours ajouter un comportement sans casser le code existant.
  • Si nous souhaitons fournir des fonctionnalités implémentées communes à toutes les implémentations de notre composant, nous pouvons utiliser des classes abstraites. Les classes abstraites nous permettent d'implémenter partiellement la classe, alors que les interfaces ne contiennent l'implémentation d'aucun membre.

Exemple

abstract class Car {
   public void accelerate() {
      System.out.println("Do something to accelerate");
   }
   public void applyBrakes() {
      System.out.println("Do something to apply brakes");
   }
   public abstract void changeGears();
}

Maintenant, toute voiture que vous souhaitez instancier doit implémenter la méthode changeGears().

class Alto extends Car {
   public void changeGears() {
      System.out.println("Implement changeGears() method for Alto Car");
   }
}
class Santro extends Car {
   public void changeGears() {
      System.out.println("Implement changeGears() method for Santro Car");
   }
}

Quand utiliser les interfaces

  • Si la fonctionnalité que nous créons sera utilisée sur des objets très différents, utilisez des interfaces. Les classes abstraites sont principalement utilisées pour des objets étroitement liés, tandis que les interfaces sont mieux adaptées pour fournir des fonctionnalités communes à des classes non liées.
  • Les interfaces sont un bon choix si nous pensons que l'API ne changera pas au fil du temps.
  • Si nous voulons des fonctionnalités similaires à l'héritage multiple, les interfaces sont également un bon choix car nous pouvons implémenter plusieurs interfaces.
  • Si nous concevons un module fonctionnel petit et concis, utilisez des interfaces. Si nous concevons une grande unité fonctionnelle, utilisez des classes abstraites.

Exemple

public interface Actor {
   void perform();
}
public interface Producer {
   void invest();
}

De nos jours, la plupart des acteurs sont assez riches pour faire leurs propres films. Si nous utilisons des interfaces au lieu de classes abstraites, nous pouvons implémenter à la fois Actor et Producer. De plus, nous pouvons également définir une nouvelle interface ActorProducer, qui hérite des deux.

public interface ActorProducer extends Actor, Producer{
   // some statements
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer