Menu
Coddy logo textTech

L'opérateur instanceof

Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 31 sur 87.

La leçon précédente a montré qu'une conversion descendante peut échouer avec une ClassCastException si l'objet n'est pas réellement du type vers lequel vous effectuez la conversion. L'opérateur instanceof résout ce problème en vous permettant de vérifier le type d'un objet avant d'effectuer la conversion.

La syntaxe est simple : object instanceof ClassName renvoie true si l’objet est une instance de cette classe (ou de l’une de ses sous-classes) :

Animal animal = new Dog();

if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.bark();  // Sûr d'appeler les méthodes spécifiques à Dog
}

Cette vérification empêche les erreurs d’exécution en garantissant que la conversion réussira. L’opérateur renvoie également true pour les types parents dans la hiérarchie :

Dog dog = new Dog();
System.out.println(dog instanceof Dog);     // true
System.out.println(dog instanceof Animal);  // true
System.out.println(dog instanceof Object);  // true

Depuis Java 16, vous pouvez combiner la vérification et la conversion en une seule étape à l’aide de l’appariement de motifs :

if (animal instanceof Dog dog) {
    dog.bark();  // 'dog' est déjà casté et prêt à être utilisé
}

Cette syntaxe plus claire élimine la ligne de conversion distincte. Notez que instanceof renvoie false lorsqu’il est testé avec null, vous n’avez donc pas besoin d’une vérification distincte de la valeur nulle.

challenge icon

Défi

Facile

Construisons un système d’inspection de véhicules qui utilise l’opérateur instanceof pour identifier et gérer en toute sécurité différents types de véhicules. Vous allez créer une hiérarchie de véhicules et écrire du code qui vérifie le type réel de chaque véhicule avant d’accéder à ses fonctionnalités spécialisées.

Vous organiserez votre code sur quatre fichiers :

  • Vehicle.java : Créez la classe de base que tous les véhicules partagent. Chaque véhicule possède un champ model (String). Ajoutez un constructeur pour l’initialiser, une méthode getter getModel(), ainsi qu’une méthode inspect() qui affiche : Inspecting vehicle: [model]
  • Car.java : Créez une classe qui étend Vehicle. Les voitures possèdent un champ supplémentaire numDoors (int). Utilisez super pour l’initialisation du parent. Ajoutez une méthode checkDoors() qui affiche : [model] has [numDoors] doors
  • Motorcycle.java : Créez une autre classe qui étend Vehicle. Les motos possèdent un champ hasSidecar (boolean). Ajoutez une méthode checkSidecar() qui affiche soit [model] has a sidecar, soit [model] has no sidecar selon la valeur booléenne.
  • Main.java : C’est ici que instanceof devient essentiel ! Vous recevrez quatre entrées : le modèle d’une voiture, le nombre de portes, le modèle d’une moto et l’indication de la présence d’un side-car (true/false).

    Créez un tableau de références Vehicle contenant une Car et une Motorcycle. Parcourez ensuite le tableau et, pour chaque véhicule :

    • Appelez la méthode de base inspect()
    • Utilisez instanceof pour vérifier s’il s’agit d’une Car — si c’est le cas, effectuez une conversion descendante sûre et appelez checkDoors()
    • Utilisez instanceof pour vérifier s’il s’agit d’une Motorcycle — si c’est le cas, effectuez une conversion descendante sûre et appelez checkSidecar()

Vous recevrez quatre entrées : le modèle de la voiture (String), le nombre de portes (int), le modèle de la moto (String) et has sidecar (boolean).

Votre sortie doit afficher quatre lignes : pour chaque véhicule, vous verrez son message d’inspection suivi de la vérification spécifique à son type. L’opérateur instanceof garantit que vous appelez uniquement les méthodes de Car sur de véritables Car et les méthodes de Motorcycle sur de véritables Motorcycle, ce qui évite toute ClassCastException !

Essayez vous-même

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lire les entrées
        String carModel = scanner.nextLine();
        int numDoors = Integer.parseInt(scanner.nextLine());
        String motorcycleModel = scanner.nextLine();
        boolean hasSidecar = Boolean.parseBoolean(scanner.nextLine());
        
        // TODO: Créer un objet Car avec carModel et numDoors
        
        // TODO: Créer un objet Motorcycle avec motorcycleModel et hasSidecar
        
        // TODO: Créer un tableau de références Vehicle contenant le Car et le Motorcycle
        
        // TODO: Parcourir le tableau et pour chaque véhicule :
        // 1. Appeler la méthode inspect()
        // 2. Utiliser instanceof pour vérifier si c'est un Car, puis faire un downcast et appeler checkDoors()
        // 3. Utiliser instanceof pour vérifier si c'est un Motorcycle, puis faire un downcast et appeler checkSidecar()
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Java en ligne