389
Programmation objet en Java Xavier Crégut <[email protected]> Octobre 2009 X. Crégut Programmation objet en Java 1

Livre Java

Embed Size (px)

DESCRIPTION

Développement Java

Citation preview

  • '&

    $

    %

    Programmation objet en Java

    Xavier Crgut

    Octobre 2009

    X. Crgut Programmation objet en Java 1

  • '&

    $

    %

    Objectifs du cours

    Les objectifs de ce cours sont : la programmation (oriente) objet en lillustrant avec le langage Java ; lutilisation de la notation UML (Unified Modeling Language) pour

    reprsenter larchitecture statique du systme (diagramme de classes) ; les exceptions ; la programmation par contrat ; les interfaces graphiques (Swing) et la programmation vnementielle ; des lments mthodologiques.Remarque : Mme si le langage cible est Java, les concepts prsents icipeuvent tre appliqus dans le cadre dautres langages objets (C++, Eiffel,etc.).

    X. Crgut Programmation objet en Java 2

  • '&

    $

    %

    Rfrences[1] Cay S. Horstmann and Gary Cornell. Au cur de Java 2, volume 1 Notions

    fondamentales. Campus Press, 8 edition, 2008.[2] Bruce Eckel. Thinking in Java. Prentice-Hall, 3 edition, 2002.

    http://www.mindviewinc.com/Books/.

    [3] Joshua Bloch. Java efficace. Vuibert, 2002.[4] David Flanagan. Java en concentr. OReilly, 5 edition, 2006.[5] Mark Grand. Patterns in Java : A Catalog of Reusable Design Patterns Illustrated with

    UML, volume 1. Wiley, 2 edition, 2002.[6] Sun. The Source for Java Technology. http://java.sun.com.[7] James Gosling, Bill Joy, Guy Steele, and Gilad Bracha. The Java Language Specification.

    Addison-Wesley, 3 edition, March 2005. http://java.sun.com/docs/books/jls/.[8] Bertrand Meyer. Object-oriented software construction. Prentice Hall, 2nd edition, 1997.[9] Pierre-Alain Muller and Nathalie Gaertner. Modlisation objet avec UML. Eyrolles, 2

    edition, 2003.[10] Martin Fowler. UML 2.0. CampusPress Rfrence, 2004.[11] OMG. UML Resource Page. http ://www.omg.org/uml/.

    X. Crgut Programmation objet en Java 3

  • '&

    $

    %

    Plan du cours

    Exemple introductif : approche objet vs approche traditionnelle (C) . . . . . . . . . . . 5 La plateforme Java : caractristiques et outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Algorithmique en Java : types, oprateurs, structures de contrle . . . . . . . . . . . . . 38 Paquetages : structuration dune application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Encapsulation : Classes et objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62 Tableaux, String et autres classes de lAPI Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Spcification de comportement : les interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Paramtrisation : la gnricit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Hritage et concepts associs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195 Responsabilit dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262

    Programmation par contrat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300

    Classes internes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .318 Quelques API Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 UML, Design patterns, Interfaces graphiques . . . . . . . . . . . . . . . . . . . autres supports

    X. Crgut Programmation objet en Java 4

  • '&

    $

    %

    Approche objet : Exemple introductif

    Exercice 1 : quation du second degrComment rsoudre (afficher les solutions de) lquation du second degr : avec une approche traditionnelle (langage impratif ou fonctionnel) ; avec une approche objet.Remarque : On se limite au cas gnral dune quation avec deux racinesrelles.

    X. Crgut Programmation objet en Java 5

  • '&

    $

    %

    Les quations : version traditionnelle 1 public class quationTraditionnelle {2 public static void main (String[] args) {3 double a, b, c; // coefficients de lquation45 // Initialiser les coefficients6 a = 1;7 b = 5;8 c = 6;9

    10 // Calculer le discriminant11 double delta = (b * b - 4 * a * c);1213 // Calculer les racines (sans contrle de cohrence)14 double x1 = (-b + Math.sqrt(delta)) / 2 / a;15 double x2 = (-b - Math.sqrt(delta)) / 2 / a;1617 // Afficher les rsultats18 System.out.println("Racine 1 : " + x1);19 System.out.println("Racine 2 : " + x2);20 }21 }

    X. Crgut Programmation objet en Java 6

  • '&

    $

    %

    Approche objet : changement de faon de penserPrincipe : Pour pouvoir penser une solution informatique, il fautsubstituer la notion de PROGRAMME la notion dORGANISME,ensemble dobjets pouvant communiquer entre eux.

    O1

    O2

    O3

    O4

    O5

    Les systmes logiciels sont caractriss au premier chef par les objetsquils manipulent, non par la fonction quils assurent.Ne demandez pas CE QUE FAIT LE SYSTME.Demandez QUI IL LE FAIT !

    Bertrand Meyer

    X. Crgut Programmation objet en Java 7

  • '&

    $

    %

    Les quations : version (plus) objet1 /** Modlisation dune quation du second degr et de sa rsolution.2 * @author Xavier Crgut3 * @version 1.34 */5 class quation {67 /** Coefficients de lquation */8 double coeffA, coeffB, coeffC;9

    10 /** Solutions de lquation */11 double x1, x2;1213 /** Dterminer les racines de lquation du second degr. */14 void rsoudre() {15 double delta = // variable locale la mthode rsoudre16 this.coeffB * this.coeffB - 4 * this.coeffA * this.coeffC;17 this.x1 = (- this.coeffB + Math.sqrt(delta)) / 2 / this.coeffA;18 this.x2 = (- this.coeffB - Math.sqrt(delta)) / 2 / this.coeffA;19 }20 }

    Attention : Cette classe quation est simpliste !

    X. Crgut Programmation objet en Java 8

  • '&

    $

    %

    Les quations : version (plus) objetUne quation est caractrise par ses coefficients, ses racines et le fait que larsoudre consiste calculer ses racines en fonction de ses coefficients.

    On en dduit : les attributs : ltat dun objet quation (les coefficients et les racines) ; les mthodes : les actions qui peuvent tre ralises sur un objet de

    type quation (rsoudre lquation).Remarque : On ne sintresse quau cas gnral (deux solutions) delquation du second degr coefficients et valeurs dans les rels.

    Attention : Outre la remarque prcdente, cette classe est un exemple nepas suivre : il est seulement introductif !

    Exercice 2 En deuxime lecture, expliquer pourquoi cette classe quationconstitue un exemple ne pas suivre.

    X. Crgut Programmation objet en Java 9

  • '&

    $

    %

    Programme principal manipulant les quations1 class Rsolutionquation {23 /** Rsoudre une quation du second degr. */4 public static void main (String[] args) {5 quation unequation; // une poigne sur une quation6 unequation = new quation(); // cration dun objet quation78 // Initialiser les coefficients9 unequation.coeffA = 1;

    10 unequation.coeffB = 5;11 unequation.coeffC = 6;1213 // Calculer les racines de lquation14 unequation.rsoudre();1516 // Afficher les rsultats17 System.out.println(" Racine 1 : " + unequation.x1);18 System.out.println(" Racine 2 : " + unequation.x2);19 }20 }

    Exercice 3 Dessiner lvolution de la mmoire.

    X. Crgut Programmation objet en Java 10

  • '&

    $

    %

    Quelques constatations Une classe ressemble un enregistrement dans lequel on peut mettre la

    fois des champs (attributs) et des fonctions (mthodes). En Java, on les appelle respectivement attributs et mthodes.

    En UML on utilise les termes attributs et oprations. Les objets sont toujours crs dans le tas (allocation dynamique) par

    loprateur new. Les objets ne sont accessibles que par lintermdiaire de poignes (ou

    variables dobjet) quivalentes des pointeurs. Le type de la poigneconditionne les objets qui peuvent lui tre attachs.

    Il ny a pas de delete car Java intgre un ramasse-miettes. La mmoire des variables locales (types lmentaires ou poignes) est

    alloue dans la pile (gre par le compilateur). On utilise la notation pointe pour accder lattribut dun objet ou lui

    appliquer une mthode.

    X. Crgut Programmation objet en Java 11

  • '&

    $

    %

    Autre version en langage CUne approche traditionnelle intgrant la notion de type abstrait nousconduit identifier deux constituants pour ce petit exercice : un module dcrivant lquation (le type Equation et les oprations

    associes) ; un programme principal correspondant la rsolution dune quation

    particulire.

    En langage C, le module se traduit en deux fichiers : un fichier dentte equation.h qui contient la spcification (interface) du

    module ; un fichier dimplantation equation.c qui contient limplantation du

    module ;Le programme principal est dans le fichier test_equation.c.

    X. Crgut Programmation objet en Java 12

  • '&

    $

    %

    Le fichier dentte du module : equation.h1 /*******************************************************************2 * Objectif : Modlisation dune quation du second degr3 * et de sa rsolution.4 * Auteur : Xavier CRGUT 5 * Version : 1.26 ******************************************************************/78 #ifndef EQUATION__H9 #define EQUATION__H

    101112 /* Dfinition du type Equation */13 struct Equation {14 double coeffA, coeffB, coeffC; /* coefficients de lquation */15 double x1, x2; /* racines de lquation */16 };1718 typedef struct Equation Equation;192021 /* Dterminer les racines de lquation du second degr. */22 void resoudre(Equation *eq);2324 #endif

    X. Crgut Programmation objet en Java 13

  • '&

    $

    %

    Le fichier dimplantation du module : equation.c12 #include 34 #include "equation.h"56 void resoudre(Equation *eq)7 {8 double delta = /* variable locale la fonction resoudre */9 eq->coeffB * eq->coeffB - 4 * eq->coeffA * eq->coeffC;

    1011 eq->x1 = (- eq->coeffB + sqrt(delta)) / 2 / eq->coeffA;12 eq->x2 = (- eq->coeffB - sqrt(delta)) / 2 / eq->coeffA;13 }

    Exercice 4 Comparer la fonction rsoudre en C et la mthode rsoudre enJava.

    X. Crgut Programmation objet en Java 14

  • '&

    $

    %

    Le programme principal : test_equation.c1 #include 2 #include 34 #include "equation.h"56 int main()7 {8 Equation uneEquation; /* notre quation */9

    10 /* Initialiser les coefficients */11 uneEquation.coeffA = 1;12 uneEquation.coeffB = 5;13 uneEquation.coeffC = 6;1415 /* Calculer les racines de lquation */16 resoudre(&uneEquation);1718 /* Afficher les rsultats */19 printf(" Racine 1 : %f\n", uneEquation.x1);20 printf(" Racine 2 : %f\n", uneEquation.x2);2122 return EXIT_SUCCESS;23 }

    X. Crgut Programmation objet en Java 15

  • '&

    $

    %

    De nouvelles constatations On peut avoir une approche objet mme avec un langage non objet !

    Attention : On naura pas tous les bnfices dune approche objet...sauf faire des choses trs (trop !) compliques.

    Dans la version C, il y a sparation entre la spcification (interface) etlimplantation (corps) du module alors quen Java tout est dans unemme construction syntaxique (la classe), dans un seul fichier.

    La fonction resoudre est lextrieur de lenregistrement. Le paramtre eq de rsoudre a disparu en Java. Il est devenu implicite.

    Pour y faire rfrence, on utilise le mot-cl this. Dans la version C, on utilise #include .

    En Java, on indique o se trouve llment utilis : Math.sqrt.Voir aussi CLASSPATH (T. 28). et import (T. 60)

    Le new de Java correspondrait un malloc en C. En Java, la mmoire estlibre automatiquement (pas de delete ou free).

    X. Crgut Programmation objet en Java 16

  • '&

    $

    %

    Plate-formes Java proposes par Sun J2SE : Java 2 Platform Standard Edition

    JRE (Java Runtime Environment) : Java API, JVM... pour excuter uneapplication/applet Java

    JDK (J2SE Development Kit) : JRE + outils de dveloppement(compilateur...)

    J2EE (Java 2 Platform Enterprise Edition) : dveloppementdapplications multi-couches orientes composants (EntrepriseJavaBeans), web services (servlet, JSP, XML)...

    J2ME (Java 2 Platform Micro Edition) : Java pour les tlphonesmobiles, PDA et autres appareils embarqus. Optimis pour la mmoire,la puissance de traitement et les E/S.

    Java Card : fournir un environnement sr sur des cartes avec de faiblesmmoires et capacits de traitement.

    X. Crgut Programmation objet en Java 17

  • '&

    $

    %X. Crgut Programmation objet en Java 18

  • '&

    $

    %

    Premier programme Java

    1 /** Un programme minimal qui, de manire classique, affiche bonjour .2 * En Java, tout est dfini dans une classe mme dans le cas du3 * programme le plus simple !4 */5 public class Bonjour {6 // Mthode principale : cest la mthode excute lorsque7 // lutilisateur demande dexcuter la classe Bonjour.8 // args : les arguments de la ligne de commande (hors java Bonjour)9 /** Dire bonjour tout le monde.

    10 * @param args ceux qui dire bonjour11 */12 public static void main(String[] args) {13 for (int i = 0; i < args.length; i++) {14 // Afficher sur la sortie standard15 System.out.println("Bonjour " + args[i]);16 }17 System.out.println("Bonjour tout le monde !");18 /* Les commentaires la C sont aussi disponibles */19 }20 }

    X. Crgut Programmation objet en Java 19

  • '&

    $

    %

    Principaux outils du J2SE Developer Kit (JDK)Le JDK (J2SE Developer Kit) est lenvironnement de dveloppement(minimal) pour Java propos par Sun. javac : compilateur de sources Java java : machine virtuelle (interprte code binaire) javadoc : gnrateur de documentation HTML jar : constructeur darchives appletviewer : interprte des Applet javap : dsassembleur code binaire jdb : outil de mise au point (interfac avec DDD) ... et bien dautres !Remarque : Il existe de nombreux IDE (Integrated DevelopmentEnvironments) pour Java.

    X. Crgut Programmation objet en Java 20

  • '&

    $

    %

    Le compilateur : javacLe compilateur javac produit du code intermdiaire (byte code).

    javac Bonjour.java (==> produit Bonjour.class)

    Java est donc un langage compil. Le compilateur vous aidera dtecter etcorriger les erreurs dans vos programmes (messages relativement clairs).Remarque : Depuis la version 1.2, javac calcule les dpendances et compiletous les fichiers ncessaires. Il suffit donc de compiler la classe principale.

    licorne> javac -verbose Rsolutionquation.java---- extraits de laffichage ----

    [parsing started Rsolutionquation.java][checking Rsolutionquation][loading ./quation.java][parsing started ./quation.java][wrote Rsolutionquation.class][checking quation][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/lang/Math.class)][wrote ./quation.class][total 1148ms]

    X. Crgut Programmation objet en Java 21

  • '&

    $

    %

    Compilation de Rsolutionquation.javalicorne> javac -verbose Rsolutionquation.java[parsing started Rsolutionquation.java][parsing completed 305ms][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/lang/Object.class)][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/lang/String.class)][checking Rsolutionquation][loading ./quation.java][parsing started ./quation.java][parsing completed 5ms][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/lang/System.class)][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/io/PrintStream.class)][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/io/FilterOutputStream.class)][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/io/OutputStream.class)][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/lang/StringBuffer.class)][wrote Rsolutionquation.class][checking quation][loading /opt/j2sdk1.4.0/jre/lib/rt.jar(java/lang/Math.class)][wrote ./quation.class][total 1148ms]

    X. Crgut Programmation objet en Java 22

  • '&

    $

    %

    La machine virtuelle Java (JVM) : javaLe code produit par javac tant du code intermdiaire, il ne peut pas tredirectement excut par la machine.= Il faut donc utiliser une machine virtuelle Java : java dans le JDK :

    licorne> java Bonjour XavierBonjour XavierBonjour tout le monde !

    On donne en paramtre une classe Java (donc sans extension !) qui doitcontenir la mthode principale main, suivi des ventuels arguments de laligne de commande.

    Attention : Ne pas mettre dextension derrire le nom de la classe.licorne> java Bonjour.classException in thread "main" java.lang.NoClassDefFoundError: Bonjour/class

    licorne> java Bonjour.javaException in thread "main" java.lang.NoClassDefFoundError: Bonjour/java

    Le . est le sparateur de paquetages (quivalent des rpertoires).

    X. Crgut Programmation objet en Java 23

  • '&

    $

    %

    Outil dextraction de documentation : javadocLe JDK contient un outil, javadoc, qui engendre automatiquement ladocumentation des classes Java partir de leur code source.

    javadoc *.java (==> produit plein de fichiers HTML)

    Intrt : La documentation est directement rdige dans le source Java,avec le code. Ceci facilite sa mise jour et donc favorise (mais ne garantitpas !) sa cohrence.javadoc permet une prsentation standardise de la documentation.Moyen : Cest bien entendu au programmeur de fournir les lments de ladocumentation. Il utilise alors des commentaires spcifiques /** */ placsavant llment documenter.

    Attention : Par dfaut, seules les informations publiques sont documentes.

    Remarque : Voir principe de lauto-documentation (T. 27).

    X. Crgut Programmation objet en Java 24

  • '&

    $

    %

    Documentation engendre

    X. Crgut Programmation objet en Java 25

  • '&

    $

    %

    Les commentairesJava propose trois types de commentaires : Les commentaires la C : utiles pour mettre en commentaire plusieurs

    lignes de code./* Un commentaire qui peut se continuer

    sur plusieurs lignes */

    /* Exactement comme en C

    * et donc ils ne peuvent pas tre imbriqus*/

    Attention : Ces commentaires ne peuvent pas tre imbriqus. Les commentaires la C++ :

    // Ce commentaire se termine avec la fin de la ligne

    Avantage : On ne risque pas doublier de les fermer !Un bon diteur doit permettre de les ajouter et les enlever facilement.

    Les commentaires structurs exploits par loutil javadoc.

    X. Crgut Programmation objet en Java 26

  • '&

    $

    %

    Les commentaires structursObjectif : Les commentaires structurs sont extraits par loutil javadoc pourproduire la documentation de la classe au format HTML.

    Ces commentaires peuvent contenir : des tiquettes spcifiques javadoc : elles commencent par @ (@author,

    @param, @return, @see, etc.) ; des lments HTML.

    /** Les commentaires structurs commencent par une double toile (**).

    * Ils peuvent contenir des lments HTML.

    * Ils sont placs devant lentit quils dcrivent : une classe, un

    * attribut, une mthode*/

    Principe de lauto-documentation : le concepteur dun module doitsastreindre exprimer toute linformation sur le module dans le modulelui-mme.

    X. Crgut Programmation objet en Java 27

  • '&

    $

    %

    Lien avec le gestionnaire de fichiers : CLASSPATHPar dfaut, les outils du JDK cherchent les classes dans le rpertoire courant.

    Si les classes sont dans plusieurs rpertoires, on utilise le classpath : soit avec loption -classpath des outils du JDK ; soit avec la variable denvironnement CLASSPATH.Remarque : Ncessaire ds quon utilise des bibliothques (JUnit,Log4J...) qui sont dans des rpertoires ou fichiers darchive (.jar) propres.

    javac -classpath /usr/local/java/junit/junit.jar:. MaClasseTest.javajava -classpath /usr/local/java/junit/junit.jar:. MaClasseTest

    Les classes sont cherches dans junit.jar puis dans le rpertoire courant.Attention : Ne pas oublier le rpertoire courant !

    En utilisant CLASSPATH avec (t)csh :setenv CLASSPATH /usr/local/java/junit/junit.jar:.javac MaClasseTest.javajava MaClasseTest

    X. Crgut Programmation objet en Java 28

  • '&

    $

    %

    Java est un langage simple et familier familier par sa parent avec C :

    structures de contrle ; types primitifs.

    simple par rapport C/C++ : pas de fichier dentte, pas de prprocesseur ; pas darithmtique des pointeurs (ni de syntaxe) ; ni structures, ni unions, ni numrations (ajoutes dans Java 1.5) ; pas de surcharge des oprateurs ; pas de conversions de type sans contrle ; pas de smantique de la valeur pour les objets ; gestion automatique de la mmoire.

    Attention : Java est un langage objets. Il ncessite donc un changementde point de vue et contient des aspects subtils (hritage, liaison tardive...).

    X. Crgut Programmation objet en Java 29

  • '&

    $

    %

    Java est un langage robusteBut : liminer les risques derreur (contexte logiciel embarqu ou mobile)Moyen : Mcanisme sophistiqu de gestion des erreurs

    Mcanisme de typage fort (dtection statique des erreurs) Lditeur de lien utilise les informations de typage Conversions de type contrles Dtection dynamique des dpassements des bornes de tableaux

    Mcanisme sophistiqu de gestion mmoire Contrle de laccs la mmoire (pas de risque dcrasement) Libration automatique de la mmoire (ramasse-miettes)

    X. Crgut Programmation objet en Java 30

  • '&

    $

    %

    Java : Une architecture neutreBut : Excuter du code mobile dans un environnement htrogne ou, plussimplement, excuter le programme sur des machines diffrentes.

    Principe : viter les dpendances vis--vis : du matriel des couches logicielles : rseau, systme dexploitation, environnement

    graphiqueMoyen : Utilisation dune machine virtuelle (processeur abstrait) Dfinition dune bibliothque standard abstraite instancie pour chaque

    environnement (et tendre vers du pur Java)

    X. Crgut Programmation objet en Java 31

  • '&

    $

    %

    Java : Un langage portableBut : Un mme code compil sur toutes les architectures produit le mme rsultat

    Minimiser les modifications lies au portage machine virtuelleMoyen : Bibliothque indpendante Dfinition (smantique) prcise du langage :

    taille, organisation physique des donnes valeurs par dfaut, minimales, maximales effets des oprateurs sur les donnes ordre des calculs effets des instructions sur la mmoire

    X. Crgut Programmation objet en Java 32

  • '&

    $

    %

    Java est un langage objetsBnficier de la meilleure technologie logicielle disponible ce jourConcepts-cls : Deux concepts majeurs : Modularit : encapsulation et masquage dinformation (notion de classe) Extensibilit (relation dhritage)Technique : Classes, interfaces, paquetages Tout est classe (enveloppe wrapper possible pour les types primitifs) Les objets sont accessibles par des poignes (pointeurs) Hritage simple des classes Hritage multiple dinterfaces Polymorphisme et liaison tardive Bibliothque trs riche

    X. Crgut Programmation objet en Java 33

  • '&

    $

    %

    Java : Un langage performant Byte code adapt pour tre compil la vole (Just In Time) pour

    produire puis rutiliser le code associ chaque instruction Cache mmoire pour viter le chargement (et la vrification) multiple

    dune mme classe Compilation classique pour engendrer un programme propre une

    architecture donne avec dition de lien classique (perte mobilit) Ramasse-miettes : Processus indpendant de faible priorit

    La performance dun langage ne se mesure pas qu sa vitesse dexcutionmais aussi au temps de dveloppement requis. Les atouts de Java sont :

    Simplicit du langage ( nuancer !) Vrification statique et dynamique forte Bibliothque standard trs complte

    X. Crgut Programmation objet en Java 34

  • '&

    $

    %

    Autres points forts de JavaJava possde dautres points forts qui ne sont pas dvelopps dans ce cours.Ainsi Java est aussi un langage... distribu : exploiter simplement les ressources INTERNET (code mobile

    avec les applets, servlets, RMI, Corba) ; scuris : viter les intrusions lies au code mobile ( bac sable , API

    de scurit) ; dynamique (interprt) : acclrer le cycle de dveloppement (dition

    des liens dynamique), introspection ; parallle : Processus lgers (excution parallle dans le mme espace

    dadressage) ;

    X. Crgut Programmation objet en Java 35

  • '&

    $

    %

    Java : un langage mais pas seulement !En fait, Java cest trois lments :

    1. la machine virtuelle Java (JVM), spcification stable depuis 1995 ;2. le langage Java par lui-mme. Il a connu des volutions jusqu la

    version 1.2, un peu la 1.4 (assert) et 1.5 (gnricit, foreach,numration, ellipse...) ;

    3. la bibliothque standard Java. Cest elle qui volue le plus.Exemples : le modle de gestion des vnements, swing, XML...Remarquons que pour amliorer sa portabilit, la bibliothque estprincipalement dveloppe en Java.

    version 1.0 1.1 1.2 1.3 1.4 1.5 1.6

    # classes 212 504 1520 1842 2991 3562 7069

    # paquetages 8 23 59 76 135 166 480

    X. Crgut Programmation objet en Java 36

  • '&

    $

    %

    Origine et historique Projet SunSoft : Langage pour applications embarques

    1991 : Projet Green, Produit *7, Langage Oak (futur Java) = chec ! volution vers INTERNET : Applications mobiles

    1994-1995 : navigateur WWW novateur, futur HotJava 1995 : intgration de Java dans Netscape

    Les principales versions de Java : 1996 : premire version de Java publie (Java 1.02) 1997 : Java 1.1 (modle des vnements, internationalisation, Java

    Beans...) 1998 : Java 1.2 (Swing optimisation de la JVM, ...).

    Sun appelle Java 2 les versions de Java. 2001 : Java 1.4 (assertions, amlioration JDBC, regexp...) 2004 : Java 1.5 (gnricit, numration, foreach) : J2SE 5.0 2006 : Java 1.6, Java SE 6

    X. Crgut Programmation objet en Java 37

  • '&

    $

    %

    Algorithmique en Java

    X. Crgut Programmation objet en Java 38

  • '&

    $

    %

    La mthode principalePar dfinition, lorsquon lance la JVM avec une classe, cest sa mthodeprincipale qui est excute. Elle se dclare de la manire suivante :

    public static void main (String[] args) {...

    }

    Attention : Tous les mots (sauf args) sont importants ! Les qualificatifs static (T. 103) et public (T. 69) sont obligatoires ! Elle a pour type de retour void (pas de valeur retourne). Elle prend un seul paramtre de type tableau (T. 127) de chanes de

    caractres (T. 135), les arguments de la ligne de commande. Chaque classe peut dfinir sa mthode principale. Une classe peut ne pas avoir de mthode principale.

    X. Crgut Programmation objet en Java 39

  • '&

    $

    %

    Les types primitifsLes types primitifs comprennent : les entiers : byte, short, int, long.

    Ce sont des entiers signs (il ny a pas dentiers non signs). les nombres virgule flottante : float, double. les boolens : boolean (avec les deux valeurs false et true). les caractres : char (en Unicode)Quelques proprits des types primitifs : Ils ont tous une valeur par dfaut (en gnral 0) utilise pour les

    initialisations automatiques. Les entiers ne sont pas compatibles avec les boolens. Entiers et caractres sont compatibles (attention 3 + a).

    X. Crgut Programmation objet en Java 40

  • '&

    $

    %

    Les types primitifs : tableau rcapitulatifType # bits Dfaut Minimum Maximum Exemples

    byte 8 0 -128 +127 -10, 0, 10

    short 16 0 -32768 32767 -10, 0, 10

    int 32 0 231 231 1 -10, 0, 10

    long 64 0 263 263 1 -10L, 0L, 10L

    float 32 0.0 IEEE 754 IEEE 754 3.1F, 3.1f, 31e-1f

    double 64 0.0 IEEE 754 IEEE 754 3.1, 3D, 1e-4

    boolean 1 false false true

    char 16 \u0000 \u0000 \uFFFF a, \n, \

    Remarque : Java autorise les conversions entre types condition quil nyait pas de perte dinformation (ou prcision).

    float x1 = 4; // OK : conversion (coersion)float x2 = 4.21; // Erreur de compilation !

    X. Crgut Programmation objet en Java 41

  • '&

    $

    %

    Identificateurs Les identificateurs en Java sont de la forme : lettre (lettre | chiffre) *

    Les lettres sont a-z, A-Z, _, ainsi que tout caractre unicode quicorrespond une lettre dans la langue utilise (caractres accentus).

    Java comme C et C++ distingue majuscules et minuscules Conseil : Toujours choisir un identificateur significatif. Mettre en vidence les diffrents mots dun identificateur. La convention

    Java est de mettre linitiale des mots suivants en majuscule (exemple :idEnPlusieursParties).

    Remarque : Le caractres $ fait partie des chiffres mais est rservpour des identificateurs engendrs automatiquement. Ne pas lutiliser !

    X. Crgut Programmation objet en Java 42

  • '&

    $

    %

    Oprateurs relationnels== // galit (conversion si types diffrents) 3 == 3!= // diffrence (non galit) 4 != 5> // plus grand que 4 > 3>= // plus grand que ou gal 4 >= 3< // plus petit que 3 < 4

  • '&

    $

    %

    Oprateurs logiques (boolens)&& // ET logique expr1 && expr2|| // OU logique expr1 || expr2! // NON logique ! expr1

    Remarque : Les oprateurs logiques sont valus en court-circuit(valuation partielle) : ds que le rsultat est connu, lvaluation sarrte.

    true || expr // vrai sans avoir valuer exprfalse && expr // faux sans avoir valuer expr

    Formulations quivalentes : (la seconde est prfrable)A == true est quivalent AA == false est quivalent !A

    X. Crgut Programmation objet en Java 44

  • '&

    $

    %

    Oprateurs sur les bitsexpr1 & expr2 // ET bit bitexpr1 | expr2 // OU bit bitexpr1 ^ expr2 // XOR bit bit~ expr1 // inverse les bits de loprandeexpr > nb // dcalage de expr droite de nb bits (div 2)expr >>> nb // idem >> (sans prservation du signe)

    Oprateur conditionnel (si arithmtique)condition ? valeur_vrai : valeur_faux

    Si la condition est vraie, le rsultat est valeur_vrai, sinon cest valeur_faux.status = (age >= 18) ? "majeur" : "mineur"

    Attention : Peut tre difficile lire !

    X. Crgut Programmation objet en Java 45

  • '&

    $

    %

    Priorit et associativit des oprateurs1G [] accs un tableau

    (). p.x ou p.m()

    2D ++ -- post-incrmentation et post-dcrmentation3D ++ -- pr-incrmentation et pr-dcrmentation

    + - ! ~ unaires(type) transtypagenew

    4G * / %5G + -6G > >>>7G < >= instanceof8G == !=9G &10G ^11G |12G &&13G ||14D ?:15D = += -= *= *= /= %= &= ^= |= = >>>=

    a + b + c + d // G : associativit gauche ((a + b) + c) + dx = y = z = t // D : associativit droite x = (y = (z = t))

    X. Crgut Programmation objet en Java 46

  • '&

    $

    %

    Instructions et structures de contrleInstructions simples Dclaration de variables Affectation Instruction nulle Instruction composeStructures de contrle Conditionnelles : if et switch Rptitions : while, do, for et foreachInstructions ne pas utiliser break (sauf dans un switch) continue

    X. Crgut Programmation objet en Java 47

  • '&

    $

    %

    Instructions simples : dclaration de variablesLa dclaration de variables est une instruction.= Les dclarations nont plus tre groupes au dbut dun bloc.

    Dclaration dune variable : [= ]; // rle de la variable

    Exemples :int age, numro, montant; // viter les dclarations multiples !int px = 0, py = 0; // avec initialisationdouble x = 55, y = x*x; // utilisation dune expression calcule

    Conseil : Ne dclarer une variable que quand on est capable de linitialiser.Porte : Une variable locale est accessible de sa dclaration jusqu la fin du blocdans lequel elle est dfinie.

    Attention : Impossible dutiliser un mme identificateur dans un sous-bloc.

    Remarque : Le mot-cl final permet de dfinir une (variable) constante !En fait, une seule affectation possible.

    final int MAX = 10;

    X. Crgut Programmation objet en Java 48

  • '&

    $

    %

    Instructions simples : affectationAffectation : Donner une nouvelle valeur une variable.

    int i, j, k;i = 2; // affectation avec une expression constantej = i * (i - 1); // la valeur est une expression quelconquej = k = i+j; // laffectation renvoie une valeur !

    Variantes de laffectation : Loprateur daffectation peut tre combinavec la plupart des oprateurs :

    x += y /* x = x + y */ | double x = 1.5;x -= y /* x = x - y */ | int n = 0;x %= y /* x = x % y */ | n += x;x |= y /* x = x | y */ | // possible ?... | // valeur de n ?

    Attention : Si x est une variable dclare du type T, on a :x #= y est quivalent (T)((x) # (y))

    Pr- et post-oprateurs : ++ et --Incrmenter (++) ou dcrmenter ( ) une variable de 1.

    X. Crgut Programmation objet en Java 49

  • '&

    $

    %

    Instructions simples (suite)Instruction nulle :

    ; // instruction nulle : ne fait rien !

    Bloc ou instruction compose : grouper des instructions avec desaccolades pour quelles soient considres comme une seule.

    { // instruction composenbAnnes++;capital = capital * (1 + taux);

    }

    X. Crgut Programmation objet en Java 50

  • '&

    $

    %

    Conditionnelles : if

    if ();

    if () {;

    } else {;

    }

    Remarque : si on veut mettre plusieurs instructions, il faut utiliser les { }pour en faire une instruction compose.

    Rgle : Toujours mettre les { }.

    Attention : En Java, toutes les conditions sont (et doivent tre) boolennes !

    if (n > max) {max = n;

    }

    if (n1 == n2) {res = "gaux";

    } else {res = "diffrents";

    }

    Remarque : Pour reprsenter un SinonSi, utiliser else if.

    X. Crgut Programmation objet en Java 51

  • '&

    $

    %

    Conditionnelles : switch (choix multiples)switch () {case :

    ;break;

    ...case :

    ;break;

    default:;

    }

    switch (c) { // c caractrecase o:case O:

    res = "Affirmatif";break;

    case n:case N:

    res = "Ngatif";break;

    default:res = "!?!?!?!?";

    }

    Principe : Lexpression est value et lexcution continue la premireinstruction qui suit la 1re expression constante lui correspondant (oudefault). Si un break est rencontr, lexcution se poursuit la fin du switch.Consquence : Si le mme traitement doit tre fait pour plusieurs cas, ilsuffit de lister les diffrents case correspondants conscutivement.

    Conseil : Mettre un break aprs chaque groupe dinstructions dun case.

    X. Crgut Programmation objet en Java 52

  • '&

    $

    %

    Rptitions : while

    while () {;

    }

    // nb dannes pour atteindre lobjectifdouble taux = 0.03;double capital = 5000;double objectif = 10000;int nbAnnes = 0;while (capital < objectif) {

    nbAnnes++;capital = capital * (1 + taux);

    }

    Smantique : Tant que est vraie, (simple oubloc) est excute.Remarque : peut ne pas tre excute.

    X. Crgut Programmation objet en Java 53

  • '&

    $

    %

    Rptitions : do ... while

    do {;

    } while ();

    // Calculer la racine carre de afinal double EPSILON = 1.e-4;double a = 2; // doit tre non nul !double un = a;assert a != 0;double up; // valeur prcdente de undo {

    up = un;un = (un + a/un)/2;

    } while (Math.abs(un - up) > EPSILON);

    Smantique : est excute puis, tant que estvraie, est excute.

    Remarque : est excute au moins une fois.

    X. Crgut Programmation objet en Java 54

  • '&

    $

    %

    Rptitions : forfor (; ; ) {

    ;}

    for (int i = 1; i < 10; i++) {System.out.println(i);

    }

    Smantique : (initialisation) est excute puis, tant que estvraie et (incrmentation) sont excutes.

    { // rcriture du for laide du while; // initialisationwhile () { // condition de continuation

    ; // traitement; // incrmentation

    }}

    Consquence : Une variable dclare dans nest visible que dans lebloc du for (cas du int i = 1, par exemple).Conseil : Conserver la smantique du Pour algorithmique : on sait lavance combien de fois la boucle doit tre excute.

    X. Crgut Programmation objet en Java 55

  • '&

    $

    %

    Rptitions : foreach

    for ( : ) {;

    }

    public static void main(String[] args) {for (String nom : args) {System.out.println("Bonjour " + nom);

    }}

    Vocabulaire : On dit Pour chaque dans (foreach ... in ...).Smantique : est soit un tableau, soit une collection (en fait unitrable, T. 346).Les instructions sont excutes pour prenant chaque valeur de .

    Avantage : criture simple conservant la smantique du Pour algorithmique.Limite : ne doit pas modifier le parcours de la collection(dtect lexcution ConcurrentModificationException). Rgle du 8020 !

    X. Crgut Programmation objet en Java 56

  • '&

    $

    %

    Instructions ne pas utiliserLes instructions suivantes sont proposes par Java : break : arrter lexcution dune boucle ou dun switch ; continue : arrter litration actuelle dune boucle et passer la suivante.Attention : Ces deux instructions ne doivent pas tre utilises car ellesviolent les principes de la programmation structure.

    Exception : Bien sr, le break peut et doit tre utilis dans un switch !

    Remarque : En Java, on peut tiqueter les rptitions.premire: for (int i = 0; i < 7; i++) { // for tiquett premire

    System.out.println("i = " + i);for (int j = 0; j < 4; j++) {

    System.out.println(" j = " + j);if (j == i) {

    continue premire; // ==> passer au i suivant !}

    }}System.out.println("Fin !");

    X. Crgut Programmation objet en Java 57

  • '&

    $

    %

    Paquetages

    Programme = ensemble de classes (et interfaces) organises en paquetages.// fichier A.javapackage nom.du.paquetage; // paquetage dappartenanceclass A { ... } // texte Java de la classe

    La directive package doit tre la premire ligne du fichier. Une classe ne peut appartenir qu un seul paquetage. La structure des paquetages sappuie sur le systme de fichiers : les

    paquetages sont des rpertoires et les classes des fichiers. Si le paquetage dappartenance nest pas prcis, la classe appartient au

    paquetage anonyme (le rpertoire courant).Convention : Le nom des paquetages est en minuscules : java.lang,java.util... (qui correspondent java/lang/, java/util/...).

    X. Crgut Programmation objet en Java 58

  • '&

    $

    %

    Paquetages : droits daccsUne classe peut tre publique (public) ou locale au paquetage.

    // fichier A.javapackage un.premier.paquetage;public class A { ... }class B { ... }

    // fichier B.javapackage un.deuxieme.paquetage;class X { ... }class Y { ... }public class B { ... }

    un.premier.paquetage+AB

    import

    un.deuxieme.paquetage

    +B

    XY

    Une classe dclare publique (public) peut tre utilise depuis dautrespaquetages sinon elle est locale au paquetage.

    On peut mettre plusieurs classes dans un mme fichier Java (dconseill)mais une seule peut tre publique (elle donne son nom au fichier).Deux paquetages diffrents peuvent utiliser le mme nom de classe.

    X. Crgut Programmation objet en Java 59

  • '&

    $

    %

    Paquetages : utiliser une classe dun paquetage qualifier compltement la classe :

    java.awt.Color c; // La classe Color du paquetage java.awt

    importer une classe (on a accs la classe sans la qualifier) :import java.awt.Color; // en dbut de fichier...Color c; // La classe Color du paquetage java.awt

    importer le contenu dun paquetage (on a accs toutes ses classes) :import java.awt.*; // en dbut de fichier...Color c; // La classe java.awt.ColorPoint p; // La classe java.awt.Point

    Attention aux conflits si un mme nom de classe est utilis dans deuxpaquetages ! Le conflit doit tre rsolu en utilisant le nom qualifi.

    java.lang.* est import par dfaut : il contient les classes de base, lesclasses System, Math, String, etc.

    X. Crgut Programmation objet en Java 60

  • '&

    $

    %

    Paquetage : intrtsIntrt : Lintrt des paquetages est de : structurer lapplication en regroupant ses constituants ; viter les conflits de noms : un mme nom de classe peut tre utilis dans

    deux paquetages diffrents (un paquetage dfinit un espace de noms).Conseil : Pour viter toute ambigut, il est recommand de toujoursutiliser la forme compltement qualifie des classes !Exemple : java.awt.Color plutt que Color.

    Remarque : Nous parlons maintenant des paquetages car ils sontncessaires pour comprendre certains lments de Java (droit daccs) oucertains messages derreurs avec les outils du JDK.

    Attention : Les paquetages sont trs importants pour la structuration dunprogramme, ou dune bibliothque. Cependant, nous ninsisterons pas surcet aspect dans la suite de ce cours.

    X. Crgut Programmation objet en Java 61

  • '&

    $

    %

    Classes, objets et envois de message

    Les objets Les poignes Les classes Les attributs Les mthodes Les constructeurs Les attributs et mthodes de classe

    X. Crgut Programmation objet en Java 62

  • '&

    $

    %

    Les objetsUn objet est caractris par : un tat : la valeur des attributs (coeffA, coeffB, etc.) ; un comportement : les mthodes qui peuvent lui tre appliques

    (rsoudre) ; une identit qui identifie de manire unique un objet (par exemple son

    adresse en mmoire).Remarque : Un objet na de ralit qu lexcution du programme.Exercice 5 Quel est ltat dune fraction ? Quel est son comportement ?

    Attention : Les objets ne sont accessibles que par lintermdiaire depoignes : Un objet est attach une poigne.Synonymes de poigne : rfrence, pointeur, accs.

    X. Crgut Programmation objet en Java 63

  • '&

    $

    %

    Les poignesLes objets sont allous dynamiquement (dans le tas) : oprateur new.

    new quation(); // cration dun objet quation

    Il retourne lidentit de lobjet cr. Elle est conserve dans une poigne.Poigne : Une poigne est une variable dont le type est le nom dune classe.

    quation eq; // dclarer une poigne eq de type quationeq = new quation(); // crer un objet et lattacher la poigne

    La valeur par dfaut dune poigne est null. Elle indique quaucun objetnest attach la poigne.

    Remarque : On peut regrouper dclaration de la poigne et initialisation :quation eq = new quation(); // en une ligne pour ne pas oublier

    // dinitialiser la poigne

    Conseil : Prfrer la version o dclaration de la poigne et cration delobjet sont faites en mme temps.

    X. Crgut Programmation objet en Java 64

  • '&

    $

    %

    Notation graphique dun objetquation eq = new quation();... // initialisation, rsolution, etc.

    eq: Equation

    coeffA = 1coeffB = 5coeffC = 6x1 = 2x2 = 3

    @ classe gnratrice

    mthodes

    coeffA = 1coeffB = 5coeffC = 6x1 = 2x2 = 3

    rsoudre()

    eq: Equation instance de Equation

    nom de la poigne

    type de la poigne

    poignede lobjetidentit

    attributs et leurs valeurs

    en UML reprsentation abstraite (en mmoire)Remarque : En UML, on peut omettre le nom de lobjet ou de la classe.Cest donc le soulign qui indique quil sagit dun objet !Remarque : En UML, les mthodes ne sont pas donnes car tous les objetsdune mme classe possdent les mmes mthodes. Cest implicite.

    X. Crgut Programmation objet en Java 65

  • '&

    $

    %

    Et aprs ?Nous avons vu ce quest un objet, comment le crer et lattacher unepoigne.

    Mais : O sont dfinies les caractristiques des objets ? Dans une classe ! Comment peut-on accder aux caractristiques des objets ? Par lenvoi de

    messages (ou appel de mthodes) ! Comment initialiser un objet (nous ne savons que le crer) ? Cest

    lobjectif des constructeurs !

    X. Crgut Programmation objet en Java 66

  • '&

    $

    %

    Les classesUne classe dfinit : un MODULE : elle regroupe la dclaration des attributs et la dfinition

    des mthodes associes dans une mme construction syntaxique ;class NomDeLaClasse {

    // Dfinition de ses caractristiques}

    Les attributs permettent le stockage dinformation (tat de lobjet).Les mthodes sont des units de calcul (fonctions ou procdures).La classe est donc lunit dencapsulation et un espace de noms.

    un TYPE qui permet de : crer des objets ; dclarer des poignes auxquelles seront attachs ces objets.

    Les mthodes et attributs dfinis sur la classe comme MODULE pourronttre appliqus ces objets (par lintermdiaire des poignes).

    X. Crgut Programmation objet en Java 67

  • '&

    $

    %

    Liens entre objet, poigne, classe et typeVoici quelques affirmations : Un objet est une instance dune classe. Un objet est instance dune et une seule classe. Une poigne a un type qui est le nom dune classe (ou interface, T. 152). Un objet a pour type le nom de sa classe mais peut avoir dautres types

    (voir interfaces T. 152 et hritage T. 196). On peut initialiser une poigne avec toute expression dont le type est le

    mme que celui de la poigne (ou un sous-type, voir interfaces T. 152 ethritage T. 196).

    X. Crgut Programmation objet en Java 68

  • '&

    $

    %

    Droit daccs (accessibilit) des caractristiquesChaque caractristique a un droit daccs. Il existe quatre niveaux de droitdaccs en Java : public : accessible depuis toutes les classes ; private : accessible seulement de la classe et daucune autre ; absence de modifieur de droit daccs : droit daccs de paquetage,

    accessible depuis toutes les classes du mme paquetage ; protected : accessible du paquetage et des classes drives (cf hritage).

    Accessible depuis Droit daccs/Visibilitune mthode dfinie dans public protected dfaut private

    La mme classe oui oui oui ouiUne classe du mme paquetage oui oui oui nonUne sous-classe dun autre paquetage oui oui non nonUne autre classe dun autre paquetage oui non non non

    Intrt : Les droits daccs permettent le masquage dinformation.

    X. Crgut Programmation objet en Java 69

  • '&

    $

    %

    Reprsentation UML dune classe

    NomDeLaClasse

    +attributPublic: intattributPriv: double#attributProtg

    +mthodePubliquemthodePrive(a: double): int#mthodeProtge(a:int, b:int)

    nom de la classe

    attributs

    oprations (UML)mthodes (Java)

    La premire partie contient le nom de la classe, la seconde les attributs et latroisime les mthodes (qui sont appeles oprations en UML).Les droits daccs sont symboliss par les signes + - # correspondantrespectivement public, private et protected.

    X. Crgut Programmation objet en Java 70

  • '&

    $

    %

    Exemples de classes UML

    RobotType1

    +x: int+y: int+direction: int

    +avancer(nb: int)+pivoter()

    quation+coeffA: double+coeffB: double+coeffC: double+x1: double+x2: double

    +rsoudre()

    Exercice 6 Proposer la description UML dune classe Fraction quireprsente les fractions rationnelles.

    X. Crgut Programmation objet en Java 71

  • '&

    $

    %

    AttributsLes attributs permettent de stocker les informations spcifiques dun objet.Ils se dclarent ncessairement lintrieur dune classe :

    /** Documentation javadoc de lattribut */ Type idAttribut [, idAttribut]* ;

    /** coefficient de x2 */public double coeffA;

    Les modifieurs incluent la dfinition des droits daccs.

    Accs un attribut : poigne.attributquation unequation = new quation();double sol1 = unequation.x1; // accs en lectureunequation.coeffA = 1; // accs en modification

    Attention : Erreur de compilation si droit daccs insuffisant !

    X. Crgut Programmation objet en Java 72

  • '&

    $

    %

    Exemple derreur : droit daccs insuffisant1 class TestEquationErreur1 {2 public static void main(String[] args) {3 Equation eq = new Equation();4 eq.coeffA = 1;5 }6 }7 class Equation {8 private double coeffA;9 // ...

    10 }

    La compilation donne le rsultat suivant :TestEquationErreur1.java:4: coeffA has private access in Equation

    eq.coeffA = 1;^

    1 error

    Remarque : Le compilateur Java sait que lattribut coeffA est dfini dans laclasse Equation mais le droit daccs nest pas suffisant pour tre utilis dansTestEquationErreur1.

    X. Crgut Programmation objet en Java 73

  • '&

    $

    %

    Exemple derreur : variable locale non initialise1 class TestEquationErreur2 {2 public static void main(String[] args) {3 Equation eq;4 eq.coeffA = 1;5 }6 }

    La compilation donne le rsultat suivant :TestEquationErreur2.java:4: variable eq might not have been initialized

    eq.coeffA = 1;^

    1 error

    Remarque : Le compilateur Java vrifie quune variable locale estinitialise avant dtre utilise.

    X. Crgut Programmation objet en Java 74

  • '&

    $

    %

    Exemple derreur : utilisation dune poigne nulle1 class TestEquationErreur3 {2 public static void main(String[] args) {3 Equation eq = null;4 eq.coeffA = 1;5 }6 }

    Lexcution donne le rsultat suivant :Exception in thread "main" java.lang.NullPointerException

    at TestEquationErreur3.main(TestEquationErreur3.java:4)

    Attention : Si la poigne est null, lerreur nest signale qu lexcution.

    X. Crgut Programmation objet en Java 75

  • '&

    $

    %

    Attributs : rgle sur le droit daccsRgles : Un attribut devrait toujours tre dclar private pour respecter : le principe daccs uniforme : lutilisateur na pas savoir sil accde

    une information calcule ou stocke le principe de la protection en criture et permettre ainsi lauteur de la

    classe de garantir lintgrit des objets de la classe.Exercice 7 Dfinir une date avec jour, mois et anne.Indiquer comment faire pour changer la valeur du mois.Indiquer comment faire pour obtenir la valeur du mois.

    X. Crgut Programmation objet en Java 76

  • '&

    $

    %

    MthodesDfinition : Une mthode est une unit de calcul (fonction au sens de C)qui exploite ltat dun objet (en accs et/ou en modification). Une mthode est identifie par sa classe, son nom, le nombre et le type de

    ses paramtres (surcharge T. 83). Elle possde galement un type de retour qui est void si elle ne retourne

    rien (procdure). Elle a un code entre accolades.Syntaxe/** Documentation javadoc de la mthode dcrivant lobjectif de la mthode.

    * Les paramtres et le retour de la mthode sont galement documents :

    * @param nomParamtre description de nomParamtre

    * @return description de linformation retourne (si non void)*/

    TypeRetour idMthode( [Type1 p1[, Type p]*]) {...

    }

    X. Crgut Programmation objet en Java 77

  • '&

    $

    %

    Mthodes : exemplesDfinir les mthodes set et delta sur la classe Equation./** Initialiser une quation partir de la valeur de ses coefficients.* @param a coefficient de x2* @param b coefficient de x* @param c coefficient constant*/

    public void set(double a, double b, double c) {this.coeffA = a;this.coeffB = b;this.coeffC = c;

    }

    /** Obtenir le discriminant de lquation.

    * @return le discriminant de lquation*/

    private double delta() {return this.coeffB * this.coeffB - 4 * this.coeffA * this.coeffC;

    }

    Remarque : delta() est private car elle na pas tre utilise de lextrieur.

    X. Crgut Programmation objet en Java 78

  • '&

    $

    %

    Mthodes : utilisationUne mthode est toujours applique sur une poigne (comme un attribut) etest excute sur lobjet associ cette poigne.poigne.mthode(p1, ..., pn); // Forme gnrale (envoi de message)

    quation eq = new quation(); // Crer un objet quation attach eqeq.set(1, 5, 6); // Initialiser lquation (mthode void)double delta = eq.delta(); // Utiliser une mthode non voideq.rsoudre();eq.delta(); // Valide mais quel intrt ?

    quation eq2 = null; // pas dobjet attach eqeq2.set(1, 4, 4); // ==> NullPointerException

    Remarque : Appliquer une mthode sur une poigne null provoque uneexception (NullPointerException).Liaison statique : Le compilateur accepte lappel p.m(a1, ...,an) ssi ilexiste, dans la classe dfinissant le type de la poigne p, une mthode mdarit n telle que les types de a1, ..., an sont compatibles avec sa signature.

    X. Crgut Programmation objet en Java 79

  • '&

    $

    %

    Mthodes : le paramtre implicite thisUne mthode est applique un objet, appel rcepteur, (gnralement travers une poigne) et manipule ltat de cet objet.Le rcepteur est un paramtre implicite car il napparat pas dans lasignature de la mthode. lintrieur du code de la mthode, on peut y fairerfrence en utilisant le mot-cl this.public void set(double a,

    double b, double c) {this.coeffA = a;this.coeffB = b;this.coeffC = c;

    }

    public void set(double a,double b, double c) {

    coeffA = a; // this implicite !coeffB = b;coeffC = c;

    }

    Rq : this est ncessaire si un paramtre porte le mme nom quun attribut.

    Conseil : Mettre this.

    Exercice 8 crire une mthode suprieur (>) si infrieur (

  • '&

    $

    %

    Dfinir une classe

    Exercice 9 : CompteurUn compteur a une valeur (entire) qui peut tre incrmente dune unit.Elle peut galement tre remise 0. On suppose galement quil estpossible dinitialiser le compteur partir dune valeur entire positive.

    9.1 Modliser en utilisant la notation UML la classe Compteur.

    9.2 crire un programme de test de la classe Compteur.9.3 crire en Java la classe Compteur.9.4 Comment tre sr que la valeur du compteur est toujours positive ?

    X. Crgut Programmation objet en Java 81

  • '&

    $

    %

    Afficher une quation Premire ide : dfinir une mthode afficher pour faire eq.afficher()

    1 /** Afficher cette quation. */2 public void afficher() {3 System.out.print(this.coeffA + "*x2 + "4 + this.coeffB + "*x + " + this.coeffC + " = 0");5 }

    Deuxime ide : faire directement : System.out.println(eq);Compile, sexcute mais affiche : quation@8814e9Java utilise la mthode toString() (si dfinie dans la classe, voir T. 224et 217) pour convertir lobjet en chane de caractres. En dfinissant :

    1 /* Obtenir la reprsentation de cette quation sous forme2 * dune chane de caractres. */3 public String toString() {4 return "" + this.coeffA + "*x2 + "5 + this.coeffB + "*x + "6 + this.coeffC + " = 0";7 }

    on obtient alors laffichage : 1.0*x2 + 5.0*x + 6.0 = 0

    X. Crgut Programmation objet en Java 82

  • '&

    $

    %

    SurchargeDfinition : En Java, indiquer le nom dune mthode nest pas suffisantpour lidentifier. Il faut prciser : la classe laquelle elle appartient ; son nom ; son nombre de paramtres ; le type de chacun de ses paramtres.Exemple : Les mthodes suivantes sont toutes diffrentes :class A {void afficher() // afficher sans paramtrevoid afficher(int i) // afficher un entiervoid afficher(long i) // afficher un entier longvoid afficher(String str) // afficher une chanevoid afficher(String s, int largeur); // sur une certaine largeurvoid afficher(String s, int largeur, char mode); // mode == c, g, dvoid afficher(int nbFois, String str); // contre-exemple !

    }

    X. Crgut Programmation objet en Java 83

  • '&

    $

    %

    Surcharge : rsolutionLe mme nom peut tre utilis pour nommer des mthodes diffrentes.= Pour rsoudre un appel de mthode, le compilateur sappuie galementsur le nombre et le type des paramtres effectifs :

    // On suppose que lon est dans le corps dune mthode de la classe Aafficher(10); // afficher(int)afficher(10L); // afficher(long)afficher("Bonjour", 20, c); // afficher(String, int, char)afficher("Bonjour"); // afficher(String)afficher(); // afficher()afficher(true); // Erreur la compilationafficher(20, "Bonjour"); // afficher(int, String)

    Intrt : viter de multiplier les noms (afficherInt, afficherLong, etc.).Conseil : Respecter Le sens sous-entendu par le nom de la mthode.Exercice 10 Expliquer comment la surcharge permet de simuler desvaleurs par dfaut aux paramtres de mthodes ( la C++).Exercice 11 Quelles mthodes de Fraction pourraient tre surcharges ?

    X. Crgut Programmation objet en Java 84

  • '&

    $

    %

    Exemples de surcharge

    Exercice 12 On considre la classe suivante. Indiquer pour chaque appeldans la mthode main quelle est la mthode rellement appele.class TestSurcharge {static void m0(int a, int b) { System.out.println("m0(i,i)"); }static void m1(double a, double b) { System.out.println("m1(d,d)"); }

    static void m2(double a, double b) { System.out.println("m2(d,d)"); }static void m2(double a, int b) { System.out.println("m2(d,i)"); }static void m2(int a, double b) { System.out.println("m2(i,d)"); }static void m2(int a, int b) { System.out.println("m2(i,i)"); }

    static void m3(double d, int i) { System.out.println("m3(d,i)"); }static void m3(int i, double d) { System.out.println("m3(i,d)"); }

    public static void main(String[] args) {m0(1, 1); m1(1, 1); m2(1, 1); m3(1, 1);m0(2, 2.0); m1(2, 2.0); m2(2, 2.0); m3(2, 2.0);m0(3.0, 3); m1(3.0, 3); m2(3.0, 3); m3(3.0, 3);m0(4.0, 4.0); m1(4.0, 4.0); m2(4.0, 4.0); m3(4.0, 4.0);

    }}

    X. Crgut Programmation objet en Java 85

  • '&

    $

    %

    Surcharge et espace de nomsIl est possible de dfinir la mme mthode (mme nom, mme nombre deparamtres, et mmes types de paramtres) dans deux classes diffrentes.

    class A {/** afficher en commenant

    * par un dcalage */void afficher(int dcalage);

    }

    class B {/** afficher nb fois */void afficher(int nb);

    }

    Pour savoir quelle mthode choisir, le compilateur sappuie sur le type durcepteur (le type de la poigne sur laquelle la mthode est applique).= La classe dfinit un espace de noms.

    A x1; // poigne x1 de type AB x2; // poigne x2 de type B... // les initialisations de x1 et X2x1.afficher(5); // afficher(int) de la classe Ax2.afficher(10); // afficher(int) de la classe B

    Remarque : Pour certains auteurs, il sagit de surcharge. Pour nous, ce sontdes espaces de noms diffrents.

    X. Crgut Programmation objet en Java 86

  • '&

    $

    %

    Mthodes : passage de paramtresJava na quun seul mode de passage de paramtres : le passage par valeur.

    Remarque : Si le paramtre est un objet , cest donc un passage parvaleur de la poigne qui est quivalent un passage par rfrence de lobjet.Consquences : On peut en dduire que : les modifications apportes un paramtre de type primitif ne sont pas

    visibles du programme appelant ( de variables locales initialises) ; les modifications apportes un objet attach un paramtre de type

    poigne sont visibles du programme appelant ; les modifications de la valeur de la poigne (raffectation) ne seront pas

    visibles du programme appelant.Remarque : Ceci est galement vrai pour le retour dune fonction !

    X. Crgut Programmation objet en Java 87

  • '&

    $

    %

    Passage de paramtres : exemple

    Exercice 13 : Comprendre le passage de paramtres en Javatant donne la classe Compteur dfinie dans lexercice 9 et dont le texte estdonn listing 2, nous dfinissons la classe TestParametres (listing 1).Son excution donne le rsultat suivant :

    a = 10c = 11c = 11

    Expliquer les rsultats obtenus lors de lexcution de TestParametres.

    X. Crgut Programmation objet en Java 88

  • '&

    $

    %

    Listing 1 Le fichier TestParametres.javapublic class TestParametres {

    static void incrmenter(int n) { n++; }static void incrmenter(Compteur cptr) { cptr.incrmenter(); }static void reset(Compteur cptr) { cptr = new Compteur(); }

    public static void main(String[] args) {int a = 10;incrmenter(a);System.out.println("a = " + a); // Valeur de a ?

    Compteur c = new Compteur();c.set(10);incrmenter(c);System.out.println("c = " + c.getValeur()); // valeur de c ?

    reset(c);System.out.println("c = " + c.getValeur()); // valeur de c ?

    }

    }

    X. Crgut Programmation objet en Java 89

  • '&

    $

    %

    Listing 2 Le fichier Compteur.java/** Dfinition dun compteur avec incrmentation.

    * @author Xavier Crgut* @version 1.4 */public class Compteur {

    private int valeur; // valeur du compteur

    /** Augmenter dune unit le compteur */public void incrmenter() { this.valeur++; }

    /** Obtenir la valeur du compteur.* @return la valeur du compteur.*/

    public int getValeur() { return this.valeur; }

    /** Remettre zro le compteur */public void raz() { this.set(0); }

    /** Modifier la valeur du compteur.* @param valeur la nouvelle valeur du compteur*/

    public void set(int valeur) { this.valeur = valeur; }}

    X. Crgut Programmation objet en Java 90

  • '&

    $

    %

    ConstructeursRappel : La cration dun objet ncessite en fait deux tapes :

    1. La rservation de la zone mmoire ncessaire. Ceci est entirementralis par le compilateur ( partir des attributs de la classe).

    2. Linitialisation de la zone mmoire. Le compilateur ne peut, a priori,faire quune initialisation par dfaut des attributs.

    Il y a alors risque davoir une initialisation incorrecte, ou non conforme auxsouhaits de lutilisateur (exemple : Fraction, Date, etc.).Les constructeurs permettent alors : au programmeur dindiquer comment un objet peut tre initialis ; au compilateur de vrifier que tout objet cr est correctement initialis.Exemple : Une quation peut (doit !) tre initialise partir de la donnedes valeurs de ses coefficients.

    X. Crgut Programmation objet en Java 91

  • '&

    $

    %

    Les constructeurs en JavaEn Java, un constructeur ressemble une mthode mais : il a ncessairement le mme nom que la classe ; il ne peut pas avoir de type de retour ;Exemple : Un constructeur pour les quations/** Initialiser une quation partir de ses coefficients ... */public quation(double a, double b, double c) {

    this.coeffA = a;this.coeffB = b;this.coeffC = c;

    }

    Remarque : Un constructeur a un droit daccs (idem attributs etmthodes).Attention : Mettre un type de retour supprime le caractre constructeur .On a alors une simple mthode !

    X. Crgut Programmation objet en Java 92

  • '&

    $

    %

    Constructeur et surchargeMme si le nom dun constructeur est impos, la surcharge permet dedfinir plusieurs constructeurs pour une mme classe.

    Exemple : On peut souhaiter initialiser une quation partir de la somme etdu produit de ses racines.

    /** Initialiser une quation partir de la somme* et du produit de ses racines* @param somme somme des racines* @param produit produit des racines*/public quation(double somme, double produit) {

    this.coeffA = 1;this.coeffB = - somme;this.coeffC = produit;

    }

    Exercice 14 Peut-on dfinir un constructeur qui initialise une quation partir de ses deux solutions ? Pourquoi ?

    X. Crgut Programmation objet en Java 93

  • '&

    $

    %

    Appel dun autre constructeur de la classeProblme : Plutt que davoir les mmes trois affectations que dans lepremier constructeur, pourquoi ne pas utiliser le premier constructeur ?On peut le faire en utilisant this(...) :

    /** Initialiser une quation partir de la somme* et du produit de ses racines* @param somme somme des racines* @param produit produit des racines*/public quation(double somme, double produit) {

    this(1, -somme, produit);// Appel au constructeur quation(double, double, double)// Cet appel est ncessairement la premire instruction !

    }

    Attention : Lappel lautre constructeur est ncessairement la premireinstruction du constructeur.

    Bien sr, les paramtres effectifs de this(...) permettent de slectionnerlautre constructeur.

    X. Crgut Programmation objet en Java 94

  • '&

    $

    %

    Cration dun objetLa cration dun objet en Java est alors :

    new ();

    Les paramtres effectifs sont fournis par lutilisateur de la classe et sontutiliss par le compilateur pour slectionner le constructeur appliquer(surcharge).Si aucun constructeur nest trouv, le compilateur signale une erreur.

    new quation(1, 5, 6); // OK x2 + 5x + 6

    new quation(2, 1); // OK x2 - 2x + 1new quation(10); // Incorrect !new quation(); // Incorrect !

    Consquence : Le constructeur permet de rendre atomique la rservation dela mmoire et son initialisation.

    X. Crgut Programmation objet en Java 95

  • '&

    $

    %

    Le constructeur par dfautOn appelle constructeur par dfaut le constructeur qui ne prend pas deparamtres.

    Justification : Cest le constructeur utilis si aucun paramtre nest fournilors de la cration dun objet.Rgle : Le constructeur par dfaut est rgi par deux rgles :

    1. Si aucun constructeur nest dfini sur une classe, le systme synthtiseun constructeur par dfaut (qui ne fait rien), le constructeur prdfini.

    2. Ds quun constructeur est dfini sur une classe, le constructeur pardfaut synthtis par le systme disparat.

    Remarque : Le programmeur peut toujours dfinir un constructeur pardfaut... mais y a-t-il intrt ?

    X. Crgut Programmation objet en Java 96

  • '&

    $

    %

    Un constructeur nest pas une mthodeMme si un constructeur ressemble une mthode, ce nest pas unemthode : il na pas de type de retour ; il a une syntaxe dappel spcifique (associ loprateur new) ; il ne peut pas tre appliqu sur un objet (sauf lors de sa cration) ; il ne peut pas tre redfini dans une classe drive (cf hritage T. 195). le caractre de constructeur ne shrite pas (cf hritage T. 195).

    X. Crgut Programmation objet en Java 97

  • '&

    $

    %

    Autres manires dinitialiser un objetOutre les constructeurs, Java permet au programmeur de dfinir : des valeurs par dfaut pour les attributs. Elles remplacent alors les

    valeurs par dfaut du langage ; des initialiseurs. Ce sont des instructions mises entre accolades. Sil y a

    plusieurs initialiseurs, ils sont excuts dans lordre dapparition.Exemple : La classe Fraction.

    public class Fraction {private int num; // valeur par dfaut de Java : 0private int dn = 1; // valeur par dfaut du programmeur : 1{ // initialiseurnum = 0;dn = 5;

    }{ // initialiseur 2dn = 1;

    }} // dn prendra successivement les valeurs : 0, 1, 5 et 1

    X. Crgut Programmation objet en Java 98

  • '&

    $

    %

    Initialisation dobjet : BilanVoici ce que fait Java lors de la cration dun objet :

    1. Initialisation des attributs avec la valeur par dfaut de leur type ;2. Utilisation des valeurs par dfaut fournies par le programmeur ;3. Excution des initialiseurs dans leur ordre dapparition ;4. Excution du constructeur :

    si aucun constructeur nest dfini sur la classe, cest le constructeurprdfini qui est utilis. Le programmeur ne doit pas fournir deparamtre au constructeur ;

    si au moins un constructeur est dfini sur la classe, le programmeurdoit fournir des paramtres (ventuellement aucun !) qui permettentau compilateur de choisir lun des constructeurs de la classe.

    Conseil : Prfrer les constructeurs explicites aux autres initialisations(valeurs par dfaut, initialiseurs, constructeur par dfaut synthtis).

    X. Crgut Programmation objet en Java 99

  • '&

    $

    %

    DestructeursDestructeur : mthode appele automatiquement quand un objet disparat(quand sa mmoire est libre). Il est le pendant du constructeur.Consquence : Son code contient les traitements raliser lors de ladisparition de lobjet : libration des ressources utilises (mmoire...), etc.Attention : Il ne peut y avoir quun seul destructeur par classe.

    En Java : En Java, le destructeur est :protected void finalize()

    En Java, le ramasse-miettes rend souvent inutile la dfinition du destructeur.

    Attention : En raison du ramasse-miettes, aucune garantie nexiste en Javasur quand le destructeur sera appel... ou sil sera rellement appel.= Dfinir une mthode explicite (dispose, close, destroy, etc.)...Et dire aux utilisateurs de penser lappeler (documentation) !

    X. Crgut Programmation objet en Java 100

  • '&

    $

    %

    Les attributs et mthodes de classe

    Exercice 15 On considre une classe Date qui a pour attributs lanne, lenumro du mois et le numro du jour dans le mois. On souhaite dfinir surcette classe une mthode incrmenter qui fait passer la date au lendemain.

    Comment crire le code de cette mthode ?

    X. Crgut Programmation objet en Java 101

  • '&

    $

    %

    Attributs et mthodes de classe : on les a dj vus !Que penser de lexpression suivante :

    Math.sqrt(4) // racine carre de 4

    sqrt(double) est bien une mthode mais elle nest pas applique un objetmais la classe Math. Cest une mthode de classe.

    On constate que sqrt(double) travaille exclusivement sur son paramtre.Que penser de linstruction suivante :

    System.out.println("Que suis-je ?");

    out est un attribut (puisquil nest pas suivi de parenthses) mais il estappliqu une classe (System). Cest parce quil nest pas spcifique dunobjet particulier : la sortie standard est la mme pour tout le monde !Cest en fait un attribut de classe.

    X. Crgut Programmation objet en Java 102

  • '&

    $

    %

    Attributs et mthodes de classe : en JavaOn distingue : attributs et mthodes dinstance : toujours appliqus un objet

    (ventuellement this). On les appelle simplement attributs et mthodes ; attributs et mthodes de classe : appliqus une classe, non un objet.Syntaxe : Cest le modifieur static qui indique si un attribut ou unemthode est de classe ou non.

    Droit daccs : Les mmes que pour les attributs et mthodes dinstance.public class Math {public static double sqrt(double) {}

    }

    public class System {public static PrintStream out;

    }

    Utilisation : NomClasse.attribut ou NomClasse.mthode(...)Si NomClasse est la classe courante , il peut tre omis.

    Question : Que penser de la mthode principale ?En UML : On souligne la caractristique de classe (ou on la prfixe par $).

    X. Crgut Programmation objet en Java 103

  • '&

    $

    %

    Attribut de classeDfinition : Un attribut de classe est un attribut non spcifique un objetdonn mais commun (et partag par) tous les objets de la classe.Intrt : quivalent une variable globale dont la porte est la classe.Exemple : Compter le nombre dquations cres.

    Le compteur est une information relative la classe mais qui doit tre mise jour par chacune des instances (dans chaque constructeur de la classe).

    public class quation {private static int nbCres = 0; // initialisation explicite

    public quation(double a, double b, double c) {nbCres++; // idem : quation.nbCres++;... // inutile de modifier les autres constructeurs

    } // sils sappuient sur celui-ci : this(...)}

    Attention : viter ! Comment compter deux sortes dquations ?

    X. Crgut Programmation objet en Java 104

  • '&

    $

    %

    Initialisation des attributs de classeLes attributs de classe sont initialiss au chargement de la classe.

    Ils sont initialiss avec la valeur par dfaut de leur type, puis la valeur pardfaut fournie par le programmeur, et enfin par linitialiseur statique (unbloc dinstructions prcd de static).class UneClasse {static public int i; // initialis 0 (valeur par dfaut des int)public static int j = 10; // valeur par dfaut du programmeurpublic static int k;

    static { // initialiseur statiquek = 1; // il est utile pour les initialisations complexes (tableaux)j = 5; // 5 remplace la valeur 10 fournie comme dfaut

    }}

    Rgle : Comme ceux dinstance, dclarer les attributs de classe private.

    Attention : Les attributs de classe limitent lextensibilit (variable globale)

    X. Crgut Programmation objet en Java 105

  • '&

    $

    %

    Mthodes de classeDfinition : Une mthode de classe est une mthode indpendante de touteinstance de la classe. Elle est donc applique une classe et non un objet.Consquence : Une mthode de classe na pas de paramtre implicite (this)et ne peut donc pas utiliser les attributs et mthodes dinstance de sa classe.public class Date {

    private int jour, mois, anne;static private int nbCres = 0; // nombre de dates cres

    public static boolean estBissextile(int a) {return ((a % 4) == 0) // divisible par 4

    && ((a % 100 != 0) // et non divible par 100|| (a % 400 == 0)); // sauf si divisible par 400

    // impossible dutiliser this.annee ou annee car static !}

    public static int getNbCres() {return nbCres;

    }}Exercice 16 Quand peut-on (doit-on) dfinir une mthode de classe ?

    X. Crgut Programmation objet en Java 106

  • '&

    $

    %

    Mthode de classe et accs aux informations dune classe1 class A {2 private int i; // attribut dinstance3 static private int k; // attribut de classe45 public void incI() { // mthode dinstance6 this.i++;7 }89 public static void incK() { // mthode de classe

    10 k++;11 }1213 public static void m(A a) { // mthode de classe14 i++;15 this.i++;16 incI();17 this.incI();18 k++;19 incK();20 a.k++;21 a.i++;22 new A().i++;23 }24 }

    X. Crgut Programmation objet en Java 107

  • '&

    $

    %

    Le rsultat de la compilation :1 MethodeClasseAccesMembres.java:14: non-static variable i cannot be

    referenced from a static context2 i++;3 ^4 MethodeClasseAccesMembres.java:15: non-static variable this cannot

    be referenced from a static context5 this.i++;6 ^7 MethodeClasseAccesMembres.java:16: non-static method incI() cannot

    be referenced from a static context8 incI();9 ^

    10 MethodeClasseAccesMembres.java:17: non-static variable this cannotbe referenced from a static context

    11 this.incI();12 ^13 4 errors

    X. Crgut Programmation objet en Java 108

  • '&

    $

    %

    Information de classe : BilanUn attribut de classe : est accessible de nimporte o (variable globale), MAIS est souvent un frein pour lvolution de lapplication (par exemple

    sil faut diffrencier lattribut suivant les contextes).= viter les attributs de classe !... Ou tre conscient des limites induites !Une mthode de classe : est accessible de partout ( partir de sa classe), permet de conserver le caractre symtrique de certaines mthodes

    (comparaison), MAIS pas daccs aux informations dinstance, NI redfinition possible (voir T. 152 et 196), NI liaison dynamique

    (T. 168 et 217)

    X. Crgut Programmation objet en Java 109

  • '&

    $

    %

    Fabrique statiqueUne utilisation recommande des mthodes de classe est de sen servir laplace des constructeurs.public class Equation {...protected Equation(double a, double b, double c) { ... }

    public static Equation depuisCoefficients(double a, double b, double c) {return new Equation(a, b, c);

    }

    public static Equation depuisSommeEtProduit(double s, double p) {return new Equation(1, -s, p);

    }

    public static Equation depuisRacines(double x1, double x2) {return Equation.depuisSommeEtProduit(x1 + x2, x1 * x2);

    }}

    Remarque : Le constructeur nest pas public pour obliger utiliser lesfabriques statiques.

    X. Crgut Programmation objet en Java 110

  • '&

    $

    %

    Fabrique statique : utilisationclass Exemple {

    public static void main(String[] arguments) {Equation eq1 = Equation.depuisCoefficients(1, 5, 6);Equation eq2 = Equation.depuisSommeEtProduit(2, 1);Equation eq3 = Equation.depuisRacines(2, 1);...

    }

    }

    X. Crgut Programmation objet en Java 111

  • '&

    $

    %

    Discussion sur les fabriques statiquesAvantages : les mthodes de classe ont un nom. Il peut donc tre explicite ! une mthode de classe nest pas oblige de crer un nouvel objet

    chaque appel. On peut retourner un objet dj cr. la mthode peut retourner un objet dun sous-type : Voir Interface

    (T. 152) et Hritage (T. 196).Inconvnients : pas de diffrence syntaxique entre fabrique statique et mthodes de classe dviation de la norme (les constructeurs !)= difficile de retrouver les fabriques statiques dans la documentationQuelques conventions pour nommer : valueOf (conversion de type),getInstance.

    2me lecture : pourquoi le constructeur est dfini protected et non private ?

    X. Crgut Programmation objet en Java 112

  • '&

    $

    %

    Importation statiqueIl existe une variante de la clause import qui permet daccder directementaux attributs et mthodes de classe.

    1 import static java.lang.System.out; // importe une caractristique2 import static java.lang.Math.*; // ou toutes34 public class ImportationStatiqueMath {5 public static void main(String[] args) {6 out.println(sqrt(PI));7 System.out.println(Math.sqrt(Math.PI));8 }9 }

    Intrt : Il est relativement faible : crire sqrt plutt que Math.sqrt ; utiliser directement des constantes : RED au lieu Color.RED ;En fait, il vise viter de mauvaises pratiques : hriter (T. 195) desclasses Math ou java.awt.Color.

    X. Crgut Programmation objet en Java 113

  • '&

    $

    %

    lments mthodologiques

    X. Crgut Programmation objet en Java 114

  • '&

    $

    %

    Les classes du point de vue des utilisateursJusqu maintenant, nous avons dfini une classe en nous plaant du pointde vue du programmeur charg de la raliser. Il est intressant de se placerdu point de vue des programmeurs qui lutiliseront (les utilisateurs ).Point de vue du programmeur : une classe est compose de : attributs : stockage dinformations (conservent ltat de lobjet) ; mthodes : units de calculs.Point de vue de lutilisateur : une classe est un ensemble de : requtes : informations qui peuvent tre demandes la classe ; commandes : services raliss par la classe.Une requte correspond soit un attribut (information stocke), soit unemthode (information calcule).Lutilisateur de la classe doit accder de la mme manire uneinformation, quelle soit calcule ou stocke. Cest le principe de laccsuniforme. En Java, il est donc ncessaire de dfinir des mthodes daccs.

    X. Crgut Programmation objet en Java 115

  • '&

    $

    %

    Illustration : rponse lexercice 9 (Compteur)1. Dfinir la vue utilisateur

    Compteurrequtes

    valeur : intcommandes

    razincrmenterset(valeur : int)

    public class Compteur {

    public int getValeur() { ... }

    public void raz() { ... }

    public void incrmenter() { ... }

    public void set(int valeur) { ... }

    }

    Chaque requte et chaque commande devient une mthode La requte valeur devient soit getValeur(), soit valeur() On sait donc comment utiliser un compteur !

    X. Crgut Programmation objet en Java 116

  • '&

    $

    %

    2. Dfinir le(s) constructeur(s)

    Compteurrequtes

    valeur : intcommandes

    razincrmenterset(valeur : int)

    constructeursCompteur(valeur : int)

    public class Compteur {

    public Compteur(int valeur) { ... }

    public int getValeur() { ... }

    public void raz() { ... }

    public void incrmenter() { ... }

    public void set(int valeur) { ... }

    }

    On sait donc aussi crer un compteur.

    X. Crgut Programmation objet en Java 117

  • '&

    $

    %

    3. Programme de test1 class TestCompteur {2 public static void main(String[] args) {3 Compteur c = new Compteur(10);4 assert c.getValeur() == 10;5 c.incrmenter();6 assert c.getValeur() == 11;7 c.raz();8 assert c.getValeur() == 0;9 c.set(5);

    10 assert c.getValeur() == 5;11 }12 }

    Compiler : javac ExempleCompteur.java Excuter : java -ea ExempleCompteur (ea comme enable assertions) On excute avant dcrire limplantation de la classe Compteur ! Meilleure technique : utiliser JUnit !

    X. Crgut Programmation objet en Java 118

  • '&

    $

    %

    4. Dfinir la vue programmeur : choisir les attributs

    Compteur valeur : int+ getValeur() : int+ raz+ incrmenter+ set(valeur : int)+ Compteur(valeur : int)

    public class Compteur {private int valeur;

    public Compteur(int valeur) { ... }

    public int getValeur() { ... }

    public void raz() { ... }

    public void incrmenter() { ... }

    public void set(int valeur) { ... }}

    Il ne reste plus ( !) qu crire le code des mthodes.

    X. Crgut Programmation objet en Java 119

  • '&

    $

    %

    5. crire le code1 /** Dfinition dun compteur avec incrmentation.2 * @author Xavier Crgut3 * @version 1.4 */4 public class Compteur {5 private int valeur; // valeur du compteur67 /** Initialiser un compteur partir de sa valeur initiale.8 * @param valeurInitiale valeur initiale du compteur9 */

    10 public Compteur(int valeurInitiale) { this.valeur = valeurInitiale; }1112 /** Augmenter dune unit le compteur */13 public void incrmenter() { this.valeur++; }1415 /** Obtenir la valeur du compteur.16 * @return la valeur du compteur.17 */18 public int getValeur() { return this.valeur; }1920 /** Remettre zro le compteur */21 public void raz() { this.set(0); }2223 /** Modifier la valeur du compteur.24 * @param valeur la nouvelle valeur du compteur25 */26 public void set(int valeur) { this.valeur = valeur; }27 }

    X. Crgut Programmation objet en Java 120

  • '&

    $

    %

    Comment dfinir une classePour dfinir une classe, je conseille de suivre les tapes suivantes :

    1. Dfinir la spcification dun point de vue utilisateur : Spcifier les requtes Spcifier les commandes

    2. Spcifier les constructeurs

    3. Prparer les tests

    4. Choisir une reprsentation (choix des attributs)Les attributs sont dfinis private.

    5. Implanter les requtes et les commandes sous forme de mthodes.Ce peut tre une simple mthode daccs pour les requtes quicorrespondent un attribut.

    6. Tester au fur et mesure !

    X. Crgut Programmation objet en Java 121

  • '&

    $

    %

    Conventions de codage : rgles pour nommer

    Ces conventions de codage peut tre trouves lURL :

    http://java.sun.com/docs/codeconv/index.html

    Rgles pour nommer : paquetage : tout en minuscule (java.lang) ; classe : les initiales en majuscule (Equation, MaClasse) ; mthode : en minuscule sauf linitial des mots internes en majuscule

    (rsoudre, setCoeffA, maMthode) ; attribut : comme les mthodes ; constante : tout en majuscule avec les mots spars par des souligns (_)

    (MAX, MA_CONSTANTE).

    X. Crgut Programmation objet en Java 122

  • '&

    $

    %

    Conventions de codage : structure dun fichierpackage ...; // dfinition du paquetage dappartenance

    import ...; // importation des classes utilises

    /*** Commentaire de documentation de la classe* @version* @author Prnom Nom*/

    public class MaClasse { // ==> Le fichier est MaClasse.java

    /* commentaire dimplmentation de la classe */

    // variables (attributs) de classe

    // variables (attributs) dinstance

    // constructeurs

    // mthodes. Les mthodes sont regroupes par thme// et non par droit daccs.

    }

    X. Crgut Programmation objet en Java 123

  • '&

    $

    %

    Conventions de codage : rgles diverses Indentation : 4 espaces, la tabulation est fixe 8. Longueur des lignes : 80 caractres maximum. Les lignes sont coupes

    de prfrence aprs une virgule ou devant un oprateur. Dclarer une seule variable par ligne (facilite sa documentation) :

    int maVariable; // sa documentation

    Dclarer les variables en dbut de bloc (bof !). Ne pas mettre de () aprs return (sauf si amliorent la comprhension). Pas despace entre mthode et (. Mettre un espace entre mot-cl et (,

    autour dun oprateur, devant une {, aprs , et ;.while (Math.sqrt(x) > y) {

    ...}

    X. Crgut Programmation objet en Java 124

  • '&

    $

    %

    Conventions de codage : programmation (1/2) Ne pas mettre les attributs (de classe ou dinstance) publics.

    Dfinir ventuellement des accesseurs et des modifieurs. Utiliser la classe et non un objet pour accder un attribut ou mthode de

    classe.MaClasse.mthodeDeClasse(); // OUIunObjet.mthodeDeClasse(); // VITER

    Ne pas utiliser directement des constantes littrales (sauf pour -1, 0 et 1). viter les affectations multiples (a = b = c;) ou dans des expressions

    a = (d = b + c) + r;

    Utiliser les parenthses dans des expressions mlangeant plusieursoprateurs.

    X. Crgut Programmation objet en Java 125

  • '&

    $

    %

    Conventions de codage : programmation (2/2) Faire que la structure du programme ressemble votre intention.

    viter prfrerif (condition) {

    return true;} else {

    return false;}

    return condition;

    if (condition) {return x;

    }return y;

    return (condition ? x : y);

    Mettre XXX dans un commentaire pour signaler un code maladroit maisqui fonctionne et FIXME pour un code qui ne fonctionne pas.

    X. Crgut Programmation objet en Java 126

  • '&

    $

    %

    Les tableaux

    Les tableaux en Java se rapprochent beaucoup des objets : ils sont accessibles par une poigne ;int[] tab1; // tab1 est une poigne sur un tableau (tab1 == null)int tab2[]; // on peut dclarer les tableaux comme en CType[] tab; // une poigne tab sur un tableau de Type

    ils sont crs dynamiquement en utilisant loprateur new.tab1 = new int[5]; // cration dun tableau de 5 entiers attach tab1tab = new Type[capacit]; //cration dun tableau de capacit Type

    Mais ce ne sont pas des objets : ils ont une syntaxe spcifique (les crochets) ; ils taient le seul type gnrique de Java (paramtr par un type, celui des

    lments du tableau) avant la version 1.5.

    X. Crgut Programmation objet en Java 127

  • '&

    $

    %

    Caractristiques dun tableau Un tableau non cr ne peut pas tre utilis (NullPointerException) La capacit du tableau est obtenue par l attribut length.

    double tab[] = new double[10];int nb = tab.length; // nb == 10 (nb de cases alloues)

    Laccs un lment se fait par les crochets ([]).Les indices sont entre 0 (premier lment) et length-1 (dernier lment)Sinon erreur signale par lexception ArrayIndexOutOfBoundsException.

    for (int i = 0; i < tab.length; i++) {tab[i] = i;

    }double p = tab[0]; // premier lmentdouble d = tab[tab.length-1]; // dernier lmentdouble e = tab[tab.length]; // ArrayIndexOutOfBoundsException

    Laffectation de deux tableaux est une affectation de poigne (partage).On peut utiliser System.arraycopy(...).

    X. Crgut Programmation objet en Java 128

  • '&

    $

    %

    Caractristiques dun tableau (suite) Lorsquun tableau est cr (new), chacun de ses lments est initialis

    avec la valeur par dfaut de son type (false, 0, null). Il est possible dinitialiser explicitement le tableau :

    int[] petitsNbPremiers = { 3, 5, 7, 11, 13 };int nb = petitsNbPremiers.length; // nb == 5String[] nomJours = { "lundi", "mardi", "mercredi", ..., "dimanche" };nb = nomJours.length; // nb == 7

    Les tableaux ne peuvent pas tre redimensionns (length ne peut paschanger de valeur). Voir java.util.ArrayList.

    lexception des tableaux de caractres, laffichage parSystem.out.println nest pas lisible.

    System.out.println("nomJours = " + nomJours);--> nomJours = [Ljava.lang.String;@bd0108

    X. Crgut Programmation objet en Java 129

  • '&

    $

    %

    Tableaux dobjetsOn peut bien sr crer des tableaux dobjets. Tout fonctionne comme lestableaux de types lmentaires sauf que le contenu dune case est unepoigne sur un objet du type prcis.

    1 public class Tableauquations {2 public static void main (String args []) {3 quation[] systme = new quation[3];4 systme[0] = new quation(1, 5, 6);5 systme[1] = new quation(4, 4);6 for (int i = 0; i < systme.length; i++) {7 systme[i].rsoudre();8 System.out.print("quation " + (i+1) + " : ");9 systme[i].afficher();

    10 System.out.println("x1 = " + systme[i].x1);11 System.out.println("x2 = " + systme[i].x2);12 }13 }14 }

    X. Crgut Programmation objet en Java 130