Test & QCM MétierTutoriel Java

Héritage et Polymorphisme en Java : Exercices Corrigés

L’héritage et le polymorphisme sont deux concepts fondamentaux de la programmation orientée objet (POO). En Java, ils permettent de créer des programmes modulaires, réutilisables et maintenables. Cet article explore ces concepts à travers des explications détaillées et des exercices corrigés.

Héritage en Java

L’héritage en java permet à une classe de hériter des propriétés et des méthodes d’une autre classe. La classe qui hérite est appelée sous-classe (ou classe dérivée) et la classe dont elle hérite est appelée super-classe (ou classe de base).

Exemple de code

class Animal {
    void manger() {
        System.out.println("L'animal mange");
    }
}

class Chien extends Animal {
    void aboyer() {
        System.out.println("Le chien aboie");
    }
}

public class TestHéritage {
    public static void main(String[] args) {
        Chien chien = new Chien();
        chien.manger(); // Appel de la méthode héritée
        chien.aboyer(); // Appel de la méthode spécifique
    }
}
Polymorphisme en Java

Le polymorphisme en Java permet à une même méthode de se comporter différemment selon l’objet qui l’appelle. En Java, cela est réalisé principalement par deux mécanismes : la surcharge de méthode et la redéfinition de méthode.

Exemple de code

class Animal {
    void faireDuBruit() {
        System.out.println("L'animal fait du bruit");
    }
}

class Chat extends Animal {
    @Override
    void faireDuBruit() {
        System.out.println("Le chat miaule");
    }
}

class Chien extends Animal {
    @Override
    void faireDuBruit() {
        System.out.println("Le chien aboie");
    }
}

public class TestPolymorphisme {
    public static void main(String[] args) {
        Animal monAnimal;

        monAnimal = new Chat();
        monAnimal.faireDuBruit(); // Appelle la méthode du Chat

        monAnimal = new Chien();
        monAnimal.faireDuBruit(); // Appelle la méthode du Chien
    }
}
Exercices Corrigés

Exercice 1 : Héritage de base

Énoncé : Créez une super-classe Personne avec des propriétés comme nom et âge, et une méthode sePrésenter(). Créez une sous-classe Étudiant qui ajoute une propriété numéroÉtudiant et redéfinit la méthode sePrésenter() pour inclure le numéro étudiant.

Solution :

class Personne {
    String nom;
    int âge;

    Personne(String nom, int âge) {
        this.nom = nom;
        this.âge = âge;
    }

    void sePrésenter() {
        System.out.println("Je m'appelle " + nom + " et j'ai " + âge + " ans.");
    }
}

class Étudiant extends Personne {
    String numéroÉtudiant;

    Étudiant(String nom, int âge, String numéroÉtudiant) {
        super(nom, âge);
        this.numéroÉtudiant = numéroÉtudiant;
    }

    @Override
    void sePrésenter() {
        super.sePrésenter();
        System.out.println("Mon numéro étudiant est " + numéroÉtudiant + ".");
    }
}

public class TestHéritageExercice {
    public static void main(String[] args) {
        Étudiant étudiant = new Étudiant("Alice", 21, "123456");
        étudiant.sePrésenter();
    }
}
Exercice 2 : Polymorphisme

Énoncé : Créez une classe Employé avec une méthode travailler(). Créez deux sous-classes Développeur et Designer qui redéfinissent la méthode travailler() pour décrire le travail spécifique de chaque type d’employé. Utilisez le polymorphisme pour appeler la méthode travailler() sur une instance d’Employé.

Solution :

class Employé {
    void travailler() {
        System.out.println("L'employé travaille");
    }
}

class Développeur extends Employé {
    @Override
    void travailler() {
        System.out.println("Le développeur écrit du code");
    }
}

class Designer extends Employé {
    @Override
    void travailler() {
        System.out.println("Le designer crée des maquettes");
    }
}

public class TestPolymorphismeExercice {
    public static void main(String[] args) {
        Employé monEmployé;

        monEmployé = new Développeur();
        monEmployé.travailler();

        monEmployé = new Designer();
        monEmployé.travailler();
    }
}

Conclusion

L’héritage et le polymorphisme sont essentiels pour créer des applications Java modulaires et réutilisables. En comprenant et en pratiquant ces concepts à travers des exercices, les développeurs peuvent écrire du code plus efficace et plus facile à maintenir. Les exemples et exercices présentés ici devraient servir de base pour explorer davantage ces concepts fondamentaux de la POO.

Exercices Avancés : Héritage et Polymorphisme en Java avec des Cas Particuliers

Les exercices suivants visent à approfondir la compréhension de l’héritage et du polymorphisme en Java, en introduisant des cas particuliers et des scénarios réels. Ces exercices couvrent des concepts avancés tels que les classes abstraites, les interfaces, les méthodes génériques, et la composition.

Exercice 1 : Classe Abstraite et Méthodes Abstraites

Énoncé :

Créez une classe abstraite Animal avec une méthode abstraite faireDuBruit(). Créez des sous-classes concrètes Lion et Oiseau qui redéfinissent la méthode faireDuBruit() pour émettre des sons spécifiques. Créez une méthode main pour démontrer le comportement polymorphique.

Solution :

abstract class Animal {
    abstract void faireDuBruit();
}

class Lion extends Animal {
    @Override
    void faireDuBruit() {
        System.out.println("Le lion rugit");
    }
}

class Oiseau extends Animal {
    @Override
    void faireDuBruit() {
        System.out.println("L'oiseau chante");
    }
}

public class TestAbstrait {
    public static void main(String[] args) {
        Animal monAnimal;

        monAnimal = new Lion();
        monAnimal.faireDuBruit();

        monAnimal = new Oiseau();
        monAnimal.faireDuBruit();
    }
}
Exercice 2 : Interface et Polymorphisme

Énoncé :

Créez une interface Volant avec une méthode voler(). Créez deux classes Avion et Superman qui implémentent cette interface. Utilisez le polymorphisme pour appeler la méthode voler() sur une instance de Volant.

Solution :

interface Volant {
    void voler();
}

class Avion implements Volant {
    @Override
    public void voler() {
        System.out.println("L'avion vole dans le ciel");
    }
}

class Superman implements Volant {
    @Override
    public void voler() {
        System.out.println("Superman vole pour sauver le monde");
    }
}

public class TestInterface {
    public static void main(String[] args) {
        Volant monVolant;

        monVolant = new Avion();
        monVolant.voler();

        monVolant = new Superman();
        monVolant.voler();
    }
}
Exercice 3 : Généricité et Polymorphisme

Énoncé :

Créez une classe générique Boîte<T> qui peut contenir un objet de n’importe quel type. Ajoutez une méthode afficherContenu() pour afficher le contenu de la boîte. Testez cette classe avec différents types, tels que String, Integer, et une classe utilisateur Personne.

Solution :

class Boîte<T> {
    private T contenu;

    Boîte(T contenu) {
        this.contenu = contenu;
    }

    void afficherContenu() {
        System.out.println("Contenu de la boîte : " + contenu.toString());
    }
}

class Personne {
    String nom;
    int âge;

    Personne(String nom, int âge) {
        this.nom = nom;
        this.âge = âge;
    }

    @Override
    public String toString() {
        return "Personne[nom=" + nom + ", âge=" + âge + "]";
    }
}

public class TestGénéricité {
    public static void main(String[] args) {
        Boîte<String> boîteString = new Boîte<>("Bonjour");
        boîteString.afficherContenu();

        Boîte<Integer> boîteInteger = new Boîte<>(123);
        boîteInteger.afficherContenu();

        Personne personne = new Personne("Alice", 30);
        Boîte<Personne> boîtePersonne = new Boîte<>(personne);
        boîtePersonne.afficherContenu();
    }
}
Exercice 4 : Composition et Héritage

Énoncé :

Créez une classe Adresse avec des propriétés rue, ville et codePostal. Créez une classe Personne avec des propriétés nom, âge et une propriété Adresse. Implémentez une méthode afficherInfo() dans Personne pour afficher les informations de la personne et de son adresse. Montrez comment la composition est utilisée en créant une instance de Personne avec une adresse.

Solution :

class Adresse {
    String rue;
    String ville;
    String codePostal;

    Adresse(String rue, String ville, String codePostal) {
        this.rue = rue;
        this.ville = ville;
        this.codePostal = codePostal;
    }

    @Override
    public String toString() {
        return rue + ", " + ville + ", " + codePostal;
    }
}

class Personne {
    String nom;
    int âge;
    Adresse adresse;

    Personne(String nom, int âge, Adresse adresse) {
        this.nom = nom;
        this.âge = âge;
        this.adresse = adresse;
    }

    void afficherInfo() {
        System.out.println("Nom: " + nom);
        System.out.println("Âge: " + âge);
        System.out.println("Adresse: " + adresse);
    }
}

public class TestComposition {
    public static void main(String[] args) {
        Adresse adresse = new Adresse("123 Rue Principale", "Paris", "75000");
        Personne personne = new Personne("Jean Dupont", 40, adresse);
        personne.afficherInfo();
    }
}

Ces exercices avancés explorent des concepts plus complexes de l’héritage et du polymorphisme en Java, en incluant des cas particuliers et des scénarios réels.

QCM sur Héritage et Polymorphisme en Java

Pour chaque question, choisissez la meilleure réponse parmi les options proposées.

Questions

Quel mot-clé est utilisé pour hériter d’une classe en Java ?

  • a) implements
  • b) extends
  • c) inherits
  • d) super

Quelle est la méthode correcte pour redéfinir une méthode dans une sous-classe en Java ?

  • a) Utiliser le mot-clé override
  • b) Utiliser le mot-clé @Override
  • c) Utiliser le mot-clé redefine
  • d) Utiliser le mot-clé @Redefine

Lequel des éléments suivants n’est pas un type de polymorphisme en Java ?

  • a) Polymorphisme statique
  • b) Polymorphisme dynamique
  • c) Polymorphisme de classe
  • d) Polymorphisme d’interface

Quelle est la sortie du programme suivant

   class Animal {
       void faireDuBruit() {
           System.out.println("L'animal fait du bruit");
       }
   }

   class Chien extends Animal {
       @Override
       void faireDuBruit() {
           System.out.println("Le chien aboie");
       }
   }

   public class Test {
       public static void main(String[] args) {
           Animal animal = new Chien();
           animal.faireDuBruit();
       }
   }
  • a) L’animal fait du bruit
  • b) Le chien aboie
  • c) Erreur de compilation
  • d) Erreur à l’exécution

Quelle est la sortie du programme suivant ?

   class Parent {
       void afficher() {
           System.out.println("Parent");
       }
   }

   class Enfant extends Parent {
       void afficher() {
           System.out.println("Enfant");
       }

       void afficherParent() {
           super.afficher();
       }
   }

   public class Test {
       public static void main(String[] args) {
           Enfant e = new Enfant();
           e.afficher();
           e.afficherParent();
       }
   }
  • a) Enfant
    Parent
  • b) Parent
    Enfant
  • c) Enfant
    Enfant
  • d) Parent
    Parent

Quel mot-clé empêche une classe d’être héritée ?

  • a) private
  • b) protected
  • c) final
  • d) static

Quelle est la sortie du programme suivant ?

   class A {
       static void afficher() {
           System.out.println("Classe A");
       }
   }

   class B extends A {
       static void afficher() {
           System.out.println("Classe B");
       }
   }

   public class Test {
       public static void main(String[] args) {
           A a = new B();
           a.afficher();
       }
   }
  • a) Classe A
  • b) Classe B
  • c) Erreur de compilation
  • d) Erreur à l’exécution

Quelle interface doit être implémentée pour créer une classe capable d’être triée ?

  • a) Cloneable
  • b) Serializable
  • c) Comparable
  • d) Iterable

Quel est le concept de permettre à une méthode d’avoir des noms identiques mais des paramètres différents ?

  • a) Héritage
  • b) Redéfinition de méthode
  • c) Surcharge de méthode
  • d) Encapsulation
  1. Quelle est la sortie du programme suivant ?interface I { void afficher(); } class C implements I { public void afficher() { System.out.println("Classe C"); } } public class Test { public static void main(String[] args) { I i = new C(); i.afficher(); } }
    • a) Classe I
    • b) Classe C
    • c) Erreur de compilation
    • d) Erreur à l’exécution
Réponses
  1. b) extends
  2. b) Utiliser le mot-clé @Override
  3. c) Polymorphisme de classe
  4. b) Le chien aboie
  5. a) Enfant
    Parent
  6. c) final
  7. a) Classe A
  8. c) Comparable
  9. c) Surcharge de méthode
  10. b) Classe C

Autres articles

QCM Adjoint Administratif Catégorie C : Exemples
Testez des exemples de QCM Adjoint Administratif Catégorie C ...
Read more
Guide pour Préparer un QCM pour la...
Un questionnaire à choix multiples (QCM) est un outil d'évaluation...
Read more
Guide pour rédiger un QCM en microéconomie...
1. Structurer le QCMUn bon QCM doit être structuré autour...
Read more

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *