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.
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).
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
}
}
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.
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
}
}
É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();
}
}
É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.
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.
É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();
}
}
É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();
}
}
É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();
}
}
É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.
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 ?
implements
extends
inherits
super
Quelle est la méthode correcte pour redéfinir une méthode dans une sous-classe en Java ?
override
@Override
redefine
@Redefine
Lequel des éléments suivants n’est pas un type de polymorphisme en Java ?
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();
}
}
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();
}
}
Quel mot-clé empêche une classe d’être héritée ?
private
protected
final
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();
}
}
Quelle interface doit être implémentée pour créer une classe capable d’être triée ?
Cloneable
Serializable
Comparable
Iterable
Quel est le concept de permettre à une méthode d’avoir des noms identiques mais des paramètres différents ?
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(); } }
extends
@Override
final
Comparable
La méthode Thèse, Antithèse, Synthèse (TAS) est un outil incontournable pour structurer une dissertation, particulièrement…
1. Informations Générales Nom complet : Émile Édouard Charles Antoine Zola Date de naissance :…
1. Informations Générales Nom complet : Victor-Marie Hugo Date de naissance : 26 février 1802…
1. Informations Générales Nom complet : François Rabelais Date de naissance : Vers 1483 ou…
La modélisation financière est une pratique clé dans le domaine des finances et de la…
Un tableau de suivi des indicateurs est un outil essentiel pour mesurer la performance, suivre…
This website uses cookies.