1 Université de la Manouba Ecole Supérieure de Commerce Electronique Programmation Orientée Objet (3ème + 4ème Séance) 2ème année E-Serv et E-Com 2009/2010 Réalisé par : Nabil KHEMIRI [email protected] 2 Plan • • • • • • • • La notion de package La surcharge L'héritage super() et super La classe Object Les classes "enveloppe" (Wrappers) Héritage et organisation Le typage dynamique 3 La notion de package 4 Package (1) • Un package permet de regrouper des classes : bibliothèque de classes. • On regroupe dans un package des classes ayant une thématique et/ou des fonctionnalités communes. • un package contient des classes et des sous-packages • utiliser des packages améliore la sécurité d’utilisation des classes en renforçant l’encapsulation. 5 Package (2) 6 Package (3) Principaux packages Java: java.lang Les classes de base et la gestion des processus java.util Des structures de données bien pratiques java.io La gestion des flux comme l'accès aux fichiers java.math Calcul sur des nombres infinis java.awt Des composants graphiques : boutons, fenêtres ... java.applet Tout pour faire des applets java.net L'accès au réseau IP javax.swing Des composants graphiques sophistiqués : arbre ... java.sql La connexion aux bases de données relationnelles en SQL java.security Tout pour faire des transactions sécurisées 7 Package (4) • Importation des packages Java (toujours avant la déclaration d’une classe): Exemple: import java.awt.*; • Pour déclarer qu’une classe appartient `a un package, il faut déclarer ce package en entête du fichier source : package nom package.nom sous package ; 8 La surcharge 9 La surcharge On appelle surcharge le fait d’avoir plusieurs méthodes qui ont le même nom au sein de la même classe. Les exemplaires de la méthode ont des paramètres différents Ils peuvent avoir le même type de retour. Par contre, impossible d’avoir des types de retour différents pour les mêmes paramètres. 10 Surcharge : exemple class Additionneur { public static int somme(int a, int b) // 1 { return (a+b); } public static int somme(int a, int b, int c) // 2 { return (a+b+c); } public static float somme(float a, float b) // 3 { return (a+b); } public static float somme(int a, int b) // interdit à cause de 1 { return ((float)a+(float)b); } } 11 L'héritage 12 L'héritage On peut souvent classer les objets dans des arborescences de type de plus en plus génériques. Mot Adj V_Transitif prendre Verbe Nom V_Intransitif dormir 13 Un cas concret La classe Voiture représente toutes sortes de voitures possibles. On pourrait définir un camion comme une voiture très longue, très haute, etc. Mais un camion a des spécificités vis-à-vis des voitures : remorque…etc. On pourrait créer une classe Camion qui ressemble à la classe Voiture. Mais on ne veut pas réécrire tout ce qu'elles ont en commun. Solution 14 Vehicule Voiture Camion La classe Vehicule contient tout ce qu'il y a de commun à Camion et Voiture. Camion ne contient que ce qu'il y a de spécifique aux camions. Objectif de l'héritage On souhaite ne décrire qu'une seule fois le même traitement lorsqu'il s'applique à plusieurs classes. Evite de recopier (notamment les modifications). On crée une classe plus générique à laquelle s'applique le traitement. Toutes les classes plus spécifiques, héritant de cette classe, héritent de ce traitement, elles peuvent l'exécuter. Les classes filles contiennent d'autres traitements plus spécifiques. 15 Usage de l'héritage (1) • Dans l’en-tête da la classe dérivée, le mot clé extends sert à préciser la classe mère. • Une classe dérivée peut avoir une seule classe mère. • Les classes avec les modificateur final ne peuvent pas être des classes mères. 16 Usage de l'héritage: important (2) • • Une classe ne peut pas être privée private class toto {} Une classe ne peut pas être protégée protected class toto {} 17 Usage de l'héritage (3) Une classe spécifique hérite des méthodes et des attributs de sa classe mère (sauf ceux qui sont privés). On n'a pas besoin de les réécrire pour la classe fille. On peut cependant redéfinir une méthode de la classe mère dans la classe fille (de même signature). Le constructeur d'un objet doit toujours commencer par appeler le constructeur de sa classe mère. 18 Usage de l'héritage: exemple (4) Un objet de type Voiture peut utiliser toutes les méthodes de la classe Vehicule. Il doit disposer d’une valeur pour tous les attributs de la classe Vehicule. A tout moment, une méthode qui utilise un objet de type Vehicule peut manipuler un objet de type Voiture à la place de Vehicule. Cette dernière propriété est le polymorphisme. 19 Exemple 1 public class EtreHumain { public boolean sexe; public String nom; public String profession; // Constructeur public EtreHumain(boolean s, String n, String p) { sexe = s; nom = n; profession = p;} classe mère (superclass) public void sePresenter() { String s = (sexe) ? "homme" : "femme"; System.out.println("Mon nom est : " +nom); System.out.println("Je suis un(e) " + s); System.out.println("Ma profession : " + profession+"\n");} }. 20 Exemple (suite) classe dérivée (classe fille) public class Etudiant extends EtreHumain classe mère { (superclass) int numEtudiant; // Constructeur public Etudiant (boolean s, String n, String p, int numE) { super (s,n,"etudiant"); numEtudiant = numE; appel du constructeur } de la classe mère } 21 Exemple (suite) public class ClasseMain { public static void main(String[] args) { EtreHumain il = new EtreHumain(true, "Ali" , "enseignant" ); il.sePresenter(); Etudiant elle = new Etudiant(false,"Alia", " etudiant ", 000963); elle.sePresenter(); } 22 23 super() et super La méthode super() • • • • • super() permet d'appeler le constructeur de la classe mère. C'est la première chose à faire dans la construction d'une sous-classe. Appeler le constructeur de la classe mère garantit que l’on peut initialiser les arguments de la classe mère. On passe les paramètres nécessaires. Si l’on n’indique pas super(), appel du constructeur par défaut de la classe mère. 24 Le mot clef super super. est une référence sur l'objet père. super.Methode() permet d'appeler la méthodeMethode() de la classe mère. réutiliser le code de méthodes héritées. On peut accéder à un attribut hérité en écrivant: super.Attribut ou directement par Attribut. 25 26 super : exemple 1 27 super : exemple 2 Appel implicite du constructeur de la classe mère : exemple class Vehicule { // Vehicule() {} } class Voiture extends Vehicule { int nbPortes; double longueur; } Voiture(double lg, int nbP) { // super(); longueur = lg; nbPortes = nbP; } 28 Exercice • Ecrire une classe Animal qui dispose d’un attribut entier nbPattes. Cette classe dispose des méthodes suivantes : – – – • • • le constructeur, qui prend en argument un entier (le nombre de pattes). String toString(), qui renvoie une chaîne de caractères contenant le nombre de pattes de l’animal. affiche() qui affiche le nombre de pattes de l’animal (appeler la méthode toString(). Ecrire une classe Poule qui hérite de Animal Ecrire une classe Lapin qui hérite de Animal Ecrire une classe Main dans laquelle la méthode main() crée un Lapin et une Poule. 29 Corrigé (1) • La classe Animal : class Animal { protected int nbPattes; Animal(int nb){//constructeur nbPattes = 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()); } } 30 Corrigé (2) • Les classes Poule et Lapin : class Poule extends Animal { Poule(int nb){//constructeur super(nb); } public String toString() { return "Ceci est une poule dotée 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"; } } 31 Corrigé (3) • La classe Main : class Main { public static void main(String args[]) { Poule a = new Poule(2); Lapin b = new Lapin(4); a.affiche(); b.affiche(); } } 32 33 Héritage et appel de méthodes Appel de méthodes (1) class Vehicule { void demarrer() {…} } class Main { public static void main(String args[]){ Voiture v = new Voiture(); v.demarrer(); } } class Voiture extends Vehicule{ void demarrer() {…} } Méthode appelée ici Java commence par chercher la méthode dans la classe de l'objet créé. 34 Appel de méthodes (2) class Vehicule { void demarrer() {…} } class Main { public static void main(String args[]){ Voiture v = new Voiture(); v.demarrer(); } } class Voiture extends Vehicule{ } Méthode appelée ici Si la méthode n'existe pas dans la classe de l'objet créé, il va chercher dans la classe mère. 35 Appel de méthodes (3) class Vehicule { void demarrer() {…} } class Main { public static void main(String args[]){ Voiture v = new Voiture(); v.super.demarrer(); } } class Voiture extends Vehicule{ void demarrer() {…} } Méthode appelée ici Pour appeler directement la méthode de la classe mère, utiliser le mot clef super. 36 37 Héritage et visibilité Héritage et visibilité • Une classe fille hérite des attributs et méthodes public et protected de la classe mère. • Elle n’hérite pas des attributs et méthodes private. • Un objet d’une classe mère n’hérite pas des attributs et méthodes de ses classes filles. 38 Visibilité : exemple class Vehicule { protected double } longueur; class Voiture extends Vehicule { } … protected int nbPortes; On peut utiliser l’attribut longueur dans Vehicule et dans Voiture 39 Final Une classe déclarée final ne peut plus être étendue Cela signifie qu'aucune autre classe ne peut en hériter Une méthode déclarée final ne peut plus être dérivée par des sous-classes de la classe dont elle provient. Intérêt 1 : cela permet d'interdire la redéfinition d'une méthode par le biais de l'héritage Exemple : final boolean checkPassword() Intérêt 2 : cela permet de gagner du temps à la compilation. Une variable ou un attribut déclarés final sont constants => le compilateur interdit de les modifier. 40 Références • • • • 41 Arnaud Lanoix, Universit´e Nancy 2 (2006), cours Langages Orientés Objet – Java, http://kalysto.org/~nono/teaching/Java/04-package.pdf Abdel Belaïd, Universit´e Nancy 2 (2009-2010), cours Java, http://www.loria.fr/~abelaid/Enseignement/licPro/Cours5-heritage.pd Kiss Balint, www.fsz.bme.hu/~bkiss/InfoII/ Gaetan Dussaux, Formation Java2 (2000), http://gaetan.dussaux.free.fr/cours/java/