13 - Héritage et polymorphisme en Java

1 - Introduction

L'héritage en Java est un  processus dans lequel une classe acquiert les propriétés (attributs et méthodes ) d'une autre classe Java. Avec l'utilisation de l'héritage, les données et informations sont gérés dans un ordre hiérarchique bien organisé et structuré.
La classe qui hérite des propriétés d'une autre classe  est appelée sous-classe (classe dérivée ou  classe fille) et la classe dont les propriétés sont héritées est appelée superclasse (classe de base, classe parente, classe mère...).
La déclaration d'une sous classe se fait à l'aide  du mot clé Extends
Extends est le mot clé utilisé pour hériter des propriétés d'une classe.
Syntaxe

class mère {

    ....

}

class fille extends mère {
   .....

}

2 - Héritage Java : étude d'exemple

Pour bien comprendre l'héritage Java, nous allons traiter un exemple simple d'une classe être humain et d'une sous classe Employé

La classe être humain est dotée des attributs :

  • nom
  • age
  • adresse

Un employé est aussi un être humain et par suite la sous classe employé hérite les mêmes propriétés nom, age, adresse... de la classe mère être humain , néanmoins la classe fille employé possède d'autres attributs inexistants chez la classe mère comme salaire, grade...

 Java Object Oriented Java - Inheritance Java - Overriding Java - Polymorphism Java - Abstraction Java - Encapsulation Java - Interfaces Java - Packages Inheritance can be defined as the process where one class acquires the properties (methods and fields) of another. With the use of inheritance the information is made manageable in a hierarchical order.

Remarque :

L'héritage d'un attribut se fait grâce au mot clé super

Exemple ( classe mère )

package etreHumain;

public class Humain {
	public String nom;
	public Humain(String n){
		this.nom=n;
	}
}

Exemple ( classe fille )

package etreHumain;

class Employé extends Humain{
	public int salaire;

	public Employé(String nm, int sal) {
		super(nm);
     this.salaire=sal;
	}
public static void main(String[] args) {
Employé enseignant=new Employé("Robert",3500);
System.out.println("Le nom de l'enseignant  est " + enseignant.nom);
System.out.println("Salaire de l'enseignant: " + enseignant.salaire +" Euro");
	}
}

Ce qui affiche après exécution :

Le nom de l'enseignant  est Robert
Le salaire de l'enseignant est  3500 Euro

3 - Polymorphisme en Java

Dans le paragraphe précédent , nous avons parlé de superclasses et de sous-classes. Si une classe hérite d'une méthode de sa superclasse, alors il y a une chance de reformuler  la méthode à condition qu'il n'est pas marqué final.
L'avantage de la substitution est la capacité de définir un comportement spécifique au type de sous-classe, ce qui signifie qu'une sous-classe peut implémenter une méthode de classe parent en fonction de son besoin et ses exigences.

Exemple

public class Animal {
	   public void seDeplacer() {
	      System.out.println("Un animal peut se déplacer");
	   }
	}

	class Chien extends Animal {
	   public void seDeplacer() {
	      System.out.println("Un chien peut courir");
	   }
	}

	class Oiseau  extends Animal {
		   public void seDeplacer() {
		      System.out.println("Un oiseau peut voler");
		   }
		}

Et pour exécuter le code de cette classe nous aurons besoin d'une autre classe doté d'une méthode static void main()

public class ExecutionAnimal {

		   public static void main(String args[]) {
		      Animal a = new Animal();  
		      Animal b = new Chien();
		      Animal c= new Oiseau();
		      
		      a.seDeplacer();   
		      b.seDeplacer();   
		      c.seDeplacer();

Ce qui affiche après exécution sur Eclipse :

Un animal peut se déplacer
Un chien peut courir
Un oiseau peut voler

4 - Usage de l’annotation @Override ( reformuler une méthode Java )

L’annotation @Override est utilisée en Java pour reformuler une méthode dans le cas du polymorphisme Java. Si la formule en question ne redéfinit pas une autre dans la classe mère, le compilateur signale une erreur !

Exemple

class Parent {
	
	void aficher(){
		System.out.println("C'est la méthode de la classe Parent ");
	}
}
	
	class Enfant extends Parent{
		
		@Override
		void afficher(){
		System.out.println("C'est la méthode de la classe Enfant ");	
		}
	}

@Override  indique ici au compilateur que la classe Enfant utilise la méthode affcher() de la classe Parent mais avec modification : au lieu d’afficher le message : C’est la méthode de la classe Parent  elle doit afficher un autre qui est propre à la classe Enfant  : C’est la méthode de la classe Enfant.

Certainement vous n’avez pas pu comprendre réellement l’avantage et l’effet de cette annotation !

Comme nous l’avons déjà mentionné ci-dessus : Si la formule en question ne redéfinit pas une autre dans la classe mère, le compilateur signale une erreur !. Amusons nous par exemple faire une petite modification sur le nom de la formule en question :

Essayons à titre d’exemple de remplacer la méthode afficher() dans la classe Enfant par afiche();

Marker annotations: we also speak of standard annotations. These are placed markers that allow the compiler to do or not to do certain actions. These include @Override, @Deprecated, @SuppressWarning ... The annotations parameterized: these are annotations that take a parameter in order to be able to function. We'll see the annotation @Retention (RetentionPolicy.RUNTIME); Multiparametric annotations: these take several parameters. The Java language already offers annotations of these three types that you can use in your programs.

 

Younes Derfoufi
CRMEF OUJDA

Leave a Reply