Mécanismes d'héritage en Java : sous-classes, redéfinition de méthodes, liaison dynamique.
Choisissez une approche :
Comment définir une sous-classe qui hérite d'une super-classe avec extends ?
Utiliser le mot-clé extends pour créer une classe spécialisée héritant des champs et méthodes d'une autre.
Comment écrire le constructeur d'une sous-classe en initialisant les champs hérités via super() ?
Le constructeur d'une sous-classe doit appeler super() pour déléguer l'initialisation des champs hérités.
Comment organiser une hiérarchie de classes (classe principale, transitivité) ?
L'héritage est transitif : une sous-classe hérite de sa super-classe et de toutes ses ancêtres.
Comment redéfinir une méthode héritée dans une sous-classe ?
Une sous-classe peut redéclarer une méthode héritée avec le même nom et la même signature mais un corps différent.
Comment annoter une redéfinition avec @Override pour la sécuriser ?
L'annotation @Override demande au compilateur de vérifier que la méthode redéfinit bien une méthode héritée.
Comment appeler la version de la super-classe d'une méthode redéfinie via super.m() ?
Dans une redéfinition, super.m() permet de réutiliser le comportement de la super-classe avant d'y ajouter la logique de la sous-classe.
Comment empêcher la redéfinition d'une méthode avec le mot-clé final ?
Le mot-clé final sur une méthode ou une classe interdit toute redéfinition ou spécialisation ultérieure.
Comment fonctionne la liaison dynamique (choix de la méthode à l'exécution) ?
La liaison dynamique signifie que le code exécuté lors d'un appel de méthode est déterminé par la classe principale de l'objet, pas par le type statique de la variable.
Comment définir une classe abstraite avec des méthodes abstraites ?
Une classe abstraite ne peut pas être instanciée directement ; elle sert de modèle imposant à ses sous-classes l'implémentation de certaines méthodes.
Comment définir une interface et la faire implémenter par une classe ?
Une interface déclare un contrat de méthodes abstraites ; une classe l'implémente avec implements et fournit un corps pour chaque méthode.
Comment vérifier dynamiquement si un objet est instance d'une classe avec instanceof ?
L'opérateur instanceof teste à l'exécution si un objet appartient à une classe donnée (ou à l'une de ses sous-classes).
Comment effectuer un cast entre types compatibles et gérer l'échec ?
Un cast demande au compilateur de traiter un objet comme appartenant à un type plus précis ; une ClassCastException est levée à l'exécution si l'objet est incompatible.
Comment redéfinir equals() pour tester l'égalité structurelle entre objets ?
La méthode equals() héritée de Object teste l'égalité physique (même adresse). La redéfinir permet de tester l'égalité structurelle (même contenu).
Comment contourner l'interdiction des tableaux génériques dans une classe générique ?
Java interdit E[] t = new E[n] dans une classe générique ; la solution est de déclarer Object[] et de caster à la lecture.
Comment les méthodes dynamiques sont-elles compilées via une table d'adressage (vtable) ?
Chaque classe possède une vtable qui associe un numéro à l'adresse de chaque méthode ; chaque objet pointe vers la vtable de sa classe pour permettre la liaison dynamique.
Comment compiler un appel de méthode avec adressage indirect en XVM ?
L'appel x.m() est compilé en une séquence d'instructions XVM qui récupère l'adresse du code via la vtable de l'objet.
Comment la table d'adressage d'une sous-classe étend-elle celle de la super-classe ?
La vtable d'une sous-classe conserve les offsets des méthodes héritées et ajoute les nouvelles à la suite, garantissant la compatibilité du code d'appel.