QCM : Fondamentaux de Java et objets — 64 questions

Questions et réponses du QCM

1. Quelle démarche caractérise la programmation traditionnelle lorsqu’elle traite un problème complexe ?

Elle part du problème global et le décompose en sous-problèmes élémentaires
Elle assemble des composants unitaires indépendants pour construire progressivement le système
Elle définit d’abord les interactions entre plusieurs objets coopérants
Elle regroupe les données et les traitements dans des objets autonomes

Elle part du problème global et le décompose en sous-problèmes élémentaires

Explication

La programmation traditionnelle suit une approche descendante : elle part du problème global, sépare les données des traitements et construit une solution par décomposition. L’assemblage de composants unitaires correspond plutôt à la modélisation objet.

2. Quelle caractéristique décrit le mieux une solution produite par la programmation procédurale ?

Elle reste fortement liée au problème traité et se réutilise difficilement
Elle repose sur des composants indépendants facilement adaptables à plusieurs contextes
Elle organise les abstractions selon des relations entre classes
Elle masque les traitements internes derrière une interface stable

Elle reste fortement liée au problème traité et se réutilise difficilement

Explication

Une solution procédurale est généralement liée au problème initial, peu générique et peu réutilisable, car ses différentes parties sont fortement dépendantes. Les composants indépendants et réutilisables sont plutôt recherchés en conception objet.

3. Comment la conception objet cherche-t-elle à réduire les effets imprévus et les bugs ?

En multipliant les dépendances entre traitements pour centraliser les décisions
En adaptant chaque composant à un problème particulier avant de le réemployer
En regroupant toutes les données dans une structure commune au programme
En limitant l’information partagée entre composants, puis en favorisant leur réutilisation

En limitant l’information partagée entre composants, puis en favorisant leur réutilisation

Explication

La conception objet minimise l’information partagée afin de limiter les effets imprévus, puis favorise des composants indépendants du contexte et spécialisés. Une forte dépendance entre composants augmenterait au contraire les risques de propagation des erreurs.

4. Quels éléments caractérisent un objet en programmation orientée objet ?

Une structure commune, des opérations communes et une relation d’héritage
Des attributs partagés, des méthodes de classe et une identité collective
Une interface publique, une implémentation cachée et une classe mère
Un état, un comportement et une identité qui permettent de l’identifier

Un état, un comportement et une identité qui permettent de l’identifier

Explication

Un objet possède un état, un comportement et une identité ; les termes objet et instance sont synonymes. Les opérations communes et la structure commune décrivent plutôt une classe, tandis que l’interface et l’implémentation concernent l’encapsulation.

5. Quel rôle une classe joue-t-elle par rapport aux objets ?

Elle masque l’implémentation d’un objet derrière les services de son interface
Elle définit abstraitement des objets ayant des états et des comportements similaires
Elle représente un objet concret avec une identité et des valeurs particulières
Elle crée une relation entre deux classes sans définir leurs opérations

Elle définit abstraitement des objets ayant des états et des comportements similaires

Explication

Une classe décrit abstraitement un ensemble d’objets partageant une structure, des états et des opérations similaires. Un objet concret est une instance créée à partir de cette définition, tandis que le masquage relève de l’encapsulation.

6. Quelle relation décrit correctement l’instanciation ?

Elle crée un objet à partir de la classe dont il est une instance
Elle organise une relation entre une classe générale et une classe spécialisée
Elle permet à plusieurs objets de partager une même donnée de classe
Elle masque les détails internes d’un objet derrière une interface

Elle crée un objet à partir de la classe dont il est une instance

Explication

L’instanciation est le mécanisme qui permet de créer un objet à partir de sa classe, et chaque objet est l’instance d’une seule classe. La relation entre classes générales et spécialisées relève plutôt de l’héritage.

7. Que réalise l’encapsulation dans un objet ?

Elle transforme une classe abstraite en plusieurs objets concrets
Elle permet à l’appelant de poursuivre son traitement pendant une opération
Elle partage une donnée commune entre toutes les instances d’une classe
Elle sépare les services visibles de leur réalisation interne

Elle sépare les services visibles de leur réalisation interne

Explication

L’encapsulation masque l’état et le fonctionnement interne d’un objet en distinguant l’interface, qui expose les services, de l’implémentation, qui les réalise. Le partage de données concerne les variables de classe, tandis que la poursuite de l’appelant caractérise un message asynchrone.

8. Laquelle de ces propositions énumère les caractéristiques essentielles de l’orienté objet ?

La décomposition, le séquencement, la centralisation et la compilation
L’abstraction, l’encapsulation, la modularité et la hiérarchie
L’interface, l’instanciation, l’interprétation et la spécialisation
La récursivité, l’optimisation, la synchronisation et l’héritage

L’abstraction, l’encapsulation, la modularité et la hiérarchie

Explication

Les caractéristiques essentielles de l’orienté objet sont l’abstraction, l’encapsulation, la modularité et la hiérarchie. Cette dernière organise les abstractions selon une relation de type « est une sorte de ».

9. Que représente un modèle dans une démarche de développement informatique ?

Une liste d’interfaces décrivant les services offerts par les classes
Une représentation du système à réaliser, affinée progressivement vers des éléments réalisables
Un ensemble d’algorithmes procéduraux séparant les données des traitements
Une collection d’objets exécutés par une machine virtuelle pendant le fonctionnement

Une représentation du système à réaliser, affinée progressivement vers des éléments réalisables

Explication

Un modèle représente le système informatique à réaliser et se construit par affinements successifs, depuis les éléments de la réalité jusqu’aux éléments informatiques réalisables. Les objets exécutés et les interfaces sont des éléments du système, pas la définition générale d’un modèle.

10. Quelle différence oppose la modélisation objet à la programmation procédurale dans la construction d’un système ?

La modélisation objet sépare les données des traitements, tandis que la programmation procédurale regroupe des objets autonomes
La modélisation objet part du problème global, tandis que la programmation procédurale construit des composants indépendants
La modélisation objet assemble progressivement des composants unitaires, tandis que la programmation procédurale décompose le problème
La modélisation objet organise des instructions séquentielles, tandis que la programmation procédurale définit des hiérarchies de classes

La modélisation objet assemble progressivement des composants unitaires, tandis que la programmation procédurale décompose le problème

Explication

La modélisation objet construit le système de façon ascendante par assemblage de composants unitaires, contrairement à l’approche descendante de la programmation procédurale. La décomposition du problème global caractérise précisément cette dernière approche.

11. Pourquoi un programme Java peut-il être exécuté sur différentes cibles matérielles ou logicielles ?

Parce qu’il repose sur des diagrammes UML qui adaptent automatiquement le programme
Parce qu’il est traduit en bytecode indépendant de la cible, puis interprété par une plateforme Java
Parce qu’il est exécuté sans traduction par les outils de documentation Java
Parce qu’il est compilé directement en instructions propres à chaque processeur cible

Parce qu’il est traduit en bytecode indépendant de la cible, puis interprété par une plateforme Java

Explication

Java favorise la portabilité en traduisant les programmes en bytecode indépendant de la cible, interprété par une plateforme Java. Une compilation directe vers des instructions propres à chaque processeur dépendrait au contraire de la machine visée.

12. Dans le cycle de développement Java, quel composant produit le bytecode et quel composant le charge puis l’exécute ?

L’interpréteur produit le bytecode, puis le compilateur le charge et l’exécute.
Le compilateur produit le bytecode, puis l’interpréteur le charge et l’exécute.
Le compilateur exécute le code source, puis l’interpréteur crée les fichiers source.
L’interpréteur transforme les fichiers source en classes publiques, puis le compilateur les lance.

Le compilateur produit le bytecode, puis l’interpréteur le charge et l’exécute.

Explication

Le compilateur transforme les fichiers source en fichiers .class contenant le bytecode, tandis que l’interpréteur charge dynamiquement ces classes et exécute ce bytecode. La confusion fréquente consiste à attribuer la production du bytecode à l’interpréteur.

13. Un fichier nommé `Calcul.java` contient plusieurs classes ; quelle règle doit-il respecter concernant les classes publiques ?

Il ne peut contenir aucune classe publique lorsqu’il contient plusieurs classes.
Il peut contenir une seule classe publique nommée `Calcul`.
Il peut contenir une classe publique dont le nom diffère de `Calcul`.
Il doit contenir plusieurs classes publiques portant des noms distincts.

Il peut contenir une seule classe publique nommée `Calcul`.

Explication

Un fichier Java peut contenir plusieurs classes, mais une seule peut être déclarée public et son nom doit correspondre exactement au nom du fichier sans l’extension. Le nombre de classes présentes n’interdit donc pas la présence d’une classe publique.

14. Laquelle décrit correctement une variable Java ?

C’est un fichier compilé contenant une classe et ses instructions.
C’est une entité formée d’un nom et d’un type, définie dans une classe.
C’est une méthode possédant un nom, mais pouvant changer de type.
C’est une valeur sans type, déclarée librement en dehors de toute classe.

C’est une entité formée d’un nom et d’un type, définie dans une classe.

Explication

Une variable Java associe un nom à un type et doit être définie dans une classe. Java ne permet pas de déclarer une variable globale en dehors de toute classe.

15. Dans une méthode, quelle notion désigne la portion de code pendant laquelle une variable reste accessible ?

L’initialisation de la variable
Le type déclaré de la variable
La valeur courante de la variable
La portée de la variable

La portée de la variable

Explication

La portée correspond à la zone du code où une variable est accessible ; elle peut concerner une variable locale, une variable d’instance, un paramètre de méthode ou un paramètre de gestionnaire d’exception. La valeur désigne plutôt le contenu détenu par la variable à un moment donné.

16. Quelle affirmation décrit correctement une variable Java nouvellement déclarée selon son type ?

Elle possède un nom et un type, et reçoit par défaut 0 ou null selon le contexte.
Elle reçoit toujours une chaîne vide, qu’elle soit numérique ou objet.
Elle peut être définie hors d’une classe et reçoit alors une valeur implicite.
Elle possède un type mais son nom est attribué automatiquement par le compilateur.

Elle possède un nom et un type, et reçoit par défaut 0 ou null selon le contexte.

Explication

Une variable Java est caractérisée par un nom et un type, doit être définie dans une classe et reçoit par défaut 0 pour une valeur numérique ou null pour une référence d’objet. Une chaîne vide n’est pas la valeur par défaut générale des références.

17. Une variable locale `final` est déclarée sans valeur puis initialisée une fois dans une méthode : comment la qualifier avant son initialisation ?

Une variable de classe implicite
Une variable constante déjà initialisée
Une variable blank final
Une variable ordinaire réinitialisable

Une variable blank final

Explication

Une variable locale final déclarée mais non encore initialisée est appelée blank final ; après son initialisation, sa valeur ne peut plus changer. Une variable ordinaire, contrairement à une variable final, peut être modifiée après son initialisation.

18. Quelle association entre type primitif Java et signification est correcte ?

`boolean` représente un nombre entier sur 32 bits, tandis que `char` représente une valeur décimale.
`boolean` représente un caractère Unicode, tandis que `char` représente une valeur logique.
`char` représente un caractère Unicode, tandis que `boolean` représente true ou false.
`char` représente un nombre réel sur 64 bits, tandis que `boolean` représente un entier.

`char` représente un caractère Unicode, tandis que `boolean` représente true ou false.

Explication

Le type char sert à représenter un caractère Unicode, alors que boolean représente une valeur logique pouvant être true ou false. Ces deux types ne décrivent donc pas respectivement un nombre réel et un entier.

19. Quelle construction constitue une expression Java ?

Une combinaison de variables, d’opérateurs et d’appels de méthodes qui produit une valeur.
Une structure de données fixe contenant plusieurs éléments de même type.
Un ensemble de classes publiques dont le nom correspond à celui du fichier source.
Une portion de code réservée à la déclaration des paramètres d’une exception.

Une combinaison de variables, d’opérateurs et d’appels de méthodes qui produit une valeur.

Explication

Une expression combine notamment des variables, des opérateurs et des appels de méthodes, puis s’évalue en une valeur unique. Une structure contenant des éléments homogènes correspond plutôt à la définition d’un tableau.

20. Quelle distinction entre une instruction et un bloc est correcte en Java ?

Une instruction est une unité complète souvent terminée par un point-virgule, tandis qu’un bloc regroupe des instructions entre accolades.
Une instruction contient plusieurs classes, tandis qu’un bloc contient une seule classe publique.
Une instruction représente une expression sans exécution, tandis qu’un bloc représente une variable typée.
Une instruction regroupe des lignes entre accolades, tandis qu’un bloc se termine par un point-virgule.

Une instruction est une unité complète souvent terminée par un point-virgule, tandis qu’un bloc regroupe des instructions entre accolades.

Explication

Une instruction constitue une unité d’exécution complète, généralement terminée par un point-virgule, alors qu’un bloc regroupe zéro ou plusieurs instructions entre accolades. Les accolades caractérisent donc le bloc et non l’instruction individuelle.

21. Dans l’expression Java `x == 3`, quel rôle joue l’opérateur `==` ?

Il crée une nouvelle instance de type entier.
Il vérifie que `x` appartient à une classe donnée.
Il compare la valeur de `x` à 3.
Il affecte la valeur 3 à `x`.

Il compare la valeur de `x` à 3.

Explication

L’opérateur == est un opérateur relationnel qui compare deux opérandes, ici x et 3. L’affectation utiliserait l’opérateur =, tandis que la création et le test de type relèvent respectivement de new et instanceof.

22. Quelle est la valeur de l’expression Java `1 - 2 - 3` ?

-2
4
-4
2

-4

Explication

Les soustractions de même priorité s’associent de gauche à droite : (1−2)−3=−1−3=−4(1-2)-3=-1-3=-4. Une évaluation de droite à gauche donnerait un autre résultat, mais elle ne correspond pas à la règle d’associativité de la soustraction.

23. Quelle signature correspond à la méthode d’entrée principale d’un programme Java ?

public void main(String args)
public static void main(String[] args)
static private int main(String[] args)
public static String main()

public static void main(String[] args)

Explication

La méthode main est invoquée automatiquement et doit être publique, statique, sans valeur de retour, avec un tableau de chaînes comme argument. Le mot-clé static indique qu’elle appartient à la classe, tandis que public concerne son accessibilité.

24. Quelle affirmation décrit correctement une chaîne de caractères Java ?

Elle contient des valeurs numériques, et sa taille se consulte avec count et son contenu avec valueAt.
Elle désigne une suite modifiable, dont la longueur se consulte avec capacity et les caractères avec elementAt.
Elle peut provenir d’un littéral ou d’un tableau de caractères, et ses éléments se consultent avec length et charAt.
Elle représente uniquement un tableau de caractères, et ses éléments se consultent avec size et get.

Elle peut provenir d’un littéral ou d’un tableau de caractères, et ses éléments se consultent avec length et charAt.

Explication

Une String peut être créée à partir d’un littéral ou d’un tableau de caractères ; length donne sa longueur et charAt accède à un caractère. Les autres propositions attribuent à String une origine, une mutabilité ou des méthodes qui ne correspondent pas à cette définition.

25. Quelle séquence permet correctement d’utiliser un objet Point en Java ?

Déclarer une référence suffit à créer l’objet, puis ses méthodes deviennent accessibles.
Appeler une méthode de Point crée l’objet, puis une référence peut lui être associée.
Créer une référence avec new, puis déclarer l’objet après l’appel d’une méthode.
Déclarer une référence, créer l’objet avec new, puis utiliser ses membres.

Déclarer une référence, créer l’objet avec new, puis utiliser ses membres.

Explication

L’utilisation d’un Point nécessite d’abord une référence, puis une instanciation avec new, avant l’accès aux variables ou aux méthodes. Une déclaration de référence ne réserve pas à elle seule un objet en mémoire.

26. Quel rôle une classe joue-t-elle dans la programmation orientée objet ?

Elle constitue une valeur primitive stockée directement dans une variable locale.
Elle décrit une procédure qui transforme des données sans définir de nouveau type.
Elle représente une seule instance concrète contenant ses propres valeurs d’exécution.
Elle sert de prototype définissant un type et regroupant des variables et des méthodes.

Elle sert de prototype définissant un type et regroupant des variables et des méthodes.

Explication

Une classe est un prototype d’objets qui définit un nouveau type et contient des variables et des méthodes comme membres. Une instance est un objet concret produit à partir de cette classe, et non la classe elle-même.

27. Quelle caractéristique appartient à un constructeur Java ?

Il renvoie une nouvelle valeur, porte un nom libre et ne peut être défini qu’une seule fois.
Il exécute une opération statique, porte le nom de la méthode et retourne le type de la classe.
Il initialise les variables d’instance, porte le nom de la classe et n’a pas de type de retour.
Il initialise les variables de classe, porte le nom du paquetage et accepte un type de retour.

Il initialise les variables d’instance, porte le nom de la classe et n’a pas de type de retour.

Explication

Un constructeur initialise l’état d’une instance, porte le nom de la classe et ne possède aucun type de retour ; plusieurs constructeurs peuvent être surchargés. Les méthodes ordinaires, elles, peuvent avoir un type de retour et un nom différent de celui de la classe.

28. Que se passe-t-il lorsqu’une classe définit un constructeur explicite ?

Le constructeur fourni automatiquement par Java n’est plus ajouté par défaut.
Le constructeur explicite est ignoré et seul le constructeur automatique reste disponible.
Java ajoute malgré tout un constructeur sans argument en complément de celui qui est défini.
La classe ne peut plus être instanciée avec aucun constructeur, même si celui-ci est accessible.

Le constructeur fourni automatiquement par Java n’est plus ajouté par défaut.

Explication

Java fournit un constructeur par défaut lorsqu’aucun constructeur n’est défini. Dès qu’un constructeur explicite apparaît, ce comportement automatique disparaît ; il faut donc déclarer séparément un constructeur sans argument si nécessaire.

29. Comment les variables d’instance et les variables de classe se répartissent-elles entre les objets ?

Toutes les variables d’instance sont partagées, tandis que chaque objet possède sa copie des variables de classe.
Chaque objet possède une copie de toutes les variables, qu’elles soient d’instance ou de classe.
Les variables d’instance appartiennent à la classe, tandis que les variables de classe appartiennent aux méthodes.
Chaque objet possède sa copie des variables d’instance, tandis qu’une variable de classe est partagée par les instances.

Chaque objet possède sa copie des variables d’instance, tandis qu’une variable de classe est partagée par les instances.

Explication

Une variable d’instance est propre à chaque objet, alors qu’une variable de classe est commune aux instances de cette classe. Confondre ces deux catégories inverse précisément leur mode de stockage et de partage.

30. Que signifient respectivement static et final lorsqu’ils qualifient un membre Java ?

static indique une méthode d’instance, tandis que final rend une variable accessible depuis toutes les classes.
static indique un membre partagé de la classe, tandis que final empêche la modification de sa valeur.
static désigne une variable propre à chaque objet, tandis que final autorise plusieurs changements contrôlés.
static empêche la modification d’un membre, tandis que final indique qu’il est partagé par les instances.

static indique un membre partagé de la classe, tandis que final empêche la modification de sa valeur.

Explication

Le mot-clé static associe le membre à la classe plutôt qu’à chaque objet, tandis que final interdit de modifier sa valeur après son initialisation. Ces mots-clés décrivent donc deux propriétés différentes, et non deux formes de partage.

31. Lorsqu’une méthode reçoit une référence vers un objet, quelle modification peut-elle effectuer ?

Elle peut remplacer la référence de l’appelant, mais les données de l’objet restent protégées contre toute modification.
Elle peut modifier les données de l’objet, mais elle ne peut pas remplacer la référence détenue par l’appelant.
Elle peut modifier à la fois les données de l’objet et la référence originale transmise par l’appelant.
Elle ne peut modifier ni les données de l’objet ni la référence reçue par la méthode appelée.

Elle peut modifier les données de l’objet, mais elle ne peut pas remplacer la référence détenue par l’appelant.

Explication

Les arguments Java sont passés par valeur : la méthode reçoit une copie de la référence, qui permet d’atteindre et de modifier l’objet, mais pas de changer la référence originale. La réaffectation de cette copie ne modifie donc pas la variable de l’appelant.

32. Quelle distinction décrit correctement String et StringBuffer ?

String représente des caractères numériques, tandis que StringBuffer représente des caractères alphabétiques.
String convient aux chaînes dont la valeur ne change pas, tandis que StringBuffer convient aux chaînes modifiables.
String convient aux chaînes modifiables, tandis que StringBuffer conserve une valeur qui ne change pas.
String sert aux variables de classe, tandis que StringBuffer sert aux variables d’instance modifiables.

String convient aux chaînes dont la valeur ne change pas, tandis que StringBuffer convient aux chaînes modifiables.

Explication

String est destinée aux séquences de caractères immuables, alors que StringBuffer est conçue pour les séquences dont le contenu peut être modifié. La distinction repose donc sur la mutabilité, et non sur la portée ou la nature des caractères.

33. Quel avantage majeur l’héritage apporte-t-il dans la conception d’un programme ?

Il favorise la réutilisation de code existant et facilite la maintenance.
Il empêche l’évolution du programme lorsque de nouvelles classes apparaissent.
Il impose une organisation indépendante des bibliothèques utilisées.
Il remplace la modélisation par une description détaillée de chaque objet.

Il favorise la réutilisation de code existant et facilite la maintenance.

Explication

L’héritage permet de réutiliser du code existant, de s’appuyer sur des bibliothèques stables et de faciliter la maintenance. Il ne remplace pas la modélisation et ne bloque pas l’évolution du programme.

34. À quel moment l’héritage est-il généralement envisagé lors d’une modélisation ?

Lorsque des composants indépendants doivent être assemblés sans relation de parenté.
Avant d’identifier les classes et leurs responsabilités dans le problème étudié.
Après avoir supprimé les attributs communs pour distinguer chaque classe.
Après avoir repéré des classes partageant des fonctionnements ou des services semblables.

Après avoir repéré des classes partageant des fonctionnements ou des services semblables.

Explication

L’héritage est généralement introduit après le début de la modélisation, quand des ressemblances permettent de factoriser des attributs ou des méthodes. Le choisir avant l’analyse des classes ou pour assembler des composants correspond à une autre démarche.

35. Deux classes possèdent plusieurs services semblables et certains attributs communs. Quelle utilisation de l’héritage est la plus appropriée ?

Dupliquer leurs services afin que chaque classe conserve une implémentation séparée.
Créer une classe commune qui factorise leurs attributs et leurs méthodes partagés.
Supprimer leurs attributs communs pour éviter toute relation entre les classes.
Assembler leurs instances comme des composants indépendants dans une troisième classe.

Créer une classe commune qui factorise leurs attributs et leurs méthodes partagés.

Explication

Dans cette situation, l’héritage peut factoriser les éléments communs dans une classe générale. L’assemblage de composants relève plutôt de la composition, tandis que la duplication ou la suppression des éléments communs ne réalise pas cette factorisation.

36. Laquelle de ces affirmations décrit correctement l’héritage direct en Java ?

Une classe peut former un cycle avec ses ancêtres si les méthodes restent compatibles.
Une classe ne possède aucune superclasse implicite lorsqu’elle n’en déclare pas explicitement.
Une classe hérite directement de plusieurs classes et choisit ensuite sa classe principale.
Une classe hérite directement d’une seule classe et reçoit par défaut Object comme superclasse.

Une classe hérite directement d’une seule classe et reçoit par défaut Object comme superclasse.

Explication

En Java, une classe possède une seule superclasse directe, hérite par défaut de Object et ne peut appartenir à un cycle d’héritage. Les autres propositions contredisent ces contraintes structurelles.

37. Que signifie la généralisation dans une hiérarchie de classes ?

Rechercher une méthode dans les superclasses lorsqu’elle manque dans la classe de l’objet.
Assembler plusieurs composants existants afin de former une nouvelle classe composite.
Factoriser les propriétés communes de plusieurs classes dans une classe plus générale.
Ajouter des comportements propres à une classe déjà définie pour la rendre plus spécialisée.

Factoriser les propriétés communes de plusieurs classes dans une classe plus générale.

Explication

La généralisation regroupe les propriétés communes de plusieurs classes dans une classe générale dont elles héritent. L’ajout de comportements propres décrit la spécialisation, tandis que la recherche d’une méthode et l’assemblage concernent d’autres mécanismes.

38. Quelle opération correspond à une spécialisation de classe ?

Rechercher une implémentation dans la classe de l’objet avant ses ancêtres.
Regrouper les propriétés communes de plusieurs classes dans une classe générale.
Déclarer plusieurs superclasses directes pour représenter des rôles différents.
Dériver une nouvelle classe en lui ajoutant des propriétés ou des comportements propres.

Dériver une nouvelle classe en lui ajoutant des propriétés ou des comportements propres.

Explication

La spécialisation dérive une nouvelle classe en l’enrichissant de propriétés ou de comportements propres, ou en modifiant un comportement existant. Le regroupement des caractéristiques communes relève de la généralisation.

39. Dans quel cas peut-on dire qu’une classe D hérite d’une classe B ?

Lorsque D est une sorte de B et que les vérités applicables à B le restent pour D.
Lorsque B utilise D comme composant sans que D possède une relation de parenté avec B.
Lorsque B est créée après D et reçoit automatiquement toutes les méthodes de D.
Lorsque D et B ont des noms différents mais ne partagent aucune propriété vérifiable.

Lorsque D est une sorte de B et que les vérités applicables à B le restent pour D.

Explication

La relation d’héritage est pertinente si D constitue une sorte de B, de manière que ce qui est vrai pour B le soit aussi pour D. Une simple utilisation comme composant ou une différence de nom ne suffit pas à établir cette relation.

40. Lorsqu’une méthode est invoquée sur un objet Java, dans quel ordre sa définition est-elle recherchée ?

Java commence par la superclasse la plus éloignée, puis descend vers la classe concrète de l’objet.
Java recherche d’abord dans les classes utilisées comme composants, puis dans la hiérarchie d’héritage.
Java examine toutes les classes de la hiérarchie en parallèle avant de sélectionner une méthode adaptée.
Java cherche d’abord dans la classe de l’objet, puis remonte ses superclasses jusqu’à trouver une méthode adaptée.

Java cherche d’abord dans la classe de l’objet, puis remonte ses superclasses jusqu’à trouver une méthode adaptée.

Explication

La recherche commence dans la classe de l’objet, puis remonte de superclasse en superclasse jusqu’à la première méthode qui convient. Elle ne commence donc ni par l’ancêtre le plus éloigné ni par les classes composantes.

41. Quelle distinction décrit correctement la surcharge et la redéfinition en Java ?

La surcharge modifie le type de retour, tandis que la redéfinition modifie le nom de la méthode.
La surcharge garde le nom avec des signatures différentes, tandis que la redéfinition reprend la même signature héritée.
La surcharge reprend la signature héritée, tandis que la redéfinition change le nombre de paramètres.
La surcharge concerne les sous-classes, tandis que la redéfinition concerne les méthodes d’une même classe.

La surcharge garde le nom avec des signatures différentes, tandis que la redéfinition reprend la même signature héritée.

Explication

La surcharge regroupe plusieurs méthodes de même nom dont les signatures diffèrent, alors que la redéfinition remplace une méthode héritée avec la même signature. Confondre ces notions revient à attribuer à la redéfinition le changement de paramètres propre à la surcharge.

42. Une sous-classe redéfinit une méthode héritée : quelle modification respecte les règles de Java ?

Conserver le nom et les paramètres, mais remplacer le type de résultat par un type arbitraire.
Conserver le nom, la signature et le type de résultat, avec un accès plus large ou identique.
Garder le type de résultat, mais modifier le nombre de paramètres pour préciser le comportement.
Conserver la signature, mais rendre la méthode moins accessible dans la sous-classe.

Conserver le nom, la signature et le type de résultat, avec un accès plus large ou identique.

Explication

Une méthode redéfinie conserve le nom, le type de résultat et la totalité des paramètres, tandis que son accès doit être identique ou moins restrictif. Rendre l’accès plus restrictif ou changer les paramètres empêcherait une véritable redéfinition.

43. Quelle affirmation décrit correctement la visibilité des membres protected et private ?

Un membre protected est accessible à toutes les classes, tandis qu’un membre private est visible dans le package.
Un membre protected et un membre private offrent la même visibilité aux classes dérivées.
Un membre protected est accessible aux sous-classes et au package, tandis qu’un membre private reste limité à sa classe.
Un membre protected est limité à sa classe, tandis qu’un membre private est accessible aux sous-classes du package.

Un membre protected est accessible aux sous-classes et au package, tandis qu’un membre private reste limité à sa classe.

Explication

La visibilité protected inclut les sous-classes et les classes du même package, alors que private reste confinée à la classe qui déclare le membre. Dire que private est accessible aux sous-classes confond cette visibilité avec celle de protected.

44. Lors de la construction d’un objet d’une sous-classe, quelle initialisation intervient en premier ?

Les deux constructeurs initialisent simultanément leurs attributs selon l’ordre d’écriture des champs.
Le constructeur de la sous-classe choisit entre l’appel de la superclasse et l’initialisation de ses attributs.
Le constructeur de la superclasse initialise d’abord les attributs hérités, puis celui de la sous-classe initialise ses propres attributs.
Le constructeur de la sous-classe initialise d’abord ses attributs, puis celui de la superclasse traite les attributs hérités.

Le constructeur de la superclasse initialise d’abord les attributs hérités, puis celui de la sous-classe initialise ses propres attributs.

Explication

Le constructeur de la sous-classe doit appeler en premier celui de la superclasse, afin d’initialiser la partie héritée de l’objet. L’initialisation des attributs propres à la sous-classe intervient ensuite.

45. Une variable de type Vehicule référence une instance de Voiture, sous-classe de Vehicule : quelle utilisation est directement autorisée ?

Affecter une instance de Vehicule à une variable Voiture sans conversion, car les classes appartiennent à la même hiérarchie.
Utiliser cette instance comme une Voiture dans toute situation, tandis que Vehicule exige une conversion explicite.
Utiliser cette instance comme un Vehicule, tandis que l’usage inverse nécessite une conversion explicite.
Interdire l’affectation entre Vehicule et Voiture, car le principe de substitution ne concerne pas les références.

Utiliser cette instance comme un Vehicule, tandis que l’usage inverse nécessite une conversion explicite.

Explication

Le principe de substitution permet d’employer une instance de sous-classe là où une instance de superclasse est attendue. La conversion inverse, d’une superclasse vers une sous-classe, doit être demandée explicitement et peut être inappropriée.

46. Pourquoi deux objets d’une même hiérarchie peuvent-ils répondre différemment au même appel de méthode ?

Le polymorphisme impose le comportement de la superclasse, même lorsque l’objet réel appartient à une sous-classe.
Le polymorphisme change le nom de la méthode appelée afin d’adapter automatiquement le message à chaque sous-classe.
Le polymorphisme exige une méthode différente dans le code appelant pour chaque classe possible.
Le polymorphisme conserve le même message d’appel, mais sélectionne un comportement selon la classe réelle de l’objet.

Le polymorphisme conserve le même message d’appel, mais sélectionne un comportement selon la classe réelle de l’objet.

Explication

Le polymorphisme permet d’envoyer une même opération à des objets d’une hiérarchie tout en exécutant un comportement adapté à leur classe réelle. Il ne demande donc pas de modifier le message ni de multiplier le code appelant.

47. Quel rôle une interface joue-t-elle principalement en Java ?

Elle définit un contrat d’opérations que les classes doivent fournir sans imposer leur implémentation complète.
Elle remplace une classe concrète en imposant une seule implémentation identique à ses utilisatrices.
Elle stocke l’état détaillé des objets et fournit un constructeur commun à toutes les classes.
Elle crée une instance partageable dont les méthodes sont exécutées sans classe implémentante.

Elle définit un contrat d’opérations que les classes doivent fournir sans imposer leur implémentation complète.

Explication

Une interface spécifie des opérations et sert de contrat de service pour les classes qui l’implémentent, sans fournir leur implémentation complète. Elle ne joue donc pas le rôle d’un objet doté d’un état et d’un constructeur.

48. Quelle déclaration respecte les règles de l’héritage multiple en Java ?

Une classe étend une classe ou une interface, mais ne peut pas combiner ces deux formes d’héritage.
Une classe étend plusieurs classes et implémente une interface pour compléter leurs comportements.
Une classe étend une seule classe et implémente plusieurs interfaces selon les contrats dont elle a besoin.
Une classe étend plusieurs classes et plusieurs interfaces, afin de réunir tous les membres hérités.

Une classe étend une seule classe et implémente plusieurs interfaces selon les contrats dont elle a besoin.

Explication

Java interdit qu’une classe étende plusieurs classes, mais autorise l’extension d’une classe accompagnée de l’implémentation de plusieurs interfaces. Les propositions autorisant plusieurs superclasses contredisent cette règle.

49. Quelle est la place de la classe Object dans la hiérarchie des objets Java ?

Elle définit les opérations propres aux collections, sans fournir de comportement général aux autres objets.
Elle sert de classe mère aux seules classes abstraites et exclut les classes concrètes de la hiérarchie.
Elle constitue la classe de base de toute la hiérarchie et fournit l’état ainsi que le comportement fondamentaux des objets.
Elle représente une classe utilitaire que les développeurs doivent étendre explicitement pour obtenir un objet Java.

Elle constitue la classe de base de toute la hiérarchie et fournit l’état ainsi que le comportement fondamentaux des objets.

Explication

Object est la classe racine de la hiérarchie Java et définit les caractéristiques de base communes aux objets. Une classe Java n’a pas besoin d’être déclarée explicitement comme sous-classe pour appartenir à cette hiérarchie.

50. Comment la méthode equals héritée de Object compare-t-elle par défaut deux références ?

Elle compare leurs chaînes produites par toString afin de déterminer si leurs contenus sont équivalents.
Elle utilise leur hashcode pour établir une égalité fondée sur les valeurs calculées.
Elle les considère égales lorsqu’elles désignent le même objet, mais elle peut être redéfinie pour comparer leur contenu.
Elle les considère égales lorsque leurs attributs ont les mêmes valeurs, sans tenir compte de leur identité.

Elle les considère égales lorsqu’elles désignent le même objet, mais elle peut être redéfinie pour comparer leur contenu.

Explication

L’implémentation de equals dans Object repose sur l’identité : deux références sont égales lorsqu’elles désignent le même objet. Une classe peut redéfinir cette méthode pour adopter une comparaison fondée sur le contenu.

51. Quelle procédure respecte les conditions du clonage avec la méthode clone en Java ?

Implémenter Cloneable et créer la copie en appelant super.clone plutôt qu’en invoquant new ou un constructeur.
Implémenter Serializable et reconstruire la copie avec new afin de recopier les attributs de l’objet initial.
Déclarer la classe abstraite et créer la copie avec un constructeur recevant l’objet original comme argument.
Redéfinir toString et appeler cette méthode pour transformer la représentation textuelle en nouvel objet.

Implémenter Cloneable et créer la copie en appelant super.clone plutôt qu’en invoquant new ou un constructeur.

Explication

Le clonage décrit repose sur l’implémentation de Cloneable et sur l’appel à super.clone, qui crée un objet à partir de l’instance existante. Un constructeur ou new correspond à une création explicite différente du mécanisme demandé.

52. Quelle affirmation distingue correctement une classe finale d’une méthode finale ?

Une classe finale impose une seule instance, tandis qu’une méthode finale empêche la surcharge dans toutes les classes.
Une classe finale ne peut pas être étendue, tandis qu’une méthode finale ne peut pas être redéfinie par une sous-classe.
Une classe finale ne peut pas être instanciée, tandis qu’une méthode finale ne peut pas être appelée depuis une sous-classe.
Une classe finale ne peut pas contenir de méthodes redéfinies, tandis qu’une méthode finale doit appartenir à une classe abstraite.

Une classe finale ne peut pas être étendue, tandis qu’une méthode finale ne peut pas être redéfinie par une sous-classe.

Explication

Le modificateur final appliqué à une classe interdit la création de sous-classes, tandis qu’il interdit la redéfinition lorsqu’il s’applique à une méthode. Il ne rend pas la classe abstraite et ne limite pas l’instanciation à une seule occurrence.

53. Quel rôle principal une interface joue-t-elle en Java ?

Elle définit un contrat de service qu’une classe peut implémenter
Elle stocke l’état privé partagé par toutes les classes dérivées
Elle remplace une classe concrète dans toutes les opérations d’instanciation
Elle exécute automatiquement les méthodes avant la création des objets

Elle définit un contrat de service qu’une classe peut implémenter

Explication

Une interface définit un contrat de service contenant notamment des déclarations de méthodes et des constantes implicitement publiques, statiques et finales. Elle ne constitue pas un espace destiné à stocker l’état privé partagé des objets.

54. Que doit faire une classe qui implémente une interface comportant des méthodes abstraites ?

Déclarer toutes ces méthodes comme statiques dans la classe concrète
Créer une instance distincte de l’interface pour chaque méthode déclarée
Recopier les constantes de l’interface dans une nouvelle interface dérivée
Implémenter ces méthodes ou hériter de leur implémentation depuis une superclasse

Implémenter ces méthodes ou hériter de leur implémentation depuis une superclasse

Explication

La classe doit fournir une implémentation pour chaque méthode déclarée ou en hériter depuis une superclasse. La déclaration de méthodes statiques ne satisfait pas cette obligation d’implémentation.

55. Pourquoi Java 8 a-t-il introduit les méthodes default dans les interfaces ?

Pour transformer automatiquement chaque interface en classe instanciable avec un constructeur public
Pour rendre toutes les méthodes d’interface privées et invisibles aux classes implémentantes
Pour permettre l’évolution des interfaces sans imposer une implémentation explicite à chaque classe existante
Pour remplacer les méthodes abstraites par des champs modifiables communs aux objets

Pour permettre l’évolution des interfaces sans imposer une implémentation explicite à chaque classe existante

Explication

Une méthode default fournit une implémentation que les classes existantes peuvent hériter lorsqu’une interface évolue. Elle ne transforme pas l’interface en classe instanciable et ne remplace pas toutes ses méthodes abstraites.

56. Comment une classe peut-elle résoudre un conflit entre deux méthodes default héritées de deux interfaces ?

Elle supprime l’une des interfaces de la déclaration sans modifier la classe
Elle laisse le compilateur sélectionner l’interface située alphabétiquement en premier
Elle redéfinit la méthode et appelle explicitement l’implémentation choisie avec Interface.super.methode()
Elle convertit les deux méthodes default en méthodes static avant la compilation

Elle redéfinit la méthode et appelle explicitement l’implémentation choisie avec Interface.super.methode()

Explication

Lorsque deux méthodes default concurrentes créent une ambiguïté, la classe doit redéfinir la méthode et peut sélectionner une implémentation avec la syntaxe Interface.super.methode(). Une méthode default unique, en revanche, peut être héritée sans ce conflit.

57. Qu’est-ce qu’une expression lambda en Java ?

Une instruction de contrôle qui interrompt l’exécution d’une boucle imbriquée
Une classe abstraite possédant plusieurs méthodes obligatoirement publiques
Une fonction anonyme servant de raccourci pour une interface fonctionnelle
Une constante nommée destinée à conserver une référence vers un objet partagé

Une fonction anonyme servant de raccourci pour une interface fonctionnelle

Explication

Une lambda est une fonction anonyme utilisée comme raccourci syntaxique pour une interface fonctionnelle, qui possède une seule méthode abstraite. Elle n’est ni une classe abstraite ni une instruction de contrôle.

58. Quelle forme générale représente la syntaxe d’une expression lambda ?

(parameˋtres)→corps\text{(paramètres)} \to \text{corps}
type  nomVariable=valeur\text{type} \; \text{nomVariable} = \text{valeur}
nomClasse::nomMethode\text{nomClasse} :: \text{nomMethode}
package  nomClasse  extends  type\text{package} \; \text{nomClasse} \; \text{extends} \; \text{type}

$$\text{(paramètres)} \to \text{corps}$$

Explication

La syntaxe générale d’une lambda associe une liste de paramètres à un corps au moyen de la flèche, soit (parameˋtres)→corps\text{(paramètres)} \to \text{corps}. La notation avec deux-points désigne une référence de méthode, et non une lambda.

59. Dans quel cas les parenthèses peuvent-elles être omises autour des paramètres d’une lambda ?

Lorsqu’elle utilise un bloc comportant plusieurs instructions entre accolades
Lorsqu’elle possède un seul paramètre dont le type est inféré
Lorsqu’elle possède plusieurs paramètres dont les types sont explicitement écrits
Lorsqu’elle ne possède aucun paramètre et retourne une valeur calculée

Lorsqu’elle possède un seul paramètre dont le type est inféré

Explication

Pour une lambda à un seul paramètre dont le type est inféré, les parenthèses sont facultatives. Elles restent nécessaires lorsque plusieurs paramètres sont présents ou lorsque la syntaxe exige de préciser les types.

60. Quelle association entre une interface fonctionnelle et sa méthode est correcte ?

Predicate fournit une instance avec get sans produire de résultat logique
Function transforme une valeur avec apply et en retourne une nouvelle
Consumer teste une condition avec test et retourne un booléen
Supplier effectue une action avec accept sans retourner de valeur

Function transforme une valeur avec apply et en retourne une nouvelle

Explication

Function utilise apply pour transformer une valeur et retourner un résultat. Predicate utilise test pour produire un booléen, Supplier utilise get pour fournir une instance et Consumer utilise accept pour effectuer une action sans retour.

61. Que permet une référence de méthode en Java ?

Elle convertit automatiquement toute méthode d’instance en méthode statique publique
Elle remplace l’opérateur d’affectation lors de l’initialisation des variables locales
Elle fournit une syntaxe simplifiée pour utiliser une méthode ou un constructeur dans une interface fonctionnelle
Elle impose la création d’une nouvelle classe abstraite pour chaque méthode appelée

Elle fournit une syntaxe simplifiée pour utiliser une méthode ou un constructeur dans une interface fonctionnelle

Explication

Une référence de méthode simplifie l’utilisation d’une méthode ou d’un constructeur dans le contexte d’une interface fonctionnelle et emploie l’opérateur ::. Elle ne transforme pas les méthodes d’instance en méthodes statiques.

62. Quelle notation désigne un constructeur dans une référence de méthode ?

constructeur−>NomClasse\text{constructeur} -> \text{NomClasse}
NomClasse::create\text{NomClasse} :: \text{create}
NomClasse::new\text{NomClasse} :: \text{new}
objet::new\text{objet} :: \text{new}

$$\text{NomClasse} :: \text{new}$$

Explication

La notation NomClasse::new\text{NomClasse} :: \text{new} désigne un constructeur. La forme NomClasse::nomMethode\text{NomClasse} :: \text{nomMethode} peut, selon le contexte, désigner une méthode statique ou une méthode d’un objet arbitraire.

63. Après une instruction d’importation, quel nom une classe peut-elle utiliser pour désigner directement un élément importé ?

Le nom court de l’élément au lieu de son chemin complet
Le nom du répertoire racine contenant l’ensemble des packages
Le nom du package parent suivi d’un point et d’un astérisque
Le nom du fichier compilé accompagné de l’extension .class

Le nom court de l’élément au lieu de son chemin complet

Explication

Une importation permet d’utiliser directement le nom court de l’élément importé plutôt que son chemin complet. Elle ne remplace pas le nom de l’élément par celui du fichier compilé ou du répertoire racine.

64. Que produit le compilateur Java pour chaque classe définie lors de la compilation ?

Un fichier de configuration contenant les paramètres d’instanciation de chaque objet
Un fichier .java supplémentaire placé dans le répertoire du package parent
Un fichier d’interface contenant les méthodes publiques de la classe compilée
Un fichier .class placé dans une arborescence correspondant au package

Un fichier .class placé dans une arborescence correspondant au package

Explication

La compilation crée un fichier .class pour chaque classe définie et le place dans une arborescence correspondant au package. Le fichier .java est le fichier source, tandis que le fichier .class contient le résultat compilé.

Révisez avec les flashcards

Mémorisez les réponses avec 85 flashcards sur Fondamentaux de Java et objets.

Comment la programmation traditionnelle décompose-t-elle un problème ?

Elle le décompose en sous-problèmes élémentaires selon une approche descendante.

Que sépare la programmation traditionnelle dans son approche ?

Elle sépare les données des traitements.

Comment la programmation traditionnelle assemble-t-elle les structures de données ?

Elle les assemble avec des algorithmes.

Voir les flashcards →

Approfondir avec la fiche

Consultez la fiche de révision complète sur Fondamentaux de Java et objets.

Voir la fiche →

Cours similaires

Crée tes propres QCM

Importe ton cours et l'IA génère des QCM avec corrections en 30 secondes.

Générateur de QCM