03-POO Avec Java

48
© 2006 Atos Origin. Document exclusivement réservé à usage commercial. Tout ou partie de ce document ne peut être copié, modifié, diffusé ou annoté sans accord écrit d'Atos Origin ou du client. Cours Java : Programmation Orientée Objet

description

POO java

Transcript of 03-POO Avec Java

Introduction Web

Cours Java : Programmation Oriente Objet 2006 Atos Origin. Document exclusivement rserv usage commercial. Tout ou partie de ce document ne peut tre copi, modifi, diffus ou annot sans accord crit d'Atos Origin ou du client.N1SommaireProgrammation objet avec javaLhritageLes interfacesConversion entre objetPaquetage et classesLes classe internesN2Programmation objet N3Structure dun programme Java Un programme Java contient au moins une classe public ayant la structure de la classe Bonjour prsente en introduction:public class Bonjour{.public static void main ( String[ ] args){........}}Le point dentre dun programme Java est toute classe dclare comme tant public, et contenant la mthode main ( ) de prototypepublic static void main ( String[ ] args)N4Structure dun programme Java public class Arguments{public static void main(String[ ] args){

if (args.length = = 0){System.out.println( `` Veuillez rentrer au moins 1 valeur ``);System.exit(1); / / sortie du programme avec code erreur = 1.}for ( int i = 0; i < args.length; i++ )

System.out.println(`` arguments `` + ( i + 1) + `` = `` + args[i] );}}

Un fichier peut contenir au plus une classe public, il doit alors porter exactement le mme nom que celle-ci. Par contre, un mme fichier peut contenir plusieurs classes non publiques.Un programme Java est constitu dun ensemble de fichier contenant des dfinition de classes parmi lesquelles au moins une doit tre publique et contenir un point dentre (mthode main ( ) ). Cest le nom de cette classe qui est fourni comme argument linterprte Java

N5 Classes et instanciation Toute fonction est dfinie dans une classe: on ne peut pas crire de fonctions lextrieur de la dfinition dune classe. Cest ainsi que le point dentre dun programme est dfini dans une classe.public class Bonjour {public static void main(String[ ] args){System.out.println(`` Bonjour ! ``); / / affiche `` Bonjour ! `` lcran}} Loprateur dinstanciation est new : tout objet est cre par new, auquel on prcise le type (la classe) de lobjet crer, et qui retourne une rfrence sur lobjet ainsi cre.Individu pierre = new Individu( ); N6Class et objetObjet

reprsente une entit dans le monde rel ou un lment du programme. Possde des tats et des comportements

Ex. un objet "Tlvision"ses tats = { allum/teint, chane courante, volume de son },

ses comportements = { allumer, changer de chane, changer de volume de son, teindre }Class

Un objet est une instance d'une classe la classe dcrit l'objet. Description des tats des attributs de la classe Description des comportements des mthodes de la classe.

N7Exemple d'une classpublic class Television {// Etat private int volume; private int chaine; private boolean estAllume;// Comportements public void allumer() { } public void eteindre() { } public void augmenterVolume() { } public void reduireVolume() { } public void changerChaine(int _chaine) { chaine=_chaine }}Rappel : Par convention, les noms des classes commencent par majusculeceux des attributs/ mthodes commence par minusculeN8InstanciationClassTelevisionboolean est Allumeint volumeint chaineObjetsEst Allume: truevolume: 5chaine: 1estAllume: truevolume: 6chaine: 2estAllume: falsevolume: 0chaine: 0Une classe peut tre rutilise pour instancier plusieurs objetsN9QuestionDfinir une classe reprsentant des voitures.

Les tats des objets voiture doivent dcrire

Dmarr ou non, position de boite de vitesse, vitesseniveau d'essence,

Les comportements d'une voiture incluent:

Dmarrer, arrterChanger de rapport de boite de vitesseAcclrer, ralentirTourner (selon le dgr spcifi)N10Solutionpublic class Voiture { private boolean estDemarre; private int posBoiteVitesse; private int vitesse; private int niveauEssence; public void demarrer() { } public void arreter() { } public void setPosBoiteVitesse(int pos) { posBoiteVitesse=pos;} public void accelerer() { } public void ralentir() { } public void tourner(int degre) { }}N11La cration d'un objet : instancier une classeIl est ncessaire de dfinir la dclaration d'une variable ayant le type de l'objet dsir. La dclaration est de la forme nom_de_classe nom_de_variable

L'oprateur new se charge de crer une instance de la classe et de l'associer la variable

Il est possible de tout runir en une seule dclaration

NExempleAttention: En Java, pour accder un champ ou invoquer une mthode dun autre objet, on doit disposer dune rfrence sur cet objet (et de plus cette ressource doit tre expose, cest--dire visible de lextrieur).

Rsultat de lexcutionN13Les constructeursUn constructeur est une mthode qui est appele au moment de la cration dun objet par new pour initialiser son tat, il doit:Porter le mme nom que la classe:Ne rien retourner et ne pas possder de type de retour (void est interdit)En gnral, tre publicExempleclass Individu {String nom, prenom;int taille, age; / / valeur par dfaut.Individu (String marzouk, String firdaous){nom = marzouk;prenom = firdaous;}

} N14Les constructeursQuelques remarques:

Il peut ny avoir aucun constructeur de dfini dans une classe, dans ce cas un constructeur par dfaut est fourni par le compilateur, qui naccepte aucun argument, et qui ne fait rien, part initialiser les variables pour les quelles on a spcifi une valeur initiale en les dclarant. On parle aussi de constructeur par dfaut pour la version de constructeur sans argument.

Il peut y avoir plusieurs constructeurs, ils doivent alors diffrer par leur liste darguments: nombres et / ou type des arguments.

Loprateur new invoque le constructeur avec la liste dargument prsente dans linstruction new. En cas de multiples constructeurs, le constructeur effectivement utilis est slectionn en fonction de cette liste darguments.N15Surcharge et enchanement des constructeurs Il est trs courant de surcharger la dfinition dun constructeur, afin de dfinir plusieurs formes dinitialisation: soit partir de donnes de natures diffrentes, soit partir dinformations plus ou moins compltes. Classiquement, dans le second cas, laction principale est dcrite dans le constructeur le plus prcis au niveau des paramtres, et les autres y font appel en compltant les paramtres pas pas, comme suit:

N16La rfrence this La plupart du temps this est omis et implicite.Sa prsence est toutefois indispensable dans le cas o apparait une confusion de notation, ou une ambigutDans l'exemple suivant, on a utilis dans le constructeur (de) Cercle() des homonymes des attributs de la classe.Evidemment, une telle criture, quoique correcte, nuit la lisibilit. public class Cercle { double x, y, r ; public Cercle(double x, double y, double r) { this.x = x ; this.y = y ; this.r = r ; } }

N17Exemple1 :

Constructeur avec un seul paramtreConstructeur avec trois paramtresConstructeur par dfautN18Lorsque des variables locales portent les mmes noms que les attributs de la classe, vous devez utiliser l'attribut "this" pour les distinguer.

Exemple2 :Raliser une classe Point permettant de reprsenter un point sur un axe. Chaque point sera caractris par un nom (de type char) et une abscisse (de type double). On prvoira :un constructeur recevant en arguments le nom et labscisse dun point,une mthode affiche imprimant (en fentre console) le nom du point et son abscisse,une mthode translate effectuant une translation dfinie par la valeur de son argument.crire un petit programme utilisant cette classe pour crer un point, en afchant les caractristiques, le dplacer et en afcher nouveau les caractristiques.

NExemple2 :

NExemple2 :

NEncapsulation et expositionCest le principe de sparation de la fonctionnalit et de la manire (le quoi et le comment), ou encore de linterface et de limplmentation.Linteraction des objets seffectue par lintrimaire des interfaces, indpendamment de la faon dont elles sont programmes Les donnes et mthodes dun objet qui ne sont pas directement accessibles depuis lextrieur sont dites encapsules: elles ne font pas partie de linterface de lobjet.Tous les langages objets offrent des mcanismes pour contrler plus au moins finement les rgles daccs aux membres dune classe. En Java, on dispose de modificateurs daccs:public: le membre (champ ou mthode) est accessible de tout autre objet. Quelque soit sa classesi on ne spcifie pas dattribut dexposition, le membre nest utilisable que par les objets de classes du mme package mais pas par les sous classes situes dans dautres packages. On parle dexposition de type friendlyprotected: la visibilit est limite aux objets de classes drives quel que soit leur emplacement. Il inclut de plus lautorisation daccs de type friendly.private: le membre ne peut tre accd des objets dautres classes.N22TPNLHritageN24Prsentation L'avantage essentiel d'un langage orient-objet est que le code est rutilisable. Grce l'hritage, on peut faire driver une nouvelle classe d'une classe existante et ainsi en rcuprer les attributs et mthodes, sans avoir la rcrire compltement. Terminologie :On dit que la classe Enfant hrite de la classe Parent, qu'elle tend cette ancienne classe. Enfant est alors une sous-classe (subclassed) de ParentParent est une super-classe (surclasse) de Enfant. Une sous-classe reprend toutes les proprits et mthodes de la super-classe, tout en pouvant intgrer de champs nouveaux (attributs et mthodes). Ceux-ci caractriseront et distingueront les objets de la classe hrite des objets de la classe parent. Autrement dit, cela signifie qu'une instance de la classe Enfant aura la possibilit d'utiliser, outre des attributs et mthodes supplmentaires, toutes les ressources dfinies dans Parent (si des modificateurs ne l'empche pas , voir plus loin). L'hritage est donc une relation entre classes, semblable la relation d'inclusion d'un sous-ensemble dans un ensemble : un objet de la classe qui hrite est aussi un objet de la classe d'origine, mais il acquiert des proprits particulires . Java ne permet que l'hritage simple. Une sous-classe ne peut hriter que d'une seule classe.

N25Notations et exemples [modificateur] class Enfant extends Parent { ...... // la classe Enfant hrite de la classe Parent } En Java, toutes les classes sont drives de la classe spciale Object. C'est la racine de la hirarchie des classes (cela entraine que toute classe Java possde dj sa naissance un certain nombre de variables et de mthodes).Dans la dclaration d'une classe si la clause extends n'est pas prsente, la surclasse est donc Object directement ExempleSoit une classe gnrale Ville qui possde 2 attributs d'instance privs nom et nbHabitants (on aurait pu ajouter une variable statique pour numroter les villes construites)

public class Ville { private String nom; private int nbHabitants; N26Donnes prives et hritage Si une variable de la classe Parent est dclare private, elle n'est visible que dans sa propre classe, mme la classe Enfant n'y accde pas !

Par exemple dans l'exemple de la classe ville, les variables nom et nbHabitants dclares private ne sont pas accessibles par la classe Capitale qui en hrite. public class Ville { private String nom; private int nbHabitants; ....... public class Capitale extends Ville { ............ Attention, une variable dclare private dans la super-classe est bien hrite par la classe Enfant. chaque instance de Enfant en possde une copie qui ne peut ni consulte, ni initialise directement. Pour cela, il faut faire appel une mthode ou un constructeur de Parent. Ainsi, dans la classe Capitale qui hrite de Ville, nom doit tre initialis par un constructeur de Ville, ou affect par l'intermdiaire de la mthode d'accs setNom() N27Donnes prives et hritageIl peut tre souhaitable d'avoir un accs direct certaines variables d'instance de Parent, en lecture comme en modification, tout en les "protgeant" de l'extrieur, des autres classes. Il faut pour cela les dfinir avec la qualification protected Exemple : dans la classe Capitale, pour pouvoir facilement agir sur la variable nbHabitants, il faudrait remplacer private par protected. public class Ville { /** nom est private, non visible de la sous-classe Capitale, * accessible seulement par les mthodes publiques setNom() et getNom() */ private String nom; /** nbHabitants est protg de l'extrieur mais pas de la descendance de Ville. * Cette variable est donc visible et manipulable directement dans la sous-classe Capitale */ protected int nbHabitants; .......

N28Classes finales et hritageVariable finaleun attribut dclar final est une constante, dont on doit donner tout de suite la valeur. Par habitude, son nom est crit en majuscules. Exemple : final int DOUZE=12; Un mcanisme permet de bloquer l'hritage : dclarer une classe "finale", prcde du modificateur final la rend impossible tre tendue.Exemple : la bibliothque mathmatique dfinie dans la classe Mathpublic final class Math extends Object ne peut tre ni tendue, ni instancie car toutes les variables et methodes y sont dclares statiques. D'o les appels comme Math.sin(Math.PI/2) ... Pensez vous que le code suivant sera compil ?final class MaFinaleClasse extends MaClasse { ... class MaSousFinaleClasse extends MaFinaleClasse { ... On peut agir plus finement au niveau d'une mthode : pour empcher qu'une mthode puisse tre redfinie par hritage, on la qualifie par final

N29Classe abstraite Au contraire d'une classe finale, une classe abstraite est une classe n'ayant pas d'instancesElle n'est utilisable qu' travers sa descendance. Autrement dit, une telle classe ne peut pas tre instancie directement, et doit toujours tre drive pour pouvoir gnrer des objets.abstract class MaClasseAbstraite extends MaClasse { ... Elle sert uniquement regrouper des attributs et mthodes communes un groupe de classes pour constituer une vritable "factorisation" de ces classes et ne sera utilisable que par l'intermdiaire de ses sous-classes.Exemple: abstract class Forme{private String nom;}N30Exemple de classe abstraite

Mthode dfinir dans les classe descendantesN31Les interfacesN32Les interfacesEn Java, l'hritage multiple n'existe pas, on ne peut pas faire hriter une classe de plusieurs classes. Pour contourner la difficult, on a cr des interfaces.Une interface est une collection de dclarations de mthodes dpourvues d'implmentation.Le code doit obligatoirement tre prcis dans la redfinition des mthodes de l'interface. Voir ce mcanisme dans la gestion des vnements auxquels peut ragir une interface graphique.N33Les interfaces: exemple

Triplet hrite les attributs de Doublet et le comportement de SommeProduit

N34Redfinition de constructeurs et de mthodesDfinitionLorsque l'on code la classe Enfant, on a la possibilit de remplacer des mthodes de la super-classe Parent, simplement en dfinissant une mthode avec le mme nom et les mmes paramtres. On appelle cette fonctionnalit redfinition des mthodes hrites. Utiliser une mthode (redfinie) de la classe parentL' opration de redfinition d'une mthode masque invitablement la mthode d'origine de la super-classe Parent.Pour pouvoir faire appel tout de mme la mthode Parent, on crit le mot-cl super devant le nom de la mthode.Supposons qu'on ait redfini dans la classe Enfant, la mthode M() dj dfinie dans la classe Parent.Alors, super.M(), fait appel la mthode M() dfinie dans la classe Parent et non celle d'Enfant. Utiliser un constructeur (redfini) de la classe parentPar contre, il n'est pas possible de redfinir un constructeur, puisque celui-ci porte le nom de la classe dans laquelle il est dclar, et que les noms des deux classes diffrent obligatoirement. On peut faire appel un constructeur de la sur-classe en utilisant le mot spcial super()L'appel au constructeur super() doit tre la premire instruction du bloc.

N35PolymorphismeIl s'agit de la possibilit pour Java de choisir le code correct de la mthode excuter, au moment de l'excution, parmi un ensemble de mthodes redfinies, en fonction de l'objet auquel s'adresse la mthode. (ceci rend le choix du code dynamique).Exemple: prenons les classe de lexemple prcdent:

Le rsultat de lexcution a montr que la mthode somme excut est bien celle de la classe Triplet et non pas de Doublet pour lobjet t.N36Exercice:Ecrire une classe Personne avec trois attributs (nom, prenom et age),et une mthode afficher() qui affiche le nom , prnom et lge de la personne et les getters & setters des attributs.Ecrire la classe Etudiant qui hrite de Personne en ajoutant deux autres attributs (classe et section).Ecrire une troisime classe Professeur qui hrite elle aussi de Personne en ajoutant les attributs matiere et experience (nombre dannes).Redfinissez dans chaque classe la mthode afficher afin dafficher le mtier de chaque personne.Dans la classe TestMain (dfinissez la mthode main) crer des personnes et essayez dexcuter la mthode afficher pour chacun.Dans un deuxime temps affectez vos personnes des tudiants et des professeurs (personne1=new Etudiant()) excuter une deuxime fois votre programme. Qu'est ce que vous remarquez ?Essayez dafficher le mtier pour les professeurs et la classe pour les tudiants. Est-ce que vous arrivez compiler votre programme? Sinon, pourquoi?

N37Conversion entre objetN38Conversion entre objetEn Java, tout objet a un type effectif (celui spcifi lors de sa cration par new), mais peut tre considr aussi comme du type Object ou tout autre anctre de sa classe. Le type Object est trs basique et noffre que trs peu de mthodes, celles communes tout objet: toString( ), equals ( ), etc. Ceci est utilis en particulier par les types pile (Stack) et table (Vector), qui, pour tre capables de collectionner des objets de types quelconques, considrent simplement leurs lments comme des rfrences sur Object.Leffet pervers de ce mcanisme est quun lment sorti dune pile ou dune table apparat toujours avec le type Object. En effet la mthode pop( ) des objets Stack a le prototype suivant:

On perd la notion String car on obtient un type objet ce qui pourrait conduire une erreur, si on fait appel des fonctions utilisant comme argument un String telle que: println(obj.charAt(0)) erreur la compilationmy_stack.push(``hello``); / / mise en pile dun objet (String).........Object obj = my_stack.pop( ); / / Sortie de pile dun objetN39Conversion entre objet: suiteDans ce genre de situation, si le programmeur est sr du type effectif de son objet, par exemple String, il peu demander au compilateur par une instruction de conversion (cast) de forcer String le type de cette rfrence sur Object

Java vrifie toujours lexcution la validit des conversions dobjets. En cas derreur de logique dans une conversion, il y aura leve dune exception de type ClassCastException lexcution. Pour limiter ces erreurs de conversion, Java offre au programmeur un oprateur de comparaison de types: instanceof. ( ref instanceof Type ) est une expression logique valant true si ref est une rfrence sur un objet de type compatible avec Type, et false sinon.my_stack.push(``hello``); / / mise en pile dun objet (String).........String s = (String) my_stack.pop( ); / / Sortie de pile dun objet, et cast/ / s reoit une rfrence sr Objet force au type rfrence sur Stringif (s.length ( ) > 50) . / / on peut appeler via s les mthodes de StringN40Le paquetage et classesN41Le paquetage et classesUn paquetage est un groupe de classes connexes destines fournir un ensemble de fonctionnalits lies. Cest une forme de classe gante: un paquetage encapsule un ensemble de classes et dinterfaces. Contrairement aux bibliothques que lon rencontre dans dautres langages, la notion de paquetage est prise en compte dans le mcanisme de protection (encapsulation).Encapsulation et paquetage:Seuls les membres public dun paquetage sont utilisables lextrieur du paquetage.Les membres protected dune classe sont utilisables partout dans le paquetage dont fait partie la classe en question (protected implique friendly ).Les membres dont laccs nest pas spcifi sont galement visibles dans tout le paquetage, mais pas dans les sous classes de la classe dans laquelle ils sont dclars.Exemple: le paquetage java.utile fournit un ensemble de classe pour la programmation de la date et lheure, larchivage des fichiers, la gestion des structures de donnes.On dclare le nom du paquetage dont fait partie une classe en plaant une directivepackage nom_de_package;En tte de fichier. Toutes les classes qui y sont dfinies en feront alors partieN42Paquetage: suiteOn utilise un paquetage de deux faons:En accdant ses membres par le biais de la notation pointeOu bien, on peut rendre librement accessible tout ou une partie du paquetage laide de la directive import place en tte de fichier.import nom_de_package.nom_de_classe; / / on importe une seule classe du paquetageOu bienimport nom_de_package.*; / / on importe toutes les classes du paquetage

Classes importespackageN43Accs aux classes dune applicationLa compilation dune source java ou lexcution dune application ncessite que le compilateur ou linterprteur localisent les classes utilises par lapplication. A priori les classes peuvent tre localises nimporte ou sous la machine ou mme sur une machine distante. Le moyen utilis consiste indique au compilateur ou linterprteur la liste des rpertoires dans lesquelles les classes sont susceptibles dtre places (similaire au mcanisme de la variable PATH).Utiliser la variable denvironnement CLASSPATH.Lors de la compilation, le compilateur cherche le code des classes importes dans lun des rpertoires spcifis dans la variable CLASSPATH. Lun de ces rpertoires doit contenir le fichier .class recherch. Linterprteur utilise galement cette variable pour rechercher les classes.Exemple sous Windows:c: \ > set CLASSPATH = . ; c : \ mysql \jdbc \ mm.mysql-2.0.6.1.jar ; c : \ oracle \jdbc \ ojdbc14.jar Linconvnient est que lemploi dune nouvelle bibliothque oblige modifier la variable denvironnementN44Classe interneN45Classe interneLa conception dune application fait que parfois certaines classes ne sont utilises que par une seule classe. On peut alors dclarer ces classes dans la classe utilisatrice.Tout type de classe peut tre interne: instanciable, abstraite ou interfaceLaccs une telle classe est contrlable compltement: prive, public, protge ou paquetage.On peut driver une classe interne sauf si elle est dclare finaleUne classe interne peut, elle aussi, inclure des classes internes.N46Classe interne: exemple

Rsultat de lexcution123N47Classe interneUne classe interne est utilise diffremment selon quelle est dclare static ou pasUne classe interne non statique accde directement aux champs et mthodes de la classe englobante. Cest possible car une instance de la classe interne contient une rfrence vers linstance de la classe englobante. Cela simplifie le code crit par rapport une classe externe. En dehors de la classe englobante, la cration dun objet de la clase interne ncessite un objet de la classe englobante.

ClasseEnglobante oce = new classeEnglobante ( );ClasseInterne oci = oce.new classeInterne ( );

Une classe interne statique na pas accs quaux membres statiques de la classe englobante. Linstanciation de la classe interne pourra se faire en dehors de la classe englobante de la manire suivante: ClasseInterne oci = new classeEnglobante.ClasseIntene ( );Un intrt supplmentaire est quon peut nommer les classes internes sans risque de conflit avec dventuels noms de classes externes la classe englobante.Pour une classe nomme ClasseInterne interne une classe nomme ClasseEnglobante, le compilateur gnre le fichier ClasseEnglobante$ClasseInterne.class.N48