17
Appréciation des lecteurs : L'héritage ! Informations sur le tutoriel Auteur : cysboy Difficulté : Licence : Plus d'informations Popularité Visualisations : 8 527 255 36 36 61 354 1717 personnes souhaitent voir ce tutoriel publié en livre ! Vous aussi ? Historique des mises à jour Le 30/11/2010 à 16:10:31  #3345 Correction grammaticale Le 29/11/2010 à 15:51:08  #3340 Correction grammaticale Le 11/11/2010 à 11:40:23  Correction d'un code, ticket #3219 Partager Imprimer Convertir en PDF Email Twitter Facebook Plus de services  Je vous arrête tout de suite... Vous ne toucherez rien ! Pas de rapport d'argent entre nous... Non, la notion d'héritage en programmation est toute autre, quoique ressemblante à celle que vous connaissez. C'est l'un des fondements de la programmation orientée objet ! Imaginons que dans le programme fait précédemment, nous voulions créer un autre type d'objet : des objets Capitale. Ceux-ci ne seront ni plus ni moins que des objets  Ville avec un paramètre en plus... Disons un président  ! Et donc, au moment de créer votre classe Capitale, au lieu de tout redéfinir, nous allons dire que celle-ci est héritée de Ville. Trêve de bavardage ! À l'assaut ! Sommaire du chapitre : Page 1 of 17 L'héritage ! 14/12/2010 http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

II-2. L'héritage

Embed Size (px)

Citation preview

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 1/17

Appréciationdes lecteurs :

L'héritage !

Informations sur le tutorielAuteur : cysboy Difficulté :Licence :

Plus d'informations

PopularitéVisualisations : 8 527 255

363661

354

1717 personnes souhaitent voir ce tutoriel publié en livre !Vous aussi ?

Historique des mises à jourLe 30/11/2010 à 16:10:31

#3345 Correction grammaticale

Le 29/11/2010 à 15:51:08 #3340 Correction grammaticale

Le 11/11/2010 à 11:40:23 Correction d'un code, ticket #3219

Partager

Imprimer

Convertir en PDF

Email

Twitter

Facebook Plus de services Je vous arrête tout de suite... Vous ne toucherez rien !Pas de rapport d'argent entre nous... Non, la notion d'héritage en programmation est toute autre, quoique ressemblante à celleque vous connaissez. C'est l'un des fondements de la programmation orientée objet !

Imaginons que dans le programme fait précédemment, nous voulions créer un autre type d'objet :des objets Capitale .Ceux-ci ne seront ni plus ni moins que des objets Ville avec un paramètre en plus... Disons unprésident !

Et donc, au moment de créer votre classeCapitale , au lieu de tout redéfinir, nous allons dire que celle-ci est héritée deVille . Trêve de bavardage ! À l'assaut !Sommaire du chapitre :

Page 1 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 2/17

La notion d'héritage •Construction d'un objet hérité •Le polymorphisme •Ce qu'il faut retenir •Q.C.M.•

La notion d'héritage

Comme je vous l'ai déjà dit lors de l'introduction, la notion d'héritage est l'un des fondements de la programmation orientéeobjet. Grâce à elle, nous pourrons créer des classes héritées (appelées aussiclasses dérivées ) de nos classes mères (appeléesaussiclasses de base ).Nous pourrons créer autant de classes dérivées, par rapport à notre classe de base, que nous le souhaitons. Nous pourrons aussinous servir d'une classe dérivée comme d'une classe de base pour créer une autre classe dérivée...

Ce que vous devez savoir aussi, c'est que la notion d'héritage est l'un des piliers de la programmation événementielle (autre

nom de programmation graphique ). Ceci sera abordé dans la troisième partie de ce tuto.Pour l'instant, restons dans la programmation procédurale !

Reprenons l'exemple dont je vous parlais dans l'introduction. Nous allons donc créer une nouvelle classe, nomméeCapitale héritée de Ville .Vous vous rendrez vite compte que les objetsCapitale auront tous les attributs et méthodes associés des objets Ville !

Code : Java - Sélectionner

class Capitale extends Ville {

}

C'est le mot-cléextends qui informe notre application que la classeCapitale est héritée de Ville . Pour vous leprouver, essayez ce morceau de code dans votremain :

Code : Java - Sélectionner

Capitale cap = new Capitale (); System . out . println ( "\n\n" + cap . decrisToi ());

Vous devriez avoir ceci :

Ceci est bien la preuve que notre objet Capitale possède les avantages de notre objet Ville . Les objets hérités peuventaccéder à toutes les méthodes public de leur classe mère, ici la méthode decrisToi() .Dans ce cas rudimentaire, notre objetCapitale ne possède que le constructeur par défaut et les méthodes associées.

En fait, lorsque vous déclarez une classe, si vous ne spécifiez pas de constructeur, laJVMcréera au moment de l'interprétationle constructeur par défaut. C'est le cas ici. De plus, notre classeCapitale hérite de la classe Ville , ceci a pour effet que le

Page 2 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 3/17

constructeur de notre objet appelle, de façon tacite, le constructeur de la classe mère.C'est pour cela que les variables d'instances ont pu être initialisées ! Par contre, dans notre classeCapitale , nous ne pouvonspas utiliser directement les attributs de la classe Ville .

Essayez ceci dans votre classe :Code : Java - Sélectionner

public class Capitale extends Ville {

public Capitale (){ this . nomVille = "toto" ;

}

}

Vous allez avoir une belle erreur de compilation !

Pourquoi ? Tout simplement parce les variables de la classe Ville sont déclarés private .Comme seules les méthodes et les variables déclarées public peuvent être utilisées dans une classe héritée, le compilateurrejette votre demande lorsque vous tentez d'accéder à des ressources privées d'une classe mère !

Comment y remédier tout en gardant la protection sur les variables de ma classe mère ? C'est ici que je vais vous apprendre un nouveau mot clé : protected .En remplaçant la déclaration des variables et des méthodes privées de la classe Ville en protected , cela aura pour effet detoujours protéger l'accès à celles-ci depuis du code utilisant un objet Ville ; mais cela permet aux classes qui héritent decette dernière d'y avoir accès !Donc, une fois toutes les variables et méthodes privées de la classe mère re-déclarées en protected , notre objet Capitale aura accès à celles-ci !

Ainsi, voici votre classe Ville revue et corrigée :Code : Java - Sélectionner

public class Ville {

/** * Variable publique compteur d'instances*/ public static int nbreInstance = 0;

/** * Variable privée compteur d'instances */ protected static int nbreInstanceBis = 0;

/** * Stocke le nom de notre ville */ protected String nomVille ;

/** * Stocke le nom du pays de notre ville */ protected String nomPays ;

/** * Stocke le nombre d'habitants de notre ville */ protected int nbreHabitant ;

/**

Page 3 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 4/17

* Stocke le type de notre ville */ protected char categorie ;

/** * Constructeur par défaut */ public Ville (){

//On incrémente nos variables à chaque appel au constructeur nbreInstance ++; nbreInstanceBis ++;

nomVille = "Inconnu" ; nomPays = "Inconnu" ; nbreHabitant = 0; this . setCategorie ();

}

/** * Constructeur d'initialisation * @param pNom* Nom de la Ville * @param pNbre * Nombre d'habitants * @param pPays * Nom du pays */ public Ville ( String pNom , int pNbre , String pPays )

{

nbreInstance ++; nbreInstanceBis ++;

nomVille = pNom ; nomPays = pPays ;

nbreHabitant = pNbre ; this . setCategorie ();

}

//*********************************************************************************** // ACCESSEURS

//***********************************************************************************

public static int getNombreInstanceBis () {

return nbreInstanceBis ; }

/** * Retourne le nom de la ville * @return le nom de la ville */ public String getNom ()

{ return nomVille ;

}

/** * Retourne le nom du pays * @return le nom du pays */

public String getNomPays () {

return nomPays ; }

Page 4 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 5/17

/**

* Retourne le nombre d'habitants * @return nombre d'habitants */

public int getNombreHabitant () {

return nbreHabitant ;

}

/** * Retourne la catégorie de la ville * @return catégorie de la ville*/

public char getCategorie () {

return categorie ; }

//************************************************************************************ // MUTATEURS

//************************************************************************************

/** * Définit le nom de la ville * @param pNom * nom de la ville */

public void setNom ( String pNom ) {

nomVille = pNom ; }

/** * Définit le nom du pays

* @param pPays * nom du pays */

public void setNomPays ( String pPays ) {

nomPays = pPays ; }

/** * Définit le nombre d'habitants * @param nbre * nombre d'habitants */

public void setNombreHabitant ( int nbre ) {

nbreHabitant = nbre ; this . setCategorie ();

}

//*************************************************************************************// METHODES DE CLASSE //*************************************************************************************

/** * Définit la catégorie de la ville */ protected void setCategorie () {

Page 5 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 6/17

int bornesSuperieures [] = {0, 1000, 10000, 100000, 500000, 1000000, 5000000, 1000 char categories [] = { '?' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' };

int i = 0; while ( i < bornesSuperieures . length && this . nbreHabitant >= bornesSuperieures [ i

i ++;

this . categorie = categories [ i ];

}

/** * Retourne la description de la ville * @return description ville */ public String decrisToi (){

return "\t" + this . nomVille +" est une ville de " + this . nomPays + ", elle comporte :" + this . nbreHabitant +

" => elle est donc de catégorie : " + this . categorie ; }

/** * Retourne une chaîne de caractères selon le résultat de la comparaison * @param v1 * objet Ville * @return comparaison de deux ville */ public String comparer ( Ville v1 ){

String str = new String ();

if ( v1 . getNombreHabitant () > this . nbreHabitant ) str = v1 . getNom ()+ " est une ville plus peuplée que " + this . nomVille ;

else str = this . nomVille + " est une ville plus peuplée que " + v1 . getNom ();

return str ;

}

}

Un point important avant de continuer.

Contrairement au C++, Java ne gère pas les héritages multiples : une classe dérivée(ou encore classe fille ) ne peut hériter que d'une seule classe mère !

Vous n'aurez doncJAMAISce genre de classe :Code : Java - Sélectionner

class Toto extends Titi , Tutu { }

À présent, continuons la construction de notre objet hérité !

Page 6 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 7/17

Construction d'un objet hérité

Il va de soi que cette opération va se concrétiser avec nos chers constructeurs.Notre classe Ville ne changera plus d'un poil, mais nous allons par contre agrémenter notre classeCapitale .

Comme je vous l'avais dit, ce qui différenciera nos objetsCapitale de nos objets Ville sera la présence d'un champ

nouveau : le nom du président. Ce qui signifie que nous devons créer un constructeur par défaut et un constructeurd'initialisation pour notre objetCapitale .

Avant de foncer tête baissée, il faut que vous sachiez que nous pouvons faire appel aux variables de la classe mère dans nosconstructeurs... Et ceci grâce au mot-clé super . Ce qui aura pour effet de récupérer les éléments de l'objet de base, et de lesenvoyer à notre objet hérité.

Démonstration :

Code : Java - Sélectionner

class Capitale extends Ville {

private String president ;

/** *Constructeur par défaut */ public Capitale (){

//Ce mot clé appelle le constructeur de la classe mère.super (); president = "aucun" ;

} }

Si vous testez à nouveau le petit exemple que je vous avais montré un peu plus haut, vous vous apercevrez que le constructeurpar défaut fonctionne toujours... Et pour cause, car ici, super() appelle le constructeur par défaut de l'objet Ville dansnotre constructeur de Capitale , puis nous avons rajouté le président par défaut.

Mais la méthodedecrisToi() ne prend pas en compte le nom du président...Eh bien le mot-clésuper() fonctionne aussi pour les méthodes de classe. Ce qui nous donne une méthodedecrisToi() unpeu différente... car nous allons rajouter le champ président dans notre description.

Voyez plutôt :

Code : Java - Sélectionner

class Capitale extends Ville {

private String president ;

/** *Constructeur par défaut */ public Capitale (){

//Ce mot clé appel le constructeur de la classe mère.super (); president = "aucun" ;

}

/** *Description d'une capitale */

public String decrisToi (){

Page 7 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 8/17

String str = super . decrisToi () + "\n \t ==>>" + this . president + "est son président" ;

//Pour bien vous montrer, j'ai ajouté la ligne ci-dessous, mais vousn'êtes pas obligés...

System . out . println ( "Invocation de super.decrisToi()" ); System . out . println ( super . decrisToi ()); return str ;

}

}

Si vous relancez les mêmes instructions présentes dans lemain , depuis le début, vous aurez quelque chose comme ça :

Il y a du mieux, non ?Bon, d'accord, nous n'avons toujours pas fait le constructeur d'initialisation deCapitale ... Eh bien ? Qu'est-ce que nousattendons ?

Code complet de not re classe Capitale

Code : Java - Sélectionner

public class Capitale extends Ville {

private String president ;

/** *Constructeur par défaut */

public Capitale (){ //Ce mot clé appelle le constructeur de la classe mère.super (); president = "aucun" ;

}

/**

* Constructeur d'initialisation de capitale */ public Capitale

( String nom , int hab , String pays , String president ){

Page 8 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 9/17

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 10/17

Le polymorphisme

Voici encore un des concepts fondamentaux de la programmation orientée objet :Le polymorphisme.Ce concept complète parfaitement celui de l'héritage.

Comme vous l'avez vu, le polymorphisme n'est pas si compliqué qu'il pourrait sembler l'être !

Nous pouvons le caractériser en disant qu'il permet de manipuler des objets sans vraiment connaître leur type.

Dans notre exemple, vous avez vu qu'il suffisait d'utiliser la méthodedecrisToi() sur un objet Ville ou sur un objetCapitale , et cela sans se soucier de leur type. On pourrait construire un tableau d'objets, et appeler la decrisToi() sans sesoucier de son contenu : villes, capitales, ou les deux.

D'ailleurs nous allons le faire. Essayez ce code :

Code : Java - Sélectionner

//Def d'un tableau de ville null Ville [] tableau = new Ville [6];

//Définition d'un tableau de noms de Villes et d'un tableau de nombresd'habitants

String[] tab = { "Marseille" , "lille" , "caen" , "lyon" , "paris" , "nantes" };

int [] tab2 = {123456, 78456, 654987, 75832165, 1594,213};

/* Les 3 premiers éléments du tableau seront des Villes, et le reste, des capitales */

for ( int i = 0; i < 6; i ++){ if ( i <3){

Ville V = new Ville ( tab [ i ], tab2 [ i ], "france" ); tableau [ i ] = V;

}

else { Capitale C = new Capitale ( tab [ i ], tab2 [ i ], "france" , "Sarko" ); tableau [ i ] = C;

} }

//il ne nous reste plus qu'à décrire tout notre tableau ! for ( Ville v : tableau ){

System . out . println ( v . decrisToi ()+ "\n" ); }

Résultat :

Page 10 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 11/17

Une petite nouveauté, la création d'un tableau d'un certain nombre d'entréesvides . Rien de bien compliqué à cela, vous voyezque la syntaxe est toute simple.Nous créons un tableau de villes, avec des villes et des capitales (nous avons le droit de faire ça, car les objetsCapitale sontaussi des objets Ville ... ), dans notre première boucle for .Dans la seconde, nous affichons la description de ces objets... et vous voyez que la méthodepolymorphe decrisToi() faitbien son travail !

Dans ta boucle, tu n'utilises que des objets Ville . Tout à fait. On appelle ceci lacovariance des variables !Cela signifie qu'une variable objet peut contenir un objet qui hérite du type de cette variable. Dans notre cas, un objet de type

Ville peut contenir un objet de type Capitale . Dans ce cas, on dit que Ville est la super classe par rapport à Capitale .La covariance est efficace dans le cas où la classe héritant redéfinit certaines des méthodes de sa super classe.

Attention à ne pas confondre lasurcharge de méthode avec une méthode polymorphe . Pour dire les choses simplement :

une méthode surchargée a des paramètres que la méthode de base n'a pas, ou a le même nombre de paramètres, maisde types différents ;

une méthode polymorphe a un squelette identique à celle de base, mais un traitement différent. Celle-ci fait référenceà une autre classe et donc, par extension, à une autre instance de cette classe. On peut dire que lesméthodes polymorphes sont typiques des classes héritées !

Vous devez savoir encore une chose sur l'héritage. Lorsque vous créez une classe (Ville par exemple), celle-ci est une classehéritée de la classe Object présente dans Java.Cette écriture est donc tout à fait correcte :

Code : Java - Sélectionner

class Ville extends Object { .......... }

Page 11 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 12/17

Toutes nos classes héritent donc des méthodes de la classeObject , comme equals() , qui prend un objet en paramètre, etqui permet de tester l'égalité d'objets. Vous vous en êtes d'ailleurs servis pour tester l'égalité deString() dans la premièrepartie de ce tuto.Donc, si nous redéfinissons une méthode de la classeObject dans la classe Ville , nous pourrions utiliser la covariance.

La méthode de la classeObject qui est le plus souvent redéfinie est la méthode toString() , qui retourne un String et quia pour rôle de décrire l'objet en question (tout comme notre méthodedecrisToi() ). Nous allons donc faire un copier / collerde notre procédure de la méthode decrisToi() dans une nouvelle méthode de la classe Ville : toString() .

Voici :Code : Java - Sélectionner

public String toString (){ return "\t" + this . nomVille +" est une ville de " + this . nomPays + ", elle

comporte : " + this . nbreHabitant + " => elle est donc de catégorie : " + this . categorie ;

}

Nous faisons de même dans la classeCapitale :Code : Java - Sélectionner

public String toString (){ String str = super . toString () + "\n \t ==>>" + this . president + " est

son président" ; return str ;

}

Maintenant, testez ce code :

Code : Java - Sélectionner

//Def d'un tableau de ville null Ville [] tableau = new Ville [6];

//Définition d'un tableau de noms de Villes et d'un tableau de nombresd'habitants

String[] tab = { "Marseille" , "lille" , "caen" , "lyon" , "paris" , "nantes" };

int [] tab2 = {123456, 78456, 654987, 75832165, 1594,213};

/* Les 3 premiers éléments du tableau seront des Villes et le reste des capitales */

for ( int i = 0; i < 6; i ++){ if ( i <3){

Ville V = new Ville ( tab [ i ], tab2 [ i ], "france" ); tableau [ i ] = V;

}

else { Capitale C = new Capitale ( tab [ i ], tab2 [ i ], "france" , "Sarko" ); tableau [ i ] = C;

} }

//il ne nous reste plus qu'à décrire tout notre tableau ! for ( Object obj : tableau ){

Page 12 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 13/17

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 14/17

//Définition d'un tableau de noms de Villes et d'un

tableau de nombres d'habitants String

[] tab = { "Marseille" , "lille" , "caen" , "lyon" , "paris" , "nantes" }; int

[] tab2 = {123456, 78456, 654987, 75832165, 1594,213};

/* Les 3 premiers éléments du tableau seront des Villes, et le reste, des capitales */

for ( int i = 0; i < 6; i ++){ if ( i <3){

Ville V = new Ville ( tab [ i ], tab2 [ i ], "france" ); tableau [ i ] = V;

}

else { Capitale C = new Capitale ( tab [ i ], tab2

[ i ], "france" , "Sarko" ); tableau [ i ] = C;

} }

//il ne nous reste plus qu'à décrire tout notretableau !

for ( Object v : tableau ){ System . out . println ( v . decrisToi ()+ "\n" );

}

} }

Pour que cela fonctionne, vous devez dire à la JVM que la référence de typeObject est en fait une référence de type Ville .Comme ceci :

Code : Java - Sélectionner

public class Sdz1 {

public static void main ( String [] args ){

//Def d'un tableau de ville null Ville [] tableau = new Ville [6];

//Définition d'un tableau de noms de Villes et d'un

tableau de nombres d'habitants

String[] tab = { "Marseille" , "lille" , "caen" , "lyon" , "paris" , "nantes" };

int[] tab2 = {123456, 78456, 654987, 75832165, 1594,213};

/* Les 3 premiers éléments du tableau seront des Villes, et le reste, des capitales */

for ( int i = 0; i < 6; i ++){ if ( i <3){

Ville V = new Ville ( tab [ i ], tab2 [ i ], "france" ); tableau [ i ] = V;

}

else { Capitale C = new Capitale ( tab [ i ], tab2

[ i ], "france" , "Sarko" );

Page 14 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 15/17

tableau [ i ] = C; }

}

//il ne nous reste plus qu'à décrire tout notretableau !

for ( Object v : tableau ){ System . out . println ((( Ville ) v ). decrisToi ()+ "\n" );

}

} }

Vous transtypez la référencev en Ville par cette syntaxe :Code : Java - Sélectionner

(( Ville ) v ). decrisToi ();

Ici, l'ordre des opérations s'effectue comme ceci :

vous transtypez la référencev en Ville•vous appliquez la méthodedecrisToi() à la référence appelante, ici, une référence Object changée en Ville .•

Vous voyez donc l'intérêt des méthodes polymorphes. Avec celles-ci, vous n'avez plus à vous soucier du type de variableappelante ; cependant, n'utilisez le type Object qu'avec parcimonie.

Il existe encore un type de méthode dont je ne vous ai pas encore parlé. Il s'agit des méthodes ditesfinal . Ces méthodes sontfigées et vous ne pourrezJAMAISredéfinir une méthode déclarée final . Un exemple de ce type de méthode est la méthodegetClass() de la classe Object : vous ne pourrez pas redéfinir cette méthode et heureusement, car celle-ci retourne unobjet Capitale dans le fonctionnement de Java (nous verrons cela plus tard).

Il existe aussi des classes déclaréesfinal . Vous avez compris que ces classes sont immuables... Et vous ne pouvez doncpas faire hériter un objet d'une classe déclarée final !

Ce qu' il faut retenir

Encore un petit topo des familles. Je pense qu'avec ce genre de chapitre, ce n'est pas du luxe...

Une classe hérite d'une autre classe par le biais du mot cléextends .•Une classe ne peut hériter que d' une seule et unique classe !•Si nous ne définissons pas de constructeur dans nos classes,la JVM se charge d'en créer un à l'interprétation .•Si aucun constructeur n'est défini dans une classe fille,la JVM en créera un et appellera automatiquement leconstructeur de la classe mère.

La classe fille hérite de toutes les propriétés et méthodes public et protected de la classe mère.•Les méthodes et propriétés private d'une classe mère ne sont pas accessibles dans la classe fille.•On peut redéfinir (changer tout le code) d'une méthode héritée.•On peut utiliser le polymorphisme sur une méthode par le biais du mot clésuper .•Le polymorphisme permet, entre autres, d'ajouter des traitements spécifiques à une méthode en continuant d'utiliser lestraitements déjà définis (utilisation de super ).

Grâce à l'héritage et au polymorphisme, nous pouvons utiliser lacovariance des variables !•Si une méthode d'une classe mère n'est pas redéfinie ou polymorphée, à l'appel de cette méthode par le biais d'un objetenfant, c'est la méthode de la classe mère qui sera appelée !

Vous ne pouvez pas hériter d'une classe déclaréefinal .•

Page 15 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 16/17

Une méthode déclarée final est non redéfinissable .•

Je crois que vous êtes prêts pour un petit QCM... Mais prenez le temps de digérer tout ceci !Faites des essais, testez, comparez, c'est le meilleur moyen de bien comprendre les choses.

Q.C.M.Avec quel mot clé peut-on accéder aux méthodes d'une classe mère lorsque nous créons une classe héritée ?

• super.• hyper.• ultra.

Qu'est-ce qui ne va pas dans ce code (cette classe est héritée d'une classe nommée A) ?Code : Java - Sélectionner

class B {

public B(){ super (); } }

• Mauvaise utilisation de super();.• il manque une accolade dans ce code.• La classe B n'est pas héritée de la classe A.

Quel caractéristique principale a une méthode polymorphe ?

• Elle prend des paramètres en plus que la méthode de base.• Elle n'a rien de spécial.• Pour différents objets, on s'en sert et on l'appelle de la même manière.

De combien de classes une classe héritée peut-elle être une classe fille (ouclasse héritée ) ?

• 1.• 2.• 3.

Que va afficher ce code ?Code : Java - Sélectionner

public class A { public A(){

System . out . println ( "1" ); }

} public class B extends A{

}

public class Test { public static void main ( String [] args )

{ B b = new B();

Page 16 of 17L'héritage !

14/12/2010http://www.siteduzero.com/tutoriel-3-10355-l-heritage.html

8/8/2019 II-2. L'héritage

http://slidepdf.com/reader/full/ii-2-lheritage 17/17

} }

• Rien.• 1.• Erreur de compilation.

Correction !

Statistiques de réponses au QCM

Si vous êtes prêts pour la suite, allons tout de suite voir ce qui se passe :Apprendre à modéliser .

Page 17 of 17L'héritage !