Vous êtes sur la page 1sur 44

Hritage en Java

Professeur: M. Joundi

Lhritage (3) : dfinition


Hritage : mcanisme permettant le partage et la rutilisation de proprits entre les objets. La relation dhritage est une relation de gnralisation / spcialisation. La classe parente est la superclasse. La classe qui hrite est la sous-classe.

Lhritage avec Java (1)


Java implmente le mcanisme d'hritage simple qui permet de "factoriser" de l'information grce une relation de gnralisation / spcialisation entre deux classes. Pour le programmeur, il s'agit d'indiquer, dans la sous-classe, le nom de la superclasse dont elle hrite. Par dfaut toutes classes Java hrite de la classe Object L'hritage multiple n'existe pas en Java. Mot rserv : extends

Lhritage avec Java (2)


class Personne { protected String nom; protected Date date_naissance; // ... } class Employe extends Personne { protected float salaire; // ... } class Etudiant extends Personne { protected int numero_carte_etudiant; // ... }

Lhritage avec Java (3)


Constructeurs et hritage:
par dfaut le constructeur dune sous-classe appelle le constructeur "par dfaut" (celui qui ne reoit pas de paramtres) de la superclasse. Attention donc dans ce cas que le constructeur sans paramtre existe toujours dans la superclasse... Pour forcer l'appel d'un constructeur prcis, on utilisera le mot rserv super. Cet appel devra tre la premire instruction du constructeur.

Lhritage avec Java (4)


public class Employe extends Personne { public Employe () {} public Employe (String nom, String prenom, int anNaissance) { super(nom, prenom, anNaissance); } }

Appel explicite ce constructeur avec le mot cl super

public class Personne { public String nom, prenom; public int anNaissance; public Personne() { nom=""; prenom=""; } public Personne(String nom, String prenom, int anNaissance) { this.nom=nom; this.prenom=prenom; this.anNaissance=anNaissance; } }

Lhritage avec Java (5)


public class Personne { public String nom, prenom; public int anNaissance; public Personne() { nom=""; prenom=""; } public Personne(String nom, String prenom, int anNaissance) { this.nom=nom; this.prenom=prenom; this.anNaissance=anNaissance; } }

public class Object { public Object() { / ... } }

Appel par dfaut dans le constructeur de Personne au constructeur par dfaut de la superclasse de Personne, qui est Object

Exercice
Ecrire une classe Animal qui dispose dun attribut entier nbPattes . Cette classe dispose des mthodes suivantes :
le constructeur, qui prend en argument un entier (le nombre de pattes). String toString (), qui renvoie une chane de caractres contenant le nombre de pattes de lanimal. affiche() qui affiche le nombre de pattes de lanimal.

Ecrire une classe Autruche qui hrite de Animal Ecrire une classe Lapin qui hrite de Animal Ecrire une classe Main dans laquelle la mthode main() cre un lapin et une autruche
Dans la classe Animal la mthode toString () renvoi le message : Ceci et un animal de pattes . Dans la classe Autruche la mthode toString () renvoi le message : Ceci et une autruche de pattes . Dans la classe Lapin la mthode toString () renvoi le message : Ceci et un lapin de pattes . Remarque : les pointilles seront remplies par le nombre de pattes adquate

Corrig
La classe Animal :
class Animal { protected int nbPattes ; Animal( int nb){ //constructeur setNbPattes( nb); } // accesseur public int getNbPattes(){return nbPattes;} // modifieur public void setNbPattes( int nb){ nbPattes = nb;} public String toString() { return "Ceci est un animal dot de " + getNbPattes() + " pattes"; } public void affiche(){ System.out.println( toString()); } }

Corrig (2)
Les classes Autruche et Lapin :
class Autruche extends Animal { Autruche( int nb ){ //constructeur super( nb); } public String toString () { return "Ceci est une autruche dote de " + getNbPattes () + " pattes"; } } class Lapin extends Animal { Lapin( int nb ){ //constructeur super( nb); } public String toString () { return "Ceci est un lapin dot de " + getNbPattes () + " pattes"; } }

Corrig (3)
La classe Main :
class Main { public static void main(Stringargs[]) { Autruche kiki = new Autruche(2); Lapin bunny = new Lapin(4); kiki.affiche(); bunny .affiche(); } }

finale
Classe finale : classe qui ne peut pas tre super-classe d'une autre classe Syntaxe final class Z{ } Exemple:
final class A { } class B extends A{ }

gnre lerreur suivante la compilation Cannot inherit from final A

finale
Mthode finale : Une sous classe ne pourra pas redfinir la mthode Syntaxe dans le corps d'une classe (disons A) final mthode() { }
Example: class A { final void m(){ System.out.println("final method"); } } class B extends A{ void m(){ // gnre une erreur la compilation System.out.println("never override a final method"); }

finale
Champ final : ni la classe, ni aucune sous classe ne peuvent changer la valeur initiale du champ Joue le rle d'une constante d'objet ou de classe Syntaxe final typeChamp nomChamp = valInitiale;

Redfinir une mthode (overriding) une classe fille peut redfinir une mthode ce qui signifie quelle peut rcrire une mthode en gardant exactement : La mme signature Le type de retour : peut tre le mme type ou du type dune classe fille lorsque lon redfinit une mthode cela signifie que lon modifie son implmentation

Redfinir une mthode (overriding) Une mthode redfinit ne peut pas avoir un accs plus restrictif . Pour appeler une mthode de la super-classe, on doit prcder le nom de la mthode par le mot cl super super.getNom()

Surcharger une mthode(overloading)


une classe fille peut surcharger une mthode ce qui signifie quelle peut rcrire une mthode en gardant le mme nom mais pas la mme signature, cest- dire avec des paramtres dentre diffrents mais le paramtre de retour peut tre diffrent . lorsque lon surcharge une mthode, cela signifie que lon ajoute un comportement et que lon modifie son interface

OverLoad #Override
//Legal public class Foo{ void go() { } } public class Bar extends Foo { String go(int x) { return null; } }
//NOT LEGAL public class Foo{ void go() { } } public class Bar extends Foo { String go() { // Not legal! Can't change //only the return type return null; } }

Etant donn: class Clidders { public final void flipper() { System.out.println("Clidder"); } } public class Clidlets extends Clidders { public void flipper() { System.out.println("Flip a Clidlet"); super.flipper(); } public static void main(String [] args) { new Clidlets().flipper(); } } Quel est le rsultat : A Flip a Clidlet B Flip a Clidder C Flip a Clidder Flip a Clidlet D Flip a Clidlet Flip a Clidder E Compilation fails.

Etant donn: class Clidders { public final void flipper() { System.out.println("Clidder"); } } public class Clidlets extends Clidders { public void flipper() { System.out.println("Flip a Clidlet"); super.flipper(); } public static void main(String [] args) { new Clidlets().flipper(); } } Quel est le rsultat : A Flip a Clidlet B Flip a Clidder C Flip a Clidder Flip a Clidlet D Flip a Clidlet Flip a Clidder E Compilation fails.

E is correct. final methods cannot be overridden.

class Top { public Top(String s) { System.out.print("B"); } } public class Bottom2 extends Top { public Bottom2(String s) { System.out.print("D"); } public static void main(String [] args) { new Bottom2("C"); System.out.println(" "); }} Quel est le rsultat? A BD B DB C BDC D DBC E Compilation fails.

class Top { public Top(String s) { System.out.print("B"); } } public class Bottom2 extends Top { public Bottom2(String s) { System.out.print("D"); } public static void main(String [] args) { new Bottom2("C"); System.out.println(" "); }} Quel est le rsultat? A BD B DB C BDC D DBC E Compilation fails. E is correct

class Clidder { private final void flipper() { System.out.println ("Clidder"); } } public class Clidlet extends Clidder { public final void flipper() { System.out.println("Clidlet"); } public static void main(String [] args) { new Clidlet().flipper(); } } Quel est le rsultat? A Clidlet B Clidder C Clidder Clidlet D Clidlet Clidder E Compilation fails.

class Clidder { private final void flipper() { System.out.println ("Clidder"); } } public class Clidlet extends Clidder { public final void flipper() { System.out.println("Clidlet"); } public static void main(String [] args) { new Clidlet().flipper(); } } Quel est le rsultat? A Clidlet B Clidder C Clidder Clidlet D Clidlet Clidder E Compilation fails. A is correct

Polymorphisme Question
Soit lexemple dune classe Etudiant qui hrite de la classe Personne. Soit une mthode getNom() de Personne qui est redfinie dans Etudiant quelle mthode getNom() sera excute dans le code suivant, celle de Personne ou celle de Etudiant? Personne a =new Etudiant(5); a.getNom();

la mthode appele ne dpend que du type rel (Etudiant) de lobjet a et pas du type dclar (ici Personne ) cest la mthode de la classe Etudiant qui sera excute

Polymorphisme

NomComplet peut tre utilis la place de Nom

Polymorphisme Nom[] noms = new Nom[4]; noms[0] = new NomComplet("Cantonna", "Eric"); noms[1] = new Nom("Ronaldo"); noms[2] = new NomComplet("Overmars", "Marc"); ... for (int i = 0; i < 4; i++) { System.out.println(noms[i].getN om()); }

Polymorphisme

mme code dinvocation de getNom()


toujours sur un objet dclar de type Nom

System.out.println(noms[i].getNom());

appliqu aux objets de types diffrents


on a un effet diffrent selon lobjet qui reoit le message, et plus prcisment selon sa classe.

Polymorphisme (autre exemple)

Polymorphisme (autre exemple)


public class Polymorph { void prnt() { System.out.println("poly"); } } public class MonomorphA extends Polymorph { void prnt() { System.out.println("type A"); } } public class MonomorphB extends Polymorph { void prnt() { System.out.println("type B"); }

Polymorphisme (autre exemple)

... Polymorph pm = new Polymorph(); pm.prnt(); pm = new MonomorphA(); pm.prnt(); pm = new MonomorphB(); pm.prnt();

hritage & ( Upcasting /Downcasting)

Upcasting faire passer une classe drive pour sa super-classe sans risque toute mthode de la super-classe est aussi une mthode de la classe drive (par dfinition) Downcasting faire passer une super-classe pour une classe drive pas sans risque la classe drive tend la super-classe peut avoir des mthodes que la super-classe na pas

1. class Plant { 2. String getName() { return "plant"; } 3. Plant getType() { return this; } 4. } 5. class Flower extends Plant { 6. // insert code here 7. } 8. class Tulip extends Flower {} Quelle est la(les)ligne(s) de code insrer la ligne 6 est qui russira la compilation. A Flower getType() { return this; } B String getType() { return "this"; } C Plant getType() { return this; } D Tulip getType() { return new Tulip() ;}

1. class Plant { 2. String getName() { return "plant"; } 3. Plant getType() { return this; } 4. } 5. class Flower extends Plant { 6. // insert code here 7. } 8. class Tulip extends Flower {} Quelle est la(les)ligne(s) de code insrer la ligne 6 est qui russira la compilation. A Flower getType() { return this; } B String getType() { return "this"; } C Plant getType() { return this; } D Tulip getType() { return new Tulip() ;} A, C, and D

9 Given: 1. class Programmer { 2. Programmer debug() { return this; } 3. } 4. class SCJP extends Programmer { 5. // insert code here 6. } Quelle est la(les)ligne(s) de code insrer la ligne 5 est qui russira la compilation. A Programmer debug() { return this; } B SCJP debug() { return this; } C Object debug() { return this; } D int debug() { return 1; } E int debug(int x) { return 1; } F Object debug (int x) { return this; }

9 Given: 1. class Programmer { 2. Programmer debug() { return this; } 3. } 4. class SCJP extends Programmer { 5. // insert code here 6. } Quelle est la(les)ligne(s) de code insrer la ligne 5 est qui russira la compilation. A Programmer debug() { return this; } B SCJP debug() { return this; } C Object debug() { return this; } D int debug() { return 1; } E int debug(int x) { return 1; } F Object debug (int x) { return this; }

A, B, E, and F

10 Given: class Uber { static int y = 2; Uber(int x) { this(); y = y * 2; } Uber() { y++; } } class Minor extends Uber { Minor() { super(y); y = y + 3; } public static void main(String [] args) { new Minor(); System.out.println(y); }} Quel est le rsultat? A 6 B 7 C 8 D 9 E Compilation fails. F An exception is thrown.

10 Given: class Uber { static int y = 2; Uber(int x) { this(); y = y * 2; } Uber() { y++; } } class Minor extends Uber { Minor() { super(y); y = y + 3; } public static void main(String [] args) { new Minor(); System.out.println(y); }} Quel est le rsultat? A 6 B 7 C 8 D 9 E Compilation fails. F An exception is thrown. D is correct

1. class Dog { } 2. class Beagle extends Dog { } 3. 4. class Kennel { 5. public static void main(String [] arfs) { 6. Beagle bl = new Beagle(); 7. Dog dogl = new Dog(); 8. Dog dog2 = bl; 9. // insert code here 10. } } Quelle est la(les)ligne(s) de code insrer la ligne 9 est qui russira la compilation. A Beagle b2 = (Beagle) dog1; B Beagle b3 = (Beagle) dog2; D Beagle b4 = dog2; E None of the above statements will compile.

1. class Dog { } 2. class Beagle extends Dog { } 3. 4. class Kennel { 5. public static void main(String [] arfs) { 6. Beagle bl = new Beagle(); 7. Dog dogl = new Dog(); 8. Dog dog2 = bl; 9. // insert code here 10. } } Quelle est la(les)ligne(s) de code insrer la ligne 9 est qui russira la compilation. A Beagle b2 = (Beagle) dog1; B Beagle b3 = (Beagle) dog2; D Beagle b4 = dog2; E None of the above statements will compile. A and B are,correct

13 Given the following, 1. class X { void dol() { } } 2. class Y extends X { void do2() { } } 3. 4. class Chrome { 5. public static void main(String [] args) { 6. X x1 = new X(); 7. X x2 = new Y(); 8. Y y1 = new Y(); 9. // insert code here 10. } } Quelle est la(les)ligne(s) de code insrer la ligne 9 est qui russira la compilation. A x2.do2( ); B (Y) x2. do2( ); C ((Y)x2).do2(); D None of the above statements will compile.

13 Given the following, 1. class X { void dol() { } } 2. class Y extends X { void do2() { } } 3. 4. class Chrome { 5. public static void main(String [] args) { 6. X x1 = new X(); 7. X x2 = new Y(); 8. Y y1 = new Y(); 9. // insert code here 10. } } Quelle est la(les)ligne(s) de code insrer la ligne 9 est qui russira la compilation. A x2.do2( ); B (Y) x2. do2( ); C ((Y)x2).do2(); D None of the above statements will compile. C is correct

Le contrle d'accs

Modificateur mme class private default protected oui oui oui

mme Package Sous class Univers

oui oui oui

public

oui

oui

oui

oui

Gestion dheures complmentaires

Chaque enseignant de luniversit effectue un certain nombre dheures denseignement dans une anne. Suivant le statut de lenseignant, un certain nombre de ces heures peut-tre considr comme complmentaire. Les heures complmentaires sont payes sparment lenseignant. Les volumes horaires sont exprims en heures entires et le prix dune heure complmentaire est de 35 Euros. Le nom et le nombre dheures total dun enseignant sont fixs sa cration, puis seul le nom peut tre librement consult (mthode nom()). Dautre part on veut pouvoir librement consulter un enseignant sur son volume dheures complmentaires (mthode hc()) et sur la rtribution correspondante (mthode retribution()). Il y a deux types denseignants : les intervenants extrieurs : toutes les heures effectues sont complmentaires, les enseignants de la fac : seules les heures assures au del dune charge statutaire de 192h sont complmentaires. A Modliser les enseignants . B Comment modifier le modle pour y introduire les tudiants de troisime cycle qui assurent des enseignements: toutes les heures effectues sont complmentaires mais dans la limite de 96 heures.