JavaRush /Blog Java /Random-FR /10 questions d'entretien Java sur les classes abstraites ...

10 questions d'entretien Java sur les classes abstraites et les interfaces

Publié dans le groupe Random-FR
Les classes et interfaces abstraites sont très populaires dans tous les langages de programmation orientés objet. Et dans presque toutes les interviews Java, vous rencontrez au moins une question sur ce sujet. Les interfaces sont mentionnées plus souvent en raison de leur popularité parmi les concepteurs de logiciels, mais des questions sur les classes abstraites reviennent également de temps en temps. Ces dernières sont le plus souvent posées aux candidats au poste de développeurs juniors, par exemple n'ayant pas plus de deux ans d'expérience dans le développement Java, tandis que les questions sur les interfaces sont le plus souvent rencontrées lors d'entretiens avec ceux dont l'expérience a déjà dépassé quatre ans. Elles sont généralement posées en conjonction avec d'autres questions sur les modèles de conception Java, tels que les modèles Decorator ou Factory. 10 questions d'entretien Java sur les classes abstraites et les interfaces - 1Dans cet article, nous examinerons les questions courantes sur les classes abstraites et les interfaces qui ont été posées à différents niveaux des entretiens Java. La plupart d'entre eux ne devraient pas être difficiles, même pour un programmeur Java novice. Il s'agit pour la plupart de questions de pure connaissance, mais certaines d'entre elles, comme les différences entre les classes abstraites et les interfaces en Java, ou le moment de choisir une classe abstraite plutôt qu'une interface , peuvent être assez délicates. Nous vous proposons une douzaine de questions intéressantes sur le sujet.
Si on vous a déjà posé une question lors d'un entretien ou si vous avez dû poser une question intéressante sur les classes abstraites et les interfaces, mais qu'elle ne figure pas sur cette liste, partagez-la dans les commentaires.

1. Une classe abstraite peut-elle avoir des constructeurs en Java ?

Oui, dans une classe abstraite en Java, vous pouvez déclarer et définir des constructeurs. Puisqu'il est impossible de créer des instances de classes abstraites, un tel constructeur ne peut être appelé que lors de la formation d'une chaîne de constructeurs, c'est-à-dire lors de la création d'une instance d'une classe d'implémentation spécifique. Mais imaginez que l’intervieweur pose ensuite la question : à quoi sert un constructeur si vous ne pouvez de toute façon pas créer une instance d’une classe abstraite ? Le fait est qu'il peut toujours être utilisé pour définir les valeurs initiales des variables communes déclarées dans une classe abstraite et utilisées par diverses implémentations. Même si vous ne déclarez aucun constructeur, le compilateur ajoutera un constructeur par défaut sans argument à la classe abstraite. Sans cela, votre sous-classe ne sera pas compilée car la première instruction de tout constructeur est un appel implicite super()au constructeur de superclasse par défaut en Java.

2. Les classes abstraites en Java peuvent-elles implémenter des interfaces ? Doivent-ils mettre en œuvre toutes les méthodes ?

Oui, les classes abstraites peuvent implémenter des interfaces à l'aide du implements. Puisqu’ils sont abstraits, ils ne sont pas obligés d’implémenter toutes les méthodes. Avoir une classe de base abstraite et une interface pour déclarer le type est une pratique recommandée. Un exemple est une interface java.util.Listet la classe abstraite correspondante java.util.AbstractList. Parce AbstractListqu'il implémente toutes les méthodes courantes, des implémentations spécifiques (telles que LinkedListet ArrayList) n'ont pas besoin d'implémenter toutes les méthodes, comme ce serait le cas si elles implémentaient Listdirectement l'interface. Cette solution combine l'avantage de l'utilisation d'une interface pour déclarer un type avec la flexibilité d'une classe abstraite pour implémenter tous les comportements courants en un seul endroit. Dans le livre de Joshua Bloch "Java. Effective Programming » contient un excellent chapitre sur le thème de l'utilisation des interfaces et des classes abstraites en Java, pour une meilleure compréhension, il est logique de l'étudier.

3. Un cours abstrait peut-il être définitif ?

Non il ne peut pas. Le mot-clé finalsignifie que la classe est au sommet de la hiérarchie et ne peut pas avoir de descendants. Et une classe abstraite sans héritiers est un cheval sphérique dans le vide, puisqu'il est impossible de créer une instance abstract class. Ainsi, si une classe est à la fois abstractet final, alors elle n'a pas de descendants et ne peut pas être instanciée. Le compilateur Java générera une erreur si vous créez une classe abstractet final.

4. Une classe abstraite en Java peut-elle avoir des méthodes statiques ?

Oui, les classes abstraites peuvent déclarer et définir des méthodes statiques. Il suffit de suivre les principes généraux de création de méthodes statiques en Java, car ils ne sont pas souhaitables dans la conception orientée objet, car le remplacement des méthodes statiques en Java n'est pas possible. Les méthodes statiques dans une classe abstraite sont très rares, mais s’il y a de bonnes raisons, rien ne vous empêche de les utiliser.

5. Est-il possible d'instancier une classe abstraite ?

Non, tu ne peux pas faire ça. L’essence d’une classe abstraite est qu’elle n’est pas complète et doit être complétée dans ses classes descendantes. Autrement dit, cette classe n’est pas prête à être utilisée. Par exemple, il peut manquer la mise en œuvre de certaines méthodes. Puisqu’une classe n’est pas prête à l’emploi, son objet ne peut pas être créé. Mais vous pouvez créer des instances d'héritiers d'une classe abstraite. Le compilateur Java générera une erreur si un programme tente d'instancier une classe abstraite.

6. Est-il nécessaire qu’une classe abstraite ait des méthodes abstraites ?

Non, une classe abstraite ne peut avoir aucune méthode abstraite. Vous pouvez créer un résumé de classe en Java simplement en utilisant un mot-clé abstractdans sa déclaration. Le compilateur appliquera toutes les restrictions structurelles, comme ne pas autoriser la création d'instanciations de cette classe. À propos, la question de savoir s'il doit y avoir des méthodes abstraites dans une classe ou une interface abstraite est controversée. Il me semble qu'une classe abstraite devrait avoir des méthodes abstraites, car c'est la première chose à laquelle un programmeur pense lorsqu'il voit une classe abstraite. Cela correspond bien au principe de minimiser les surprises.

7. Quelles sont les différences entre une classe abstraite et une interface en Java ?

C’est la question d’entretien Java la plus importante et l’une des plus classiques. Je ne peux pas compter combien de fois j'ai vu cette question dans des entretiens Java à tous les niveaux. Ce qui rend cette question intéressante, c’est notamment la possibilité pour le demandeur de donner un exemple. Il est facile de répondre aux questions sur les bases de la programmation orientée objet, telles que l'abstraction, l'encapsulation, le polymorphisme et l'héritage, mais lorsqu'il s'agit de nuances aussi subtiles, les candidats sont souvent confus et disent la première chose qui leur vient à l'esprit. La réponse à cette question mérite un article séparé (surtout après les modifications apportées à Java 8), mais en bref :
  • Une interface décrit uniquement le comportement (méthodes) d'un objet, mais elle ne possède pas d'états (champs) (sauf public static final), alors qu'une classe abstraite peut en avoir.

  • Une classe abstraite est héritée (étend) et une interface est implémentée (implémente). Nous ne pouvons hériter que d’une seule classe, mais implémenter autant d’interfaces que nous le souhaitons. Une interface peut étendre (étendre) une ou plusieurs autres interfaces.

  • Les classes abstraites sont utilisées lorsqu'il existe une relation « est-un », c'est-à-dire que la sous-classe étend la classe abstraite de base et que les interfaces peuvent être implémentées par différentes classes qui ne sont pas du tout liées les unes aux autres.

8. Quand est-il judicieux de préférer une classe abstraite à une interface et vice versa ?

Il s'agit d'une continuation des questions précédentes sur les classes abstraites et les interfaces. Si vous connaissez leurs différences syntaxiques, répondre à cette question ne vous posera pas de problèmes, car elles constituent le facteur déterminant dans la prise de décision. Puisqu’il est presque impossible d’ajouter une nouvelle méthode à une interface publiée, il est préférable d’utiliser une classe abstraite en cas de besoin potentiel de développement ultérieur. Développer des classes abstraites en Java est plus facile que développer des interfaces. De même, si une interface comporte trop de méthodes et que leur implémentation devient un véritable casse-tête, il est préférable de créer une classe abstraite pour l’implémentation par défaut. Ce modèle est suivi dans le package Java collections, la classe abstraite AbstractListfournit l'implémentation par défaut du List. Utilisez des classes abstraites si :
  • Vous souhaitez partager du code entre plusieurs classes étroitement liées.

  • Vous vous attendez à ce que les classes qui étendent votre classe abstraite aient de nombreuses méthodes ou champs en commun, ou qu'elles nécessitent des modificateurs d'accès autres que public(par exemple, protectedet private).

  • Vous souhaitez déclarer des champs non statiques не-final. Cela vous permet de définir des méthodes qui peuvent accéder et modifier l'état de l'objet auquel elles appartiennent.
Utilisez des interfaces si :
  • Vous vous attendez à ce que des classes indépendantes implémentent votre interface. Par exemple, les interfaces Comparableet Cloneablesont implémentées par de nombreuses classes indépendantes.

  • Vous souhaitez définir le comportement d'un type de données particulier, mais peu importe qui l'implémente.

  • Vous souhaitez utiliser l'héritage de plusieurs types.

9. Qu'est-ce qu'une méthode abstraite en Java ?

Une méthode abstraite est une méthode sans corps. Vous déclarez simplement une méthode sans la définir, en utilisant un mot-clé abstractdans la déclaration de la méthode. Toutes les méthodes déclarées à l'intérieur d'une interface en langage Java sont abstraites par défaut. Voici un exemple de méthode abstraite en Java :
public void abstract printVersion();
Maintenant, pour implémenter cette méthode, vous devez étendre la classe abstraite et remplacer cette méthode.

10. Une classe abstraite en Java peut-elle contenir une méthode main?

Oui, une classe abstraite en Java peut contenir une méthode main, car il s'agit simplement d'une autre méthode statique, et une classe abstraite peut être exécutée à l'aide de la méthode main, tant que vous ne l'instanciez pas. C'est tout ce que je voulais te dire. Et rappelez-vous : les classes abstraites et les interfaces sont des décisions de conception clés dans le processus d'analyse et de conception orientées objet, et doivent bien sûr être utilisées avec prudence si vous souhaitez créer un système flexible.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION