Le Langage HéritageJava
Page 1
Héritage et classe dérivée
n
L’héritage permet de créer une classe par extension ou spécialisation d’une classe existante.
n
Chaque niveau (classe) amène un complément ou une spécialisation des caractéristiques du niveau supérieur auquel il est rattaché.
n
Dès lors qu'une caractéristique (attribut ou méthode) est définie à un niveau elle reste valable pour tous les sous-niveaux affiliés.
n
Ce mécanisme est appelé l'héritage. En java, si une classe D hérite d'une classe B, la classe D est appelée classe dérivée et B classe de base.
n
Java ne supporte que de l’héritage simple.
copyright ©Thierry Douchet Janvier 2006
2
Une classe Personne
n
Une personne est définie par un nom , un prénom et un age.
n
Une personne a une méthode anniversaire() qui lui permet de changer d’age et une méthode afficher () qui affiche l’ensemble de ses attributs :
copyright ©Thierry Douchet Janvier 2006
3
Modélisation de l’héritage en UML
n
Nous voulons maintenant réaliser une classe Stagiaire. Un Stagiaire possède un nom , un prénom , un age et un cours.
n
Un Stagiaire est donc une personne qui suit un cours. Un Stagiaire hérite donc de la classe Personne :
copyright ©Thierry Douchet Janvier 2006
4
La classe Personne
class Personne { private String nom; private String prenom; private int age; public Personne () { nom ="" ; prenom = "" ; age = 0 ; } public Personne ( String _nom , String _prenom , int _age ) { nom = _nom ; prenom = _prenom ; age = _age ; } public String getNom () { return nom ; } public void setNom ( String _nom ) { nom = _nom ; } public void afficher() { System.out.println ( nom + " " + prenom + " " + age ); } public void anniversaire() { age++ ; } } copyright ©Thierry Douchet Janvier 2006
5
La classe Stagiaire
class Stagiaire extends Personne { private String cours;
// héritage en Java -> extends
public Stagiaire() { cours= "" ; } public Stagiaire( String _nom , String _prenom , int _age ,String _cours ) { super ( _nom , _prenom , _age ); // appel du constructeur de la classe de ba cours = _cours; } public String getCours () { return cours ; } public void setCours ( String _cours ) { cours = _cours ; } public void afficher () { super.afficher (); System.out.println ("Cours : cours" + cours ); } } copyright ©Thierry Douchet Janvier 2006
6
Commentaire
n
Un constructeur d’une classe dérivée doit toujours appeler un constructeur de sa classe de base.
n
L ’appel d’un constructeur s’effectue avec le mot clé « super » en fournissant les arguments nécessaire : super ( _nom , _prenom , _age );
n
L’appel peut être implicite, dans ce cas c’est le constructeur par défaut de la classe de base qui est appelé : public Stagiaire() { // super () ; est effectué de façon implicite. cours= "" ; }
n
On peut redéfinir une méthode de la classe de base si elle ne répond pas au exigence de la classe dérivée : méthode « afficher » copyright ©Thierry Douchet Janvier 2006
7
Exemple (suite)
class Demo { public static void main (String args [ ]) { Personne pers1; Stagiaire stag1; pers1 = new Personne ("Bond" , "james" , 7 ); stag1 = new Stagiaire ( "Jones" , "Indiana" , 31 , "java" ); pers1.afficher(); stag1.afficher(); pers1.anniversaire(); stag1.anniversaire(); } } n
On peut appliquer sur un objet l’ensemble des méthodes de sa hiérarchie.
copyright ©Thierry Douchet Janvier 2006
8
La classe dérivée "stagiaire" (suite)
n
Les caractéristiques héritées sont tributaires des attributs d'accès des membres de la classe de base.
n
Les membres privés de la classe "Personne" sont inaccessibles pour les méthodes de la classe "Stagiaire" : class Stagiaire extends Personne { public void afficher() { System.out.println ( nom + prenom + age + cours ) ; // erreur } }
n
Les membres publics de la classe "Personne" sont bien-sûr accessibles pour les méthodes de la classe "Stagiaire" : class Stagiaire extends Personne { public void afficher() { super.afficher(); System.out.println ("Cours : " , cours ) ; } } copyright ©Thierry Douchet Janvier 2006
9
L'attribut d'accès protected
n
L'attribut d'accès protected permet de concéder un droit d’accès pour les classes dérivées. class Personne { protected String nom; } class Stagiaire extends Personne { protected String cours; public void afficher() { System.out.println ( nom + cours); } }
n
Si le nom est « protected », on peut y accéder dans la classe dérivée.
copyright ©Thierry Douchet Janvier 2006
10
L’attribut protected
n
Un attribut protected reste inaccessible pour une instance d’une classe : class Demo { public static void main (String args [ ]) { Personne pers1; pers1 = new Personne ("Bond" , "james" , 7 ); pers1.nom = "Jones" ; // erreur nom est inaccessible pers1.afficher(); } }
copyright ©Thierry Douchet Janvier 2006
11
Le qualificatif final
n
Le qualificatif final peut être utilisé de différentes manières : u
appliqué aux attributs, il indique que le contenu ne doit pas évoluer (définition de constantes).
u
appliqué aux méthodes, il spécifie que la méthode ne pourra pas être redéfinie dans la classe dérivée.
u
appliqué aux classes, il indique qu’aucune classe ne pourra dériver de celle-ci.
copyright ©Thierry Douchet Janvier 2006
12