java concentré sucré -...

121
Java concentré sucré Petit opuscule de concentré Java destiné aux étudiants ayant des notions de programmation. Daniel Tschirhart

Upload: vonga

Post on 11-Sep-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

  • Java concentr sucr

    Petit opuscule de concentr Java destin aux tudiants ayant des notions de programmation.

    Daniel Tschirhart

  • Java concentr sucr V1.3 -ii-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Un objet est une capsule logicielle oblative avec un tropisme conatif dont l'htronomie est la marque de la dure de l'phmre et de la hoirie.

    Serge MIRANDA

    Introduction La Programmation Oriente Objet _____________________________________ 1

    Java et la POO __________________________________________________________________ 1

    Les classes ____________________________________________________________________ 1

    Que contient une classe _______________________________________________________________ 1 Une classe contient des dclarations d'attributs ______________________________________________________1 Une classe contient des dfinitions de mthodes. _____________________________________________________1

    Porte des attributs et des mthodes ____________________________________________________ 2 Quelle porte utiliser ? __________________________________________________________________________2

    Attribut et mthodes d'instance, attribut et mthode de classe _______________________________ 2 Quand faut-il rendre un attribut ou une fonction statique ________________________________________________3

    Rgles de nommage des classes, attributs et mthodes (important) : _________________________ 3

    Porte d'une classe ___________________________________________________________________ 3

    Comment dfinir une classe ____________________________________________________________ 3

    Exemple de classe ____________________________________________________________________ 3

    Syntaxe des accs aux attributs et aux mthodes. _________________________________________ 4

    Compiler une classe __________________________________________________________________ 4

    Excuter un programme Java ___________________________________________________________ 5

    Exercices ____________________________________________________________________________ 5

    Les donnes manipules par Java _________________________________________________ 7

    Types de donnes manipules par Java __________________________________________________ 7 Donnes de type valeur _________________________________________________________________________7 Donnes de type rfrence ______________________________________________________________________7

    Accs aux attributs et mthodes (rappel) _________________________________________________ 7 Au sein de la classe ____________________________________________________________________________7 En dehors de la classe __________________________________________________________________________7

    Cration (instanciation) des objets ______________________________________________________ 7

    Reprsentation textuelle d'un objet ______________________________________________________ 7

    Destruction des objets _________________________________________________________________ 8

    Point d'entre d'un programme Java _______________________________________________ 8

    O commence un programme Java ? ____________________________________________________ 8

    Exercices ____________________________________________________________________________ 8

    Ecriture et excution des programmes Java _________________________________________ 9

    Edition des programmes Java (rappel) ___________________________________________________ 9

    Compilation des programmes Java (rappel) _______________________________________________ 9 Ligne de commande de compilation________________________________________________________________9 Byte code Java ________________________________________________________________________________9 Chargement des objets en mmoire _______________________________________________________________9

    Paramtrage des chemins de compilation du JDK et des excutables du JRE __________________ 9

    Rendre un programme java excutable : archive JAR ______________________________________ 10

    Crer un JAR laide declipse _________________________________________________________ 12

    Documenter vos programmes avec la JavaDoc ______________________________________ 13

    Qu'appelle-t-on documenter les programmes ? ___________________________________________ 13

    La JavaDoc _________________________________________________________________________ 13

  • Java concentr sucr V1.3 -iii-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Que peut-on documenter ______________________________________________________________ 13

    Gnrer la documentation _____________________________________________________________ 13

    Exemple de documentation ____________________________________________________________ 13

    Une classe trs utilise : La classe String __________________________________________ 15

    Prsentation ________________________________________________________________________ 15

    Constructeurs principaux _____________________________________________________________ 15

    Principales mthodes ________________________________________________________________ 16 Manipulation des caractres de la chane _________________________________________________________ 16 Comparaisons et tests ________________________________________________________________________ 17 Recherches ________________________________________________________________________________ 17

    Conversions ________________________________________________________________________ 18

    La Classe StringBuffer __________________________________________________________ 18

    Prsentation ________________________________________________________________________ 18

    Constructeurs principaux _____________________________________________________________ 18

    Principales mthodes ________________________________________________________________ 18

    transpypage des primitifs________________________________________________________ 19

    Affectations entre primitifs de type diffrents _____________________________________________ 19

    Conversion de primitifs en objet l'aide de leur classe enveloppe ___________________________ 19

    Ncessit des conversions ____________________________________________________________ 19

    Exemple ____________________________________________________________________________ 19

    Formatage des donnes _________________________________________________________ 21

    Formatage des flux __________________________________________________________________ 21

    Formatage des chaines de caractres ___________________________________________________ 21

    Exemple ____________________________________________________________________________ 21

    Oprations E/S console _________________________________________________________ 23

    Entres de donnes partir du clavier __________________________________________________ 23

    Exemple d'utilisation _________________________________________________________________ 23

    Mcanismes de rutilisation _____________________________________________________ 25

    Rutilisation ! _______________________________________________________________________ 25

    L'agrgation ________________________________________________________________________ 25

    La composition ______________________________________________________________________ 26

    L'hritage __________________________________________________________________________ 28 Comment fait-on ! ____________________________________________________________________________ 28 Classes abstraites et methodes virtuelles pures ____________________________________________________ 29

    Classes interface ____________________________________________________________________ 31

    Gestion des erreurs dexcution : exceptions _______________________________________ 33

    Grer les erreurs dexcution __________________________________________________________ 33

    Gestion des erreurs base dexceptions ________________________________________________ 33

    Mise en place dun mcanisme de gestion derreurs base dexceptions _____________________ 33

    Esquiver une ou plusieurs exceptions ___________________________________________________ 34

    Le langage des expressions rgulires ____________________________________________ 35

    Syntaxe des motifs dexpression rgulire _______________________________________________ 35 Liste des mta caractres _____________________________________________________________________ 35

  • Java concentr sucr V1.3 -iv-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Squence dchappement _____________________________________________________________________ 35 Rptitions _________________________________________________________________________________ 35 Frontires de recherche _______________________________________________________________________ 36 Classes de caractres ________________________________________________________________________ 36 Rgles de constructions des classes de caractres personnalises _____________________________________ 36 Groupes ___________________________________________________________________________________ 36 Quantificateurs ______________________________________________________________________________ 37 Mise en uvre des expressions rgulires dans la classe String _______________________________________ 37 Mise en uvre des expressions rgulires dans la classe Pattern ____________________________________ 37

    Introductions aux Collections (conteneurs) _________________________________________ 41

    Types de collection __________________________________________________________________ 41

    Collections squentielles _____________________________________________________________ 41 Vecteurs (Array) _____________________________________________________________________________ 41 Pile _______________________________________________________________________________________ 41 File fifo ____________________________________________________________________________________ 41 Sacs (bags) ________________________________________________________________________________ 42 Ensembles (set) _____________________________________________________________________________ 42

    Collections associatives ______________________________________________________________ 42

    Structures de donnes utilises pour fabriquer les collections (structures de donnes fondamentales) ______________________________________________________________________ 42

    Tableau ____________________________________________________________________________________ 42 Listes lies simples___________________________________________________________________________ 42 Listes doublement lies _______________________________________________________________________ 43 Arbres binaire _______________________________________________________________________________ 44 Tables adressage dispers (hastable) __________________________________________________________ 44

    Type de donnes abstrait et structures de donnes fondamentales __________________________ 45

    Les classes paramtres ________________________________________________________ 47

    Ncessit de transtyper les types Object ________________________________________________ 47

    Utilisation des classes gnriques ______________________________________________________ 47

    Boxing et unboxing automatique _______________________________________________________ 48

    Dfinition d'une classe gnrique ______________________________________________________ 48

    Instanciation d'une classe gnrique____________________________________________________ 48

    Les Collections squentielles dans Java ___________________________________________ 49

    Graphe d'hritage simplifi des collections squentielle Java _______________________________ 49

    Parcourt des collections ______________________________________________________________ 49

    Interface List (T.D.A.) _________________________________________________________________ 50

    Classes concretes Vector, ArrayList, LinkedList (S.D.F.) ___________________________________ 50

    Les ensembles : Interface Set (T.D.A.) ___________________________________________________ 51

    Classe concrtes HashSet, TreeSet (S.D.F.) ______________________________________________ 52

    Les Collections Java associatives ________________________________________________ 53

    Dfinitions __________________________________________________________________________ 53

    Hirarchie des classes des conteneurs associatifs ________________________________________ 53

    Interface MAP (T.D.A.) ________________________________________________________________ 53

    Classe TreeMap (S.D.F.) ______________________________________________________________ 54

    Classe HashMap (S.D.F.) ______________________________________________________________ 54

    Les oprations Entres/sortie ____________________________________________________ 55

    Les flots Java _______________________________________________________________________ 55 Construire les flots Java _______________________________________________________________________ 55 Utiliser les flots Java __________________________________________________________________________ 56

  • Java concentr sucr V1.3 -v-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Flots prdfinis ______________________________________________________________________ 57

    Les fichiers _________________________________________________________________________ 57 Instancier des objets fichiers ___________________________________________________________________ 57 Chemin des fichiers. __________________________________________________________________________ 57 Fichiers d'octets _____________________________________________________________________________ 57 Fichiers de caractres ________________________________________________________________________ 58 Fichiers de caractres lecture/ecriture lignes par lignes ______________________________________________ 58 Fichiers d'lments primitifs ____________________________________________________________________ 58 Fichiers d'objets _____________________________________________________________________________ 59

    La programmation graphique ____________________________________________________ 61

    API graphiques de Java _______________________________________________________________ 61

    Classes principales de l'API AWT ______________________________________________________ 61

    Cration d'une fentre ________________________________________________________________ 61

    Principaux lments dIHM ____________________________________________________________ 62 Les labels __________________________________________________________________________________ 62 Les zones d'dition ___________________________________________________________________________ 63 Les cases cocher___________________________________________________________________________ 64 Les boutons ________________________________________________________________________________ 65 Les combos ________________________________________________________________________________ 65 Les boites listes ____________________________________________________________________________ 66 Les TextArea _______________________________________________________________________________ 67 FileDialog __________________________________________________________________________________ 68

    Disposer les contrles dans la fentre __________________________________________________ 70 Exemple ___________________________________________________________________________________ 70

    Mettre en place les contrles dans la fentre _____________________________________________ 70 Exemple ___________________________________________________________________________________ 70

    Caractristiques communes aux contrles _______________________________________________ 70 Couleur d'avant plan et arrire plan ______________________________________________________________ 70 Taille du contrle (Largeur, Hauteur) _____________________________________________________________ 70 Nom interne ________________________________________________________________________________ 70 Position et dimension _________________________________________________________________________ 70 Police _____________________________________________________________________________________ 71

    Interagir avec l'utilisateur : la programmation vnementielle _______________________________ 72 Principe de la programmation vnementielle ______________________________________________________ 72 Gestionnaires dvnements ou couteur _________________________________________________________ 72 Type d'vnements __________________________________________________________________________ 72 Abonnement aux vnements __________________________________________________________________ 72 Syntaxe des abonnements _____________________________________________________________________ 72 Quels vnements pour quels contrles ? _________________________________________________________ 73 Evnements lis la fentre ___________________________________________________________________ 73 vnements et abonnements ___________________________________________________________________ 76

    Contrles de type Timer ______________________________________________________________ 78

    Utilisation de Windows Builder sous Eclipse. _______________________________________ 81

    Cration dune Application avec WB ____________________________________________________ 81

    Ajout dune IHM dans lapplication prcdente ___________________________________________ 82

    Enrichissement de la fentre __________________________________________________________ 83

    Les applettes __________________________________________________________________ 85 Cration ___________________________________________________________________________________ 85 Scurit des applettes ________________________________________________________________________ 85

    Les applications Java WebStart __________________________________________________ 87 Cration dune application Java WebStart ________________________________________________________ 87

    Java et La programmation Multitaches _____________________________________________ 89

    Les tches (thread) __________________________________________________________________ 89

  • Java concentr sucr V1.3 -vi-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Dfinition ___________________________________________________________________________ 89

    Etats d'une tche ____________________________________________________________________ 89 Etat Non cr _______________________________________________________________________________ 89 Etat Dormant ou cr _________________________________________________________________________ 89 Etat Prt ou ligible __________________________________________________________________________ 90 Etat en Excution ____________________________________________________________________________ 90 Etat Bloqu ou Suspendu ______________________________________________________________________ 90

    Transitions entre tats d'une tche _____________________________________________________ 90 Cration d'une tche (cre) ____________________________________________________________________ 90 Activation d'une tche (active) __________________________________________________________________ 90 Attribution du processeur la tche ______________________________________________________________ 90 Suspension d'une tche _______________________________________________________________________ 90 Reprise d'une tche bloque ___________________________________________________________________ 90 Fin d'une tche ou destruction d'une tche ________________________________________________________ 90 Suppression d'une tche ______________________________________________________________________ 90 Attribution du processeur physique ______________________________________________________________ 90 Abandon du processeur physique _______________________________________________________________ 90

    Politiques d'ordonnancement __________________________________________________________ 90

    Les Taches dans Java ________________________________________________________________ 92 Package ___________________________________________________________________________________ 92 Priorits des tches __________________________________________________________________________ 92 Cration des tches __________________________________________________________________________ 92

    Problmes pos par les accs concurrents ______________________________________________ 94 Rentrance des fonctions ______________________________________________________________________ 94 Sections critiques ____________________________________________________________________________ 94 Objets utiliss pour le verrouillage des section critiques ______________________________________________ 95

    Modles d'change de donne _________________________________________________________ 96 Modle producteur-consommateur ______________________________________________________________ 96 Modle lecteur - rdacteur ____________________________________________________________________ 100

    Synchronisations des tches _________________________________________________________ 100 Mcanismes de synchronisation directs__________________________________________________________ 100 Mcanismes de synchronisation indirects ________________________________________________________ 100

    La programmation rseau ______________________________________________________ 103

    Serveurs et clients __________________________________________________________________ 103

    Exemple un intranet simple ___________________________________________________________ 103

    Identification des clients : adresse MAC ________________________________________________ 103

    Protocole IP : trames IP ______________________________________________________________ 103

    Protocole TCP-IP ___________________________________________________________________ 103

    Adresses IP (V4) ____________________________________________________________________ 103

    Exemple de rseau __________________________________________________________________ 104

    Classes de rseau __________________________________________________________________ 104

    Masques de sous-rseau _____________________________________________________________ 104

    Adresses rserves _________________________________________________________________ 105

    Programmation rseau ______________________________________________________________ 105

    Sockets et ports ____________________________________________________________________ 105

    Utilisation des sockets par le client ____________________________________________________ 105 Connexion un serveur ______________________________________________________________________ 105 Exemple appel du service date avec Java ________________________________________________________ 106 Les adresses Internet ________________________________________________________________________ 106 Quelques exemples d'applications rseau ________________________________________________________ 107

    Utilisation des sockets par un serveur _________________________________________________ 111

    Implmentation d'un serveur _________________________________________________________ 111

  • Java concentr sucr V1.3 -vii-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Serveur multitches (multithread) _____________________________________________________ 112

    Timeout des sockets ________________________________________________________________ 113

  • Java concentr sucr V1.3 -viii-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

  • Java concentr sucr V1.3 -1-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    INTRODUCTION A LA PROGRAMMATION ORIENTEE OBJET

    La Programmation Oriente Objet vise appliquer au domaine du logiciel les mmes concepts de standardisation que

    ceux utiliss dans le domaine industriel (mcanique, lectrique, lectronique, ). Les objets sont des composants

    logiciels assembls partir d'autres composants en rutilisant directement les proprits et des mthodes (agrgation ou

    composition) et ou spcialiss partir d'autres composants (hritage des proprits et des mthodes).

    Les objets communiquent entre eux par envois de messages (appels de fonctions ou mthodes) et possdent des proprits

    refltant leur tat.

    Les objets sont dcrits l'aide d'une classe. Attention une classe n'est pas un objet tout comme la recette du souffl aux

    pommes n'est pas le souffl aux pommes !

    Il faut penser un objet comme une variable amliore :

    Un objet stocke des donnes (attributs),

    Mais en plus on peut lui demander de faire des oprations sur lui-mme.

    En thorie, on peut prendre n'importe quel composant conceptuel dun problme et le reprsenter en tant qu'objet dans un

    programme.

    La classe ci-contre dcrit une ampoule lectrique :

    Son tat (allum, teint) est mmoris dans lattribut Etat

    Les oprations que lon peut faire avec cette ampoule (messages que lon peut lui envoyer) sont dfinies dans la classe.

    Une fois la classe Ampoule dfinie, on peut crer (on dit instancier) autant

    d'objets qu'on laide de cette classe :

    Ampoule lampe1 = new Ampoule()

    Ampoule lampe2 = new Ampoule()

    puis envoyer chaque ampoule un message :

    lampe1.allumer();

    lampe2.allumer();

    JAVA ET LA POO Java reprend intgralement les concepts de la Programmation Oriente Objet. On dit que Java est un langage pur objet car

    il nautorise pas, contrairement au langage C++ dont il reprend la syntaxe, lcriture de programmes non objet.

    Les objets sont dcrits l'aide de classes (la recette) et sont crs (on dit instancis) avant leur utilisation l'aide de

    l'oprateur new.

    LES CLASSES Une classe est la description dun objet. Un programme Java utilise pour lessentiel des classes toutes faites issus de la

    bibliothque Java. Ces classes sont rassembles par catgorie (packages) et ces packages doivent tre spcifis avant leur

    utilisation par linstruction import sauf pour le package java.lang qui est utilis par dfaut. java.lang contient

    les dfinitions des classes les plus usuelles.

    QUE CONTIENT UNE CLASSE UNE CLASSE CONTIENT DES DECLARATIONS D'ATTRIBUTS Un attribut peut tre :

    soit une variable (ou une constante) de type natif au langage (boolen, caractre, entier, rel). Ces variables sont dites de type primitif. Une variable nest pas obligatoirement initialise auquel cas elle prend la valeur false pour

    les boolen et 0 pour les autres types.

    soit une rfrence vers autre objet. Une rfrence n'est pas un objet mais une sorte de tlcommande permettant de manipuler l'objet rfrenc. Lobjet rfrenc est mmoris dans une zone de mmoire spciale appele TAS

    gre par la machine Java (le programmeur gnralement ne manipule pas le TAS). La rfrence nest pas

    initialise (sauf initialisation explicite) et prend la valeur null (pour un attribut) et ne rfrence aucun objet.

    UNE CLASSE CONTIENT DES DEFINITIONS DE METHODES. Une mthode est une fonction ou une procdure. Une fonction est un sous-programme retournant une valeur, une

    procdure n'en retourne pas. Fonctions et procdures peuvent avoir des paramtres composs de donnes de type

    primitif et/ou de rfrences d'objets. Lors de la dfinition, ces paramtres sont appels paramtres formels.

    Un ou plusieurs constructeurs.

  • Java concentr sucr V1.3 -2-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Un constructeur est une mthode spciale portant le nom de la classe et ayant pour but d'initialiser (on dit

    construire) l'objet. Le constructeur est appel lors de l'instanciation de l'objet. Le constructeur utilis est dtermin

    par le nombre et les types de ces paramtres prcis lors de l'instanciation de l'objet.

    Si une classe ne dfinit aucun constructeur, un constructeur par dfaut (constructeur sans paramtre) est

    automatiquement dfini. Dans le cas contraire, le constructeur par dfaut nest pas dfini (sauf dfinition

    explicite).

    PORTEE DES ATTRIBUTS ET DES METHODES La porte est spcifie en prfixant les attributs et mthodes l'aide des mots cls , private, protected,

    public.

    pas de prfixe : porte locale au package. Equivalent public mais limit au package.

    prfixe private : porte locale la classe.

    prfixe protected : porte locale la classe et la classe hritante (hritage voir plus loin).

    prfixe public : la porte est globale.

    QUELLE PORTEE UTILISER ? Un des principes de la programmation oriente objet consiste masquer au maximum les dtails d'implmentation, c'est-

    -dire rendre l'utilisation d'une classe indpendante de son implmentation (codage). En pratique on doit pouvoir modifier

    une classe sans affecter les programmes utilisant cette classe. Cette dernire remarque s'applique parfaitement la

    bibliothque Java : un programme crit pour une version 1.2 du JRE, s'excute avec la bibliothque 1.6 (le contraire n'est

    cependant pas vrai). Les rgles respecter sont les suivantes :

    Les attributs doivent tres dans la majorit des cas privs (private). Pour accder un attribut depuis

    l'extrieur de la classe crer un assesseur, c'est--dire une fonction permettant de lire et/ou de modifier l'attribut

    (voir plus loin).

    Les mthodes accessibles depuis l'extrieur de la classe sont soit publiques, si l'accs doit se faire en-dehors de package, soit sans spcification de porte lorsque l'accs doit tre locale au package (cas trs particulier).

    Les mthodes exclusivement utilises par les fonctions membre de la classe doivent avoir une porte private.

    Un constructeur doit avoir une porte public.

    Si une mthode ou un attribut doit tre hrit (voir plus loin), la porte doit tre spcifie avec l'attribut

    protected.

    ATTRIBUT ET METHODES D'INSTANCE, ATTRIBUT ET METHODE DE CLASSE Par dfaut les attributs et les mthodes sont lis un objet et sont appeles attributs et mthodes d'instances. Ceci a pour

    consquence que chaque objet issu de la mme classe possde des attributs indpendants.

    Il est possible casser laffinit que possde un attribut ou une mthode avec un objet laide du mot static. Cet attribut ou

    cette mthode est alors li la classe et non lobjet dont il est issu et devient commun tous les objets.

    Les attributs et mthodes deviennent alors des attributs et des mthodes de classe.

    L'utilisation du prfixe statique n'est pas anodin et a des consquences importantes :

    Les fonctions de classes (fonctions statiques) ne peuvent plus accder aux attributs et aux mthodes d'instances.

    La dure de vie des attributs devient celle du programme et non celle dun objet particulier.

    Mthode ou attribut peuvent tre accds sans utiliser d'objet en utilisant loprateur point.

    En rsum,

    les attributs statiques ont pour caractristique principale suivante : o Ils existent en dehors de tout objet et sont commun tous les objets. o Leur dure de vie est celle du programme.

    Les attributs d'instance ont pour caractristique suivante : o Ils existent uniquement au sein d'un objet et leur valeur est mmorise lintrieur dun objet. o Leur dure de vie est celle de l'objet.

    Les fonctions ou mthodes statiques ont pour caractristiques : o De ne pas ncessiter dobjet pour y accder. o Ne peuvent accder qu' des attributs statiques.

    Les fonctions ou mthodes d'instance ont pour caractristique : o Ncessitent d'instancier un objet pour pouvoir les utiliser.

  • Java concentr sucr V1.3 -3-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    QUAND FAUT-IL RENDRE UN ATTRIBUT OU UNE FONCTION STATIQUE Jamais ou presque ! Il est trs rare dutiliser des attributs ou des fonctions statiques. On utilisera des fonctions statiques

    lorsque l'on veut regrouper au sein d'une classe un ensemble de fonctions utilitaires utilises dans le mme domaine. Un

    exemple typique est la classe Math. Cette classe regroupe l'ensemble des fonctions mathmatiques plus courantes. Il

    parait logique que pour utiliser ces fonctions, il ne soit pas ncessaire d'instancier un objet. Exemple : calculer la racine

    carre de 2 s'crit : double racineCarrDeDeux = Math.sqrt(2);

    et non : Math objetMath = new Math();

    double racineCarrDeDeux = objetMath.sqrt(2);

    Le mme raisonnement est valable pour des attributs ou des constantes :

    // Calcul du primtre d'un cercle de 10m de rayon double primetreCercle = 2 * Math.PI * 10;

    Les attributs statiques possdent une proprit intressante : ils sont commun tous les objets et peuvent tre utiliss pour

    partager un ensemble de valeurs communes.

    REGLES DE NOMMAGE DES CLASSES, ATTRIBUTS ET METHODES (IMPORTANT) : Une classe commence toujours par une majuscule. Si la classe est un mot compos, la premire lettre du mot

    compos est en majuscules. Exemple Moteur, MoteurAvion

    Un attribut commence toujours par une minuscule. Si l'attribut est un mot compos, la premire lettre du mot

    compos est en majuscules. Exemple : tableau, unTableau. Une constante est toujours en majuscules.

    Une mthode commence toujours par une minuscule. Si la mthode est un mot compos, la premire lettre du mot compos est en majuscules.

    Bien que non obligatoire, le respect de ces rgles :

    Dnote la rigueur du programmeur,

    Facilite la lecture des programmes, toutes les classes, mthodes et attributs de la bibliothque Java respectant cette rgle.

    PORTEE D'UNE CLASSE Si la classe est prfixe avec l'attribut public sa porte est globale, sinon elle est locale au package dans laquelle elle a

    t dfinie.

    COMMENT DEFINIR UNE CLASSE La classe minimale que l'on peut dfinir est la suivante (pas d'attribut, pas de mthode) :

    public class Minimale

    {

    }

    Cette dfinition doit tre place dans un fichier portant le mme nom que la classe et portant l'extension .java.

    Un fichier .java peut comporter plusieurs classes (non conseill), mais une seule doit possder l'attribut public.

    Exemple : Dans l'exemple prcdent la classe Minimale est place dans le fichier Minimale.java

    Cette classe possde une mthode implicite: public Minimale() {}

    Cette mthode est appel constructeur par dfaut. Celui-ci est gnre automatiquement par le compilateur Java (sauf si

    la classe comporte dj un constructeur). Un constructeur joue un rle de premire importance dans une classe puisqu'il a

    pour but de crer l'objet. La classe Minimale est parfaitement instanciable par :

    Minimale mini = new Minimale();

    Remarquer ici l'appel explicite du constructeur par dfaut : Minimale().

    La classe ne prsente videment aucun intrt.

    EXEMPLE DE CLASSE

    La classe suivante dcrit un tudiant (en caractres gras, les mots rservs du langage).

    Cette dfinition doit tre place dans un fichier portant le mme nom que la classe et portant l'extension .java

    (rappel).

  • Java concentr sucr V1.3 -4-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    public class Etudiant

    {

    private static int nombre; // attribut de classe, porte globale

    private int promo; // attribut d'instance, " limite la classe

    private String nom ; // attribut d'instance, " " "

    String cole; // attribut d'instance, porte limite au package

    public static int getNombre () // mthode de classe de porte globale

    {

    return nombre;

    }

    public String toString() // mthode d'instance de porte globale

    {

    return nom + ":" + promo;

    }

    int quellePromo() // mthode d'instance, port limit au package

    {

    return promo;

    }

    public Etudiant() // constructeur par dfaut

    {

    promo = 2017;

    nom = "";

    }

    public Etudiant(String n, int p, String cole)// constructeur spcifique

    {

    nom = n; promo = p;

    this.cole = cole;

    nombre++;

    }

    }

    Remarque :

    Lattribut cole a une porte incorrecte (choisir private).

    La mthode getNombre est un assesseur, il permet de lire lattribut.

    SYNTAXE DES ACCES AUX ATTRIBUTS ET AUX METHODES. Pour un lment de classe (attribut statique) : Classe.nom.

    Exemple : System.out.println(Etudiant.getNombre());

    Pour un lment d'instance : objet.nom.

    Exemple : Etudiant e1 = new Etudiant();

    Etudiant e2 = new Etudiant(2014, "LaJoie", "Eigsi");

    e1.cole = "Eigsi"; // accs direct un attribut : non recommand

    String s = e1.toString(); // appel d'une mthode

    COMPILER UNE CLASSE Une classe est compile par le compilateur java javac. Celui-ci gnre un fichier .class par classe compile. Ce

    fichier est appel byte code et peut tre excut sur toute plateforme comportant le JRE (environnement java JRE : Java

    Runtime Environnement). Le JRE fournit un interprteur appel java qui excutera vos fichiers .class.

    Exemples (on supposera que les variables d'environnement sont correctement dfinies. Pour dfinir les variables

    d'environnement voir plus loin) :

    Lancer un shell (ouvrir une fentre de commande).

    Compiler la classe Etudiant javac Etudiant.java

    javac gnre un fichier Etudiant.class

    Compiler toutes les classes (A.java, B.java, C.java) du rpertoire courant javac *.java

    javac gnre les fichiers A.class, B.class, C.class

  • Java concentr sucr V1.3 -5-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    EXECUTER UN PROGRAMME JAVA Pour qu'un programme Java soit excutable, une des classes doit comporter la fonction main suivante.

    public static void main(String[] args)

    {

    // ...

    }

    Pour excuter un programme Java, il faut lancer l'interprteur Java sur la classe contenant une fonction main. Exemple :

    java A Excute le byte code A.class. Celui-ci doit contenir la dfinition de la fonction main.

    EXERCICES 1. Quelles sont les conventions de nommage des classes, des attributs et des mthodes Java ? 2. Quelle est la diffrence entre une classe et un objet ? 3. Qu'est-ce qu'un attribut de classe ?

    4. Comment accder un attribut de classe public en dehors de sa classe ?

    5. Comment accder un attribut de classe dans sa classe ? 6. Qu'est-ce qu'un attribut d'instance ?

    7. Comment appeler une mthode public d'instance en dehors de sa classe ?

    8. Comment appeler une mthode public de classe en dehors de sa classe ?

    9. Quel type d'attribut peut utiliser une mthode de classe ? 10. Rappeler les rgles d'utilisation des portes pour un attribut ou une mthode.

    11. Le code suivant de la fonction main dfini dans la classe Etudiant est faux ! 1. public static void main(String[] args) // dfini dans la classe Etudiant 2. { 3. nom = "Durand"; 4. promo = 2012; 5. Etudiant e1 = new Etudiant("Insa", 2012); 6. System.out.println(e1.nom); 7. }

    Donner les N de lignes comportant des erreurs et argumenter vos rponses. 12. Quel est gnralement le rle d'un constructeur ? 13. Qu'est-ce qu'un constructeur par dfaut ? 14. Dans quelle(s) circonstance(s) le compilateur Java gnre-t-il automatiquement un constructeur par dfaut ? 15. Comment prciser le constructeur appeler lors de l'instanciation d'un objet ? 16. Comment s'appelle le compilateur Java ? 17. Comment s'appelle la machine Java (interprteur) ?

  • Java concentr sucr V1.3 -6-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

  • Java concentr sucr V1.3 -7-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    LES DONNEES MANIPULEES PAR JAVA

    TYPES DE DONNEES MANIPULEES PAR JAVA Java manipule deux types de donnes :

    Les donnes de type valeurs appeles primitifs (entiers, rels, caractres, boolens)

    Des donnes de type rfrence qui sont des tlcommandes vers des d'objets.

    DONNEES DE TYPE VALEUR Les donnes de type valeur (primitifs) sont alloue automatiquement en mmoire au moment de la dclaration et

    leur accs est trs rapide.

    En l'absence d'initialisation explicite leur valeur est gale :

    o 0 pour les attributs d'instance ou de classe (false pour les boolens),

    o quelconque pour les variables locales aux mthodes. Dans ce cas la donne doit tre initialise avant utilisation sous peine d'erreur de compilation.

    Chaque type valeur possde une classe enveloppe, lui permettant d'tre transforme en rfrence (voir plus loin).

    DONNEES DE TYPE REFERENCE Les donnes de type rfrence (les rfrences d'objets) sont alloues explicitement par loprateur new appliqu

    une classe ou un tableau. Nota : pour les objets de type String le new est implicite.

    En l'absence d'allocation explicite par l'oprateur new, leur valeur est gale :

    o null pour les attributs et leur accs provoque une erreur d'excution appele exception.

    o quelconque pour les rfrences locales aux mthodes. Dans ce cas la rfrence doit tre alloue avant utilisation sous peine d'erreur de compilation.

    Les oprateurs daffection et de comparaison agissent diffremment suivant que l'opration porte sur un

    type valeur ou un type rfrence. Avec les rfrences, les oprateurs utilisent la valeur des rfrences et

    non les objets rfrencs. Exemple :

    String s1 = "abc"; String s2 = s1;

    if (s1==s2) // expression incorrecte, utiliser s1.equals(s2)

    ACCES AUX ATTRIBUTS ET METHODES (RAPPEL) AU SEIN DE LA CLASSE

    Les mthodes d'instances ont accs sans restriction aux attributs et aux mthodes d'instance et de classe.

    Les mthodes de classe n'ont accs qu'aux attributs et aux mthodes de classe.

    EN DEHORS DE LA CLASSE Pour les attributs d'instance leur accs n'est possible que si celui-ci est public et se fait par l'oprateur point

    (.) prcd de l'objet utiliser :

    Exemple : e2.toSTring();

    Pour les attributs de classe, leur accs n'est possible que si celui-ci est public et se fait par l'oprateur point (.) prcd de la classe utiliser.

    Exemple : Etudiant.getNumbre();

    CREATION (INSTANCIATION) DES OBJETS Un objet est cr (on dit instanci) l'aide de l'oprateur new.

    Le code suivant instancie trois tudiants (voir classe Etudiant page 4) l'aide du constructeur spcifique : Etudiant(String, int, String): Etudiant e1 = new Etudiant("Dupond", 2010, "Eigsi");

    Etudiant e2 = new Etudiant("Durant", 2011, "Centrale Nantes");

    Etudiant e3 = new Etudiant("Lajoie", 2009, "Eigsi");

    La construction suivante est interdite :

    Etudiant e4 = new Etudiant("Lajoie", 2009); // pas de constructeur de cette signature.

    A la suite de ces instanciations les donnes alloues sont les suivantes (voir dfinition de la classe page 4):

    3 entiers promo (un par objet),

    6 rfrences de type String (nom, et cole) (deux par objet),

    1 entier nombre commun tous les objets.

    REPRESENTATION TEXTUELLE D'UN OBJET La reprsentation textuelle des proprits d'un tudiant est rendue possible grce la dfinition d'une mthode

    toString respectant la signature suivante : public String toString().

    Cette mthode est systmatiquement appele par la mthode println lorsqu'on lui passe la rfrence d'un objet.

  • Java concentr sucr V1.3 -8-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    public String toString()

    {

    return nom + " : " + cole + " promo " + promo;

    }

    L'appel de la mthode suivante System.out.println(e3);

    Affiche : Lajoie : Eigsi promo 2009

    La majorit des classes du JDK dfinissent cette mthode.

    DESTRUCTION DES OBJETS Un objet est candidat sa destruction quand :

    il sort de porte,

    une nouvelle rfrence lui est attribue,

    le programme se termine. L'objet n'est pas dtruit immdiatement mais devient inaccessible. Il sera effectivement dtruit lorsque le mcanisme de

    garbage collector incorpor dans la machine Java devient actif. Cela se produit quand le moteur d'excution de Java ne

    dtecte plus aucune activit du processeur ou lorsque la mmoire disponible devient insuffisante.

    POINT D'ENTREE D'UN PROGRAMME JAVA

    OU COMMENCE UN PROGRAMME JAVA ? Pour tre excutable, une des classes doit comporter une mthode de classe (mthode static) portant la signature

    suivante : public static void main(String[] args)

    arg est un tableau de type String contenant les arguments de la ligne de commande.

    L'extrait de programme suivant affiche le nombre et la valeur des arguments de la ligne de commande :

    public static void main(String[] args)

    {

    System.out.println("Le programme comporte : " + args.length + " arguments");

    for (int i=0; i < args.length; i++)

    System.out.println(args[i]);

    }

    EXERCICES La classe Test, place dans le mme rpertoire que la classe Etudiant contient la dfinition suivante :

    class Test

    {

    public static void main(String[] args)

    {

    Etudiant e1 = new Etudiant();

    Etudiant e2 = new Etudiant("Dupond", 2012, "Insa Lyon");

    Etudiant e3 = new Etudiant("Lajoie", 2012, "Eigi ");

    System.out.println(e3);

    }

    }

    1. Quel est le nom du fichier source contenant la classe Test ? 2. Donner la ligne de commande permettant de compiler les classes 3. Donner la ligne de commande permettant d'excuter le programme. 4. Quel est le constructeur appel par la ligne ci-dessous, comment s'appelle ce constructeur

    Etudiant e1 = new Etudiant();

    5. Quel est le constructeur appel par la ligne ci-dessous, comment s'appelle ce constructeur Etudiant e2 = new Etudiant("Dupond", 2012, "Insa Lyon");

    6. Quel est la sortie du programme (affichage) ? 7. Aprs instanciation des objets e1, e2, e3, que contiennent les attributs de chaque objet. 8. La ligne ci-dessous provoque une erreur de compilation. Pourquoi ?

    Etudiant e4 = new Etudiant("Dupond", 2012);

  • Java concentr sucr V1.3 -9-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    ECRITURE ET EXECUTION DES PROGRAMMES JAVA

    EDITION DES PROGRAMMES JAVA (RAPPEL) Une classe doit tre dfinie dans un fichier portant l'extension .java portant le mme nom que la classe.

    Exemple : pour la classe Etudiant le fichier contenant la dfinition de la classe doit s'appeler Etudiant.java

    Ce fichier peut tre dit avec un diteur quelconque, mais en pratique on prfre utiliser des environnements de

    dveloppement logiciels (IDE) facilitant la programmation.

    Si un fichier Java contient plusieurs classes (non conseill) une seule doit possder l'attribut public.

    Le compilateur Java gnre toujours un fichier de byte code .class par classe.

    COMPILATION DES PROGRAMMES JAVA (RAPPEL) Un programme est compil avec le compilateur javac fourni avec le JDK, mais en pratique on prfre utiliser des

    environnements de dveloppement logiciels (IDE) facilitant le reprage des erreurs de syntaxe. Cependant ceux-ci

    utilisent en arrire-plan le compilateur fourni par avec le JDK.

    LIGNE DE COMMANDE DE COMPILATION Exemple le programme java Etudiant.java est compil par la ligne de commande suivante :

    Javac Etudiant.java

    Si le programme comporte plusieurs classes dans des fichiers spars, la ligne de commande peut :

    Spcifier chaque fichier :

    Exemple: pour un programme java comportant les fichiers : Fichier1.java, Fichier2.java,

    Fichier3.java la ligne de commande de compilation est la suivante : Javac Fichier1.java Fichier2.java Fichier3.java

    Spcifier l'ensemble des fichiers : Javac *.java

    Nota : l'intrt de la compilation l'aide de la ligne de commande est de permettre le traitement par lots sur un grand

    nombre de fichiers. Cette technique est utilise pour des programmes comportant un trs grand nombre de classes.

    BYTE CODE JAVA On appelle byte code Java le code binaire issu de la compilation. Celui-ci rside dans des fichiers d'extension

    .class raison d'un fichier par classe.

    CHARGEMENT DES OBJETS EN MEMOIRE La machine virtuelle Java charge les fichiers de byte code de faon dynamique : si un objet fait rfrence un autre objet

    de classe diffrente, l'objet est charg en mmoire en recherchant dans le rpertoire courant (ou dans le rpertoire prcis

    par la variable d'environnement CLASSPATH) un fichier .class portant le mme nom que la classe de l'objet

    rfrence.

    Exemple : Si la classe TestUnitaireEtudiant contient le code suivant :

    public class TestUnitaireEtudiant

    {

    public static void main(String[] args)

    {

    Etudiant[] tabEtudiants = new Etudiant[3];

    tabEtudiants[0] = new Etudiant("Dupond", 2010, "Eigsi");

    tabEtudiants[1] = new Etudiant("Durant", 2011, "Eigsi");

    tabEtudiants[2] = new Etudiant("Lajoie", 2009, "Eigsi");

    for (int i=0; i < tabEtudiants.length; i++)

    System.out.println(tabEtudiants[i]);

    System.out.println(Etudiant.combiens()+ " instancis."); }

    }

    Le fichier de byte code Etudiant.class sera charg en mmoire la ligne : Etudiant[] tabEtudiants = new Etudiant[3];

    PARAMETRAGE DES CHEMINS DE COMPILATION DU JDK ET DES EXECUTABLES DU JRE Ce paramtrage est indispensable pour lancer un programme l'aide de la ligne de commande.

    Pour lancer un programme en ligne de commande, il suffit d'invoquer la machine virtuelle Java (java) et lui passer le

    fichier .class comportant la fonction main. Cela implique que le programme java et que la bibliothque soient trouvs.

  • Java concentr sucr V1.3 -10-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    La variable d'environnement PATH doit contenir le chemin vers l'interprteur java et le compilateur javac et la variable

    d'environnement CLASSPATH doit contenir le chemin de la bibliothque Java. Lexemple ci-dessous est associ la

    version 1.6.21 du JDK. Aprs installation du JDK aller dans le rpertoire dinstallation (gnralement dans Program

    Files) et noter le rpertoire dinstallation du JDK et du JRE.

    Nota : il faut avoir les droits administrateur pour mettre jour les variables denvironnement.

    Aprs ces modification se dloger puis se reloger.

    Si vous navez pas la possibilit dtre administrateur sur votre machine de dveloppement, les fichiers de commande

    suivants (tlchargeable sur le site http://daniel.tschirhart.free.fr/java) permettent de palier cet inconvnient.

    Ces fichiers sont mettre jour en fonction de l'emplacement du JRE et du JDK. @Echo off

    REM cjava.bat

    REM Compile les programmes java prsents dans le rpertoire courant

    REM Personnaliser ventuellement le chemin du jdk

    path C:\Program Files\Java\jdk1.6.0_21\bin;%path%

    javac *.java

    @Echo off

    REM run.bat

    REM Execute le programme java spcifi par la ligne de commande

    REM Personnaliser ventuellement le chemin du jre

    REM Exemple dutilisation : run mainclass

    REM Avec mainclass le nom du fichier class (sans extension) comportant

    REM la fonction main

    java -classpath "C:\Program Files\Java\jre6\lib;." %1

    RENDRE UN PROGRAMME JAVA EXECUTABLE : ARCHIVE JAR Lorsque le programme java comporte une IHM graphique et plusieurs classes (cela

    marche aussi avec une seule classe) il est souhaitable de crer un fichier jar. Un fichier jar est

    une archive en format zip comportant tous les fichiers .class de votre application plus un

    fichier manifest prcisant entre autre quelle est la classe qui comporte la fonction main.

    Lexemple ci-dessous sappuie sur la cration du fichier mix.jar.

    En supposant lorganisation suivante des rpertoires :

    http://daniel.tschirhart.free.fr/java

  • Java concentr sucr V1.3 -11-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    1. Crer un fichier manifest.txt (avec Notepad) la racine du rpertoire bin comportant une ligne prcisant le nom de la classe contenant la fonction main.

    Par exemple pour le programme mix la classe contenant main est IhmMix : Main-Class: IhmMix

    2. Crer larchive par la commande jar.

    Procder de faon suivante :

    Ouvrir une fentre de commande (excuter cmd.exe) dans le rpertoire bin contenant tous vos fichiers .class

    (vrifier par la commande dir que vous tes dans le bon rpertoire), puis taper les commandes suivantes : jar -cvmf ..\manifest.txt ..\mix.jar *.class

    cd ..

    A la suite de cette commande un fichier mix.jar est cr contenant tous les fichiers .class de votre

    application. Ici pour lapplication mix.jar on aura :

    Le rpertoire META-INF contient un

    fichier MANIFEST.MF spcifiant

    les conditions dexcution du

    programme.

    Pour automatiser la commande vous

    pouvez crer une procdure

    catalogue permettant de crer le

    fichier jar sans retaper les lignes de

    commande.

    Si vous navez pas les droits administrateur sur machine de dveloppement et que vous ne pouvez pas mettre jour vos

    variables denvironnement, il faudra spcifier le chemin complet de la commande jar. Par exemple pour une machine sous

    Windows Seven ou XP avec le JDK 1.6.02 la commande sera :

    "C:\Program Files\Java\jdk1.6.0_02\bin\jar" -cvmf ..\manifest.txt ..\xxx.jar *.class

    Un fichier de commande contenant la commande updatejar.bat est disponible sur le site des

    cours java.

  • Java concentr sucr V1.3 -12-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    CREER UN JAR A LAIDE DECLIPSE Il est possible de crer un fichier .jar directement avec Eclipse. Noter cependant que cette procdure est moins pratique

    surtout en phase de projet o il est ncessaire de gnrer souvent un fichier jar pour les tests.

    Lexemple ci-dessous utilise un programme dvelopp dans le TP Introduction aux interfaces graphiques.

    Mode opratoire :

    1. Slectionner le projet dont vous voulez crer un fichier jar, puis clic droit export fichier jar

    puis next.

    2. Slectionner uniquement le dossier src

    3. Dans la mme boite de dialogue, donner le chemin de destination du fichier jar, puis next, dans la boite de dialogue suivante accepter toutes les options par dfaut puis faire next

    4. Cocher Generate the manifest file Utiliser Browse pour spcifier la classe contenant la fonction

    main, ici E5 puis valider toutes les boites de dialogues.

    Eclipse gnre le fichier jar lemplacement spcifi.

    Vous pouvez explorer ce fichier laire dun archiveur comme

    winrar ou renommer provisoirement le fichier en .zip ce qui vous

    permettra de lexplorer directement (sous windows).

    Vrifier en particulier que le fichier manifest spcifie bien la classe

    contenant le fichier main.

  • Java concentr sucr V1.3 -13-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    DOCUMENTER VOS PROGRAMMES AVEC LA JAVADOC

    QU'APPELLE-T-ON DOCUMENTER LES PROGRAMMES ? Documenter les programmes ne consiste pas uniquement commenter une classe et/ou une fonction, mais galement

    gnrer une documentation structure partageable au sein d'un rseau Intranet ou Internet.

    LA JAVADOC Le JDK est fourni avec un outil permettant de documenter de raliser de telles documentations. Cet outil est le

    programme Javadoc (javadoc.exe) situ dans le rpertoire bin du JDK.

    Le programme Javadoc analyse les commentaires de type /** ... */ dans les textes sources et recherche des balises

    commenant par @. Exemple : /**

    * @author dt

    * @version 1.0

    * @docRoot Premier programme Java

    */

    QUE PEUT-ON DOCUMENTER Javadoc permet de documenter :

    1. Un fichier Java (en dehors de la classe) 2. Une classe 3. Une mthode Les environnements de dveloppement comme eclipse facilitent grandement la mise en place des balises en particulier

    pour les mthodes. Les balises dcrivant les paramtres formels et la valeur retourne sont automatiquement gnres ds

    que l'on valide une ligne comportant /** devant la mthode.

    GENERER LA DOCUMENTATION Avec eclipse faire FichierexporterJavajavaDoc. Prciser le chemin du gnrateur javadoc.exe (dans le rpertoire

    du JDK/bin) puis valider toutes les options par dfaut. JavaDoc gnre alors une arborescence de site WEB dans un

    rpertoire doc de votre projet, la racine de la documentation tant default.html.

    EXEMPLE DE DOCUMENTATION /**

    * Classe dcrivant un nb complexe

    * @author dt

    * @version 1.0

    */

    public class Complex

    {

    private double r, i;

    /**

    * Constructeur spcifique : construit un objet partir de re et im.

    * @param re partie relle

    * @param im partie imaginaire

    *

    */

    public Complex(double re, double im)

    {

    r = re;

    i = im;

    }

    /**

    * Additionne deux nb complexes.

    * Version statique.

    * @param g oprande gauche

    * @param d oprande droite

    * @return g+d

    */

    public static Complex add(Complex g, Complex d)

    {

    return new Complex(g.r + d.r, g.i + d.i);

    }

    //...

    }

  • Java concentr sucr V1.3 -14-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

  • Java concentr sucr V1.3 -15-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    UNE CLASSE TRES UTILISEE : LA CLASSE STRING

    PRESENTATION La classe String permet de dcrire des chaines de caractres en format Unicode.

    Les objets crs partir de la classe String sont immuables. Cette proprit permet un objet String dtre

    accessible de faon concurrente dans les programmes multitches. Un objet de classe String peut tre construit sans

    utiliser l'oprateur new, celui-ci tant utilis de faon implicite.

    Exemple :

    1. String s = "ABC"; 2. s = s + "DEF";

    A la ligne 2, s est une nouvelle instance rfrenant "ABCDEF". Ces lignes cres deux objets s dont le

    premier devient inaccessible la ligne 2.

    Nota : l'oprateur + est surcharg dans la classe String et devient un oprateur de concatnation.

    CONSTRUCTEURS PRINCIPAUX La classe String comporte 13 constructeurs ! Les constructeurs principaux sont les suivants :

    Constructeur par dfaut

    String();

    Exemple :

    String s = new String();

    String s = ""; et non String s; (s = null)

    Constructeur de copie

    String(String s);

    Exemple :

    String s = "ABC";

    String s2 = new String(s);

    Nota : du fait du caractre immuable d'un objet de type String ont peut crire : String s1 = "ABC";

    String s2;

    s2 = s1; // s1 et s2 rfrencent la mme instance.

    s1 = s1 + "DEF";

    // Nouvelle instance de s1.

    // s2 pointe toujours sur l'ancienne instance de s1 c'est

    // dire "ABC"

    Constructeurs spcifiques

    String(bytes[] by);

    Permet de construire un string partir d'un tableau d'octets. Typiquement utilis lors de la rception de caractres sur le

    Web (caractres ASCII).

    Exemple

    byte[] bTab = { 65, 66, 67 }; // 65 = caractre ascii 'A'

    String s = new String(bTab); // s = "ABC"; (Unicode)

    String(bytes[] b, int offset, int length);

    Permet de construire un String partir d'un tableau d'octets en commenant l'indice offset sur une longueur length.

    String(char[] ch);

    Permet de construire un String partir d'un tableau de caractres Unicode.

  • Java concentr sucr V1.3 -16-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Exemple : char[] cTab = { 'a', 'b', 'c' };

    String s = new String(cTab); // s = "abc";

    String(char[] ch, int offset, int length);

    Permet de construire un string partir d'un tableau de caractres en commenant l'indice offset sur une longueur

    length.

    String(StringBuffer buff);

    Construit une chaine partir d'un StringBuffer

    PRINCIPALES METHODES La classe comporte 63 mthodes !

    Les principales mthodes sont les suivantes :

    MANIPULATION DES CARACTERES DE LA CHAINE

    String toUpperCase();

    Converti les caractres d'une chane en majuscules.

    Exemple : String s = "abCdE";

    s = s.toUpperCase(); // s = "ABCDE"

    String toLowerCase();

    Converti les caractres d'une chane en minuscules.

    String replace(char oldChar, char newChar);

    Remplace toutes les occurrences de oldChar par newChar.

    Exemple: String s = "(12,3 ; 30,5)"; // nombre complexe saisi

    s = s.replace(',' , '.'); s = "12.3 ; 30.5)"

    String replaceAll(String regex, String replacement);

    Permet de remplacer les caractres dcrits par une expression rgulire regex par la chane replacement.

    Exemple : String s ="N: 0033-546340012 12/8/2008";

    s = s.replaceAll("\\d{4}-", "0");

    // s = "N: 0546340012 12/8/2002";

    String concat(String autreChaine);

    Concatne la chaine courante avec autreChaine.

    Exemple : String s1 = "ABC";

    String s2 = "DEF");

    s1 = s1.concat(s2); // s1 = s1 + s2

    String[] split(String regex);

    Dcoupe la chaine en tableau de String en se servant de la marque donne par l'expression rgulire regex.

    Exemple :

    String cplx = "(12,5 ; 50,7)";

    cplx = cplx.replace('(', ' ');

    cplx = cplx.replace(')' , ' ');

    cplx = cplx.replace(',' , '. ');

    String[] sTab = s.plit(";");

    double r = Double.parseDouble(sTab[0]); // 12.5

    double i = Double.parseDouble(sTab[1]); // 50.7

  • Java concentr sucr V1.3 -17-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    Sring trim();

    Supprime de la chane courante les espaces en fin de chaine

    Exemple :

    String s= "123 ";

    s = s.trim(); // s="123";

    String substring(int begin);

    Retourne partir de la chaine courante une chaine dbutant la position begin.

    Exemple :

    String s = "CaraMiel";

    System.out.println(s.substring(4)); // affiche Miel

    String substring(int begin, int end);

    Retourne partir de la chaine courante une chaine dbutant begin et se terminant end.

    Exemple :

    String s = "Coco aime le coca";

    System.out.println(s.substring(0, 4)); // affiche Coco

    COMPARAISONS ET TESTS

    int compare(String autre);

    Compare la chane courante une chane avec une autre :

    Exemple :

    String s1="ABC";

    s2 = "abc";

    System.out.println(s1.compareTo(s2)); // < 0

    System.out.println(s1.compareTo(s1)); // =0

    System.out.println(s2.compareTo(s1)); // > 0

    Nota : String s3 = "ABC";

    (s3==s1) vaut false (compare les rfrences).

    int compareToIgnoreCase(String autre);

    Compare une chane avec une autre sans tenir compte de la casse.

    boolean endsWith(String suffix);

    Teste si la chane courante se termine par suffix.

    Exemple : String s1= "ABDEF";

    s1.endsWith("EF"); retourne vrai

    boolean startWith(String prfix);

    Teste si la chane courante dbute par prfix.

    RECHERCHES

    int indexOf(int ch);

    Retourne la position de ch dans la chane courante ou -1. Permet donc de tester la prsente d'un caractre dans une

    chane.

    Exemple : String s="12,3";

    s.indexOf(','); // retourne 2

  • Java concentr sucr V1.3 -18-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    s.indexOf('.'); // retourne -1

    int indexOf(int ch, int fromIndex);

    Retourne la position de ch partir de la position fromIndex dans la chane courante ou -1.

    int lastIndexOf(int ch, int fromIndex);

    Retourne dernire position de ch partir de la position fromIndex dans la chane courante ou -1.

    int length();

    Retourne la longueur de la chane courante.

    Exemple :

    String s="12,3";

    int len = s.length(); // len = 4

    char charAt(int index);

    Permet d'obtenir le caractre de la chaine courante la position index.

    Exemple :

    String s = "+ 56";

    char c = s.charAt(0); // +

    CONVERSIONS Les fonctions suivantes permettent de convertir en String des types primitifs

    String valueOf(TYPE_PRIMITIF val);

    TYPE_PRIMITIF : char, int, long, float, double, boolean

    LA CLASSE StringBuffer

    PRESENTATION La classe StringBuffer permet de dcrire des chaines de caractres en format Unicode.

    Contrairement la classe String, les objets crs partir de la classe String ne sont pas immuables, c'est--dire

    peuvent tre modifis. Dans une application professionnelle, cette classe doit tre utilise la place de la classe String

    lorsque des objets doivent tre cres et dtruits un grand nombre de fois (moins de fragmentation de la mmoire et

    beaucoup plus d'efficacit).

    CONSTRUCTEURS PRINCIPAUX La classe String comporte 4 constructeurs. Les constructeurs principaux sont les suivants :

    Constructeurs

    StringBuffer();

    Construit une chane vide et rserve 16 caractres.

    StringBuffer(int capacity);

    Construit une chane vide de taille capacity.

    StringBuffer(String str);

    Construit une chane partir d'un string.

    PRINCIPALES METHODES Consulter la documentation de la classe.

  • Java concentr sucr V1.3 -19-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    TRANSPYPAGE DES PRIMITIFS

    AFFECTATIONS ENTRE PRIMITIFS DE TYPE DIFFERENTS L'affectation est autorise entre types diffrents, lorsqu'il n'y a pas de risque de perte d'information.

    Par exemple on peut mmoriser un entier dans un rel mais pas l'inverse. Dans ce dernier cas on effectue une opration de

    transtypage explicite. Exemple :

    int j = 10;

    double d = 10;

    ...

    d = j; // autoris

    j = (int)d; // transtypage explicite vers un type int

    CONVERSION DE PRIMITIFS EN OBJET A L'AIDE DE LEUR CLASSE ENVELOPPE Java dfini une classe enveloppe pour chaque primitif. Pour les :

    entiers : classe Integer

    rels double prcision : classe Double

    caractres : classe Character

    boolen : classe Boolean

    NECESSITE DES CONVERSIONS Lorsque l'on veut mmoriser un primitif dans un conteneur, il est ncessaire de convertir celui-ci en objet (les conteneurs

    ne contiennent que des objets). Deux techniques sont possibles.

    Convertir :

    les types primitifs en objet de classe enveloppe (opration de boxing)

    les types primitifs en String A partir de Java 5, les oprations boxing sont toujours prsentes mais sont transparentes au programmeur.

    EXEMPLE

    public class ExempleConversions

    {

    public static void main(String[] args)

    {

    // Boxing d'un entier

    Integer objInt = new Integer(10); // JRE > 5 Integer objInt = 10 ;

    // UnBoxing

    int i = objInt.intValue(); // JRE > 5 int i = objInt;

    // Boxing d'un rel

    Double objDouble = new Double(10.0); // JRE > 5 Double objDouble = 10.0 ;

    // UnBoxing

    double d = objDouble.doubleValue(); // JRE > 5 double d = objDouble ;

    // int -> String

    String sInt = Integer.toString(10);

    // String -> int

    int v = Integer.parseInt(sInt);

    // double -> String

    String sDouble = Double.toString(10.0);

    // String -> double

    double d = Double.parseDouble(sInt);

    }

    }

  • Java concentr sucr V1.3 -20-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

  • Java concentr sucr V1.3 -21-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    FORMATAGE DES DONNEES

    Le formatage de donnes est une opration indispensable lorsque l'on veut obtenir une prsentation claire et lisible des

    rsultats d'un traitement. On peut formater des donnes numriques et des chaines de caractres. Depuis Java 5, les

    oprations de formatage sont beaucoup plus simples, les programmeurs C retrouveront une syntaxe connue.

    FORMATAGE DES FLUX S'effectue avec la fonction printf implmente dans :

    java.io.Console

    java.io.PrintStream

    java.io.PrintWriter

    Cette fonction permet d'effectuer des sorties formates sur l'cran, dans les fichiers et sur le rseau.

    La syntaxe de la fonction : printf(String format, Object arg1, Object arg2, ...)

    est la suivante : Format : %[argument_index$][flag][width][.precision]conversion

    Les [] indique des paramtres optionnels

    argument_index indique le numro d'ordre de args (arg1 est en position 1, arg2 est en position 2 )

    flag reprsente des caractres qui selon le format de conversion modifie format d'criture.

    Flag Character Floating Point Date/Time Description

    '-' y y y The result will be left-justified.

    '#' - y - The result should use a conversion-dependent alternate form

    '+' - y - The result will always include a sign

    ' ' - y - The result will include a leading space for positive values

    '0' - y - The result will be zero-padded

    ',' - y - The result will include locale-specific grouping separators

    '(' - y - The result will enclose negative numbers in parentheses

    width exprime la largeur du champ

    precision donne le nb de chiffres aprs le virgule pour les rels.

    conversion reprsente un caractre spcifiant le format de sortie. Les caractres les plus courants sont :

    d pour les entiers

    c pour les caractres

    f pour les rels

    s pour les String

    FORMATAGE DES CHAINES DE CARACTERES La fonction statique format de la classe String permet de formater les chaines de caractres avec la mme syntaxe

    que printf (mme paramtres, mme spcificateurs de format).

    EXEMPLE public class Formater

    {

    public static void main(String[] args)

    {

    System.out.printf("1. **%d** \n2. **%04d** \n3. **%4d** \n4. **%1$-+4d**\n", 10, 10, 10);

    System.out.printf("5. **%f**\n", 1.0156);

    System.out.printf("6. **%1.2f**\n", 1.0156);

    System.out.printf("7. **%.2f**\n", 0.0156);

    System.out.printf("8 **%+.2f**\n", 0.0156);

    System.out.printf("9. **%s**\n", "----");

    System.out.printf("10. **%6s**\n", "----");

    System.out.printf("11. **%-6s**\n", "----");

    String s="";

    s= String.format("12. **%-6s**\n", "----");

    System.out.printf(s);

    }

    }

    mk:@MSITStore:C:/Program%20Files/eclipse/DOCJAVA/j2se6/j2se6.chm::/j2se6/api/java/io/PrintStream.html#HTML_TO_HH_21857mk:@MSITStore:C:/Program%20Files/eclipse/DOCJAVA/j2se6/j2se6.chm::/j2se6/api/java/io/PrintWriter.html#HTML_TO_HH_21916mk:@MSITStore:C:/Program%20Files/eclipse/DOCJAVA/j2se6/j2se6.chm::/j2se6/api/java/text/DecimalFormatSymbols.html#getGroupingSeparator()

  • Java concentr sucr V1.3 -22-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

  • Java concentr sucr V1.3 -23-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    OPERATIONS E/S CONSOLE

    ENTREES DE DONNEES A PARTIR DU CLAVIER Java ne comportant aucune mthode directe permettant de lire des donnes au clavier, la classe ci-dessous permet de

    palier cet inconvnient.

    import java.io.*;

    public class KeyBoard

    {

    public static String readString(String prompt) throws IOException

    {

    System.out.print(prompt);

    BufferedReader line_in = new BufferedReader(new

    InputStreamReader(System.in));

    String ligne = line_in.readLine();

    return ligne;

    }

    public static int readInt(String prompt) throws IOException

    {

    System.out.print(prompt);

    BufferedReader line_in = new BufferedReader(new

    InputStreamReader(System.in));

    int line = Integer.parseInt(line_in.readLine());

    return line;

    }

    public static double readDouble(String prompt) throws IOException

    {

    System.out.print(prompt);

    BufferedReader line_in = new BufferedReader(new

    InputStreamReader(System.in));

    double line = Double.parseDouble(line_in.readLine());

    return line;

    }

    public static char readChar(String prompt) throws IOException

    {

    System.out.print(prompt);

    InputStreamReader isr = new InputStreamReader(System.in);

    return (char) isr.read();

    }

    }

    EXEMPLE D'UTILISATION

    public class Test

    {

    public static void main(String[] args)

    {

    int n1 = Keyboard.readInt("Entier 1 ? ");

    int n2 = Keyboard.readInt("Entier 2 ? ");

    System.out.printf("%d * %d = %d", n1, n2, n1*n2);

    }

    }

  • Java concentr sucr V1.3 -24-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

  • Java concentr sucr V1.3 -25-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    MECANISMES DE REUTILISATION

    REUTILISATION ! La rutilisation de classes consiste utiliser une classe existante dans la dfinition d'une nouvelle classe.

    Plusieurs formes de rutilisations sont possibles en POO. Parmi les formes de rutilisations possibles on peut citer :

    l'incorporation d'objets dans d'autres objets sous la forme de composition ou sous la forme d'agrgation,

    l'assemblage de classes suivant un arbre hirarchis : l'hritage de classes

    L'AGREGATION L'agrgation est une association non symtrique, qui exprime un couplage fort et une relation de subordination.

    Elle reprsente une relation de type "ensemble / lment".

    Une agrgation peut notamment (mais pas ncessairement) exprimer qu'une classe (un "lment") fait partie d'une autre ("l'agrgat"), qu'un changement d'tat d'une classe, entrane un changement d'tat d'une autre, qu'une action

    sur une classe, entrane une action sur une autre.

    A un mme moment, une instance d'lment agrg peut tre lie plusieurs instances d'autres classes (l'lment agrg peut tre partag).

    Une instance d'lment agrg peut exister sans agrgat (et inversement) : les cycles de vies de l'agrgat et de ses lments agrgs peuvent tre indpendants.

    Exemple : Plaons-nous du point de vue d'un constructeur grant une gamme de vhicules.

    Une gamme donne de vhicules peut partager des lments communs. Exemple : une berline Peugeot 206, la version

    coupe quivalente et la version station wagon (SW) sont quipes du mme moteur et de la mme boite de vitesse dans

    une gamme donne. Toute modification sur le moteur ou sur la boite est rpercute sur tous les vhicules de la gamme.

    Le diagramme UML traduisant ces relations est le suivant :

    -nbRapports : int

    Boite-boite : Boite

    -puissance : int

    Moteur

    -type : String

    -moteur : Moteur

    Voiture

    -liste

    GammeVhicule11 11 1*

    Noter ici le losange vide qui dnote l'agrgation, et le losange plein qui dnote la composition (voir plus loin) .

    import java.util.*;

    class Boite

    {

    int nbRapports;

    public Boite(int r) { nbRapports = r; }

    public String toString()

    {

    return "boite : " + nbRapports + " rapports";

    }

    }

    class Moteur

    {

    Boite boite;

    int puissance;

    public Moteur (int p, Boite b) { puissance = p; boite = b; }

    public String toString()

    {

    return "puissance : " + puissance + "CV, " + boite;

    }

    }

    class Voiture

    {

    String nom;

    Moteur moteur;

    // ...

    public Voiture(String n, Moteur m) {nom = n; moteur = m;}

    public String toString()

    {

    return nom + " : " + moteur;

    }

    }

  • Java concentr sucr V1.3 -26-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    public class GammeVehicules

    {

    private List gamme = new ArrayList();

    private Boite b1 = new Boite(5);

    private Moteur m1 = new Moteur(75, b1);

    public void ajouter(Voiture v) { gamme.add(v); }

    public GammeVehicules()

    {

    ajouter(new Voiture("206 Berline", m1));

    ajouter(new Voiture("206 SW ", m1));

    ajouter(new Voiture("206 coup ", m1));

    }

    public void modifierPuissance(int p)

    {

    m1.puissance = p;

    }

    public String toString()

    {

    String s = "";

    for (Voiture v : gamme)

    s += v + "\n";

    return s;

    }

    }

    public class TestGamme

    {

    public static void main(String[] args)

    {

    GammeVehicules gv = new GammeVehicules();

    System.out.println(gv);

    gv.modifierPuissance(80);

    System.out.println(gv);

    }

    }

    La boite de vitesse et le moteur sont crs indpendamment d'un vhicule (b1, et m1 : attributs de classe) : la suppression

    d'un vhicule dans la collection gamme n'entraine pas la suppression de la boite 5 rapports et du moteur 75CV.

    Toute modification du moteur et de la boite se rpercute immdiatement sur l'ensemble de la gamme de vhicules.

    LA COMPOSITION La composition consiste rutiliser un objet par incorporation au sein d'une classe.

    Les cycles de vies des lments (les "composants") et de l'agrgat sont lis : si l'agrgat est dtruit (ou copi), ses composants le sont aussi.

    A un mme moment, une instance de composant ne peut tre lie qu' un seul agrgat.

    Les "objets composites" sont des instances de classes composes.

    Exemple : plaons-nous du point de vue d'un collectionneur de voitures.

  • Java concentr sucr V1.3 -27-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    -nbRapports : int

    Boite-boite : Boite

    -puissance : int

    Moteur

    -type : String

    -moteur : Moteur

    Voiture

    -liste

    Collection11 11 1*

    Chaque voiture possde un moteur et une boite spcifique.

    Noter le losange plein dnotant la composition. Les classes Boite, Moteur et Voiture sont les mmes que

    prcdemment. import java.util.*;

    class Boite // idem

    class Moteur // idem

    class Voiture // idem

    public class MaCollection

    {

    public List gamme = new ArrayList();

    public void ajouter(Voiture v) { gamme.add(v); }

    public MaCollection()

    {

    ajouter(new Voiture("Citron 2CV ", new Moteur(26, new Boite(4) )));

    ajouter(new Voiture("Ferrari Monza", new Moteur(450,new Boite(7) )));

    ajouter(new Voiture("Citroen DS19 ", new Moteur(90, new Boite(4) )));

    }

    public String toString()

    {

    String s = "";

    for (Voiture v : gamme)

    s += v + "\n";

    return s;

    }

    }

    public class TestComposition

    {

    public static void main(String[] args)

    {

    MaCollection c = new MaCollection();

    System.out.println(c);

    // Supression d'un vhicule

    c.gamme.remove(0);

    System.out.println(c);

    // Nouveau vhicule

    c.ajouter(new Voiture("Citron 2CV ", new Moteur(29, new Boite(4) )));

    System.out.println(c);

    }

    }

    La suppression d'un vhicule dans la collection entraine la suppression de son moteur et de sa boite.

    L'ajout d'une voiture dans une collection se fait en instanciant une voiture : c.ajouter(new Voiture(...)

    Celle-ci instancie son tour un moteur qui son tour instancie une boite.

    Contrairement l'exemple prcdent il n'y a ici pas de partage d'objet mme s'il y partage d'un ensemble des dfinitions

    des classes.

  • Java concentr sucr V1.3 -28-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    L'HERITAGE L'hritage de classe permet de construire des hirarchies de classes a laide du mot cl extends. Les hirarchies de classes permettent de grer la complexit, en ordonnant les objets au sein d'arborescences de classes,

    d'abstraction croissante. Deux approches sont possibles :

    La spcialisation o Dmarche descendante, qui consiste capturer les particularits d'un ensemble d'objets non discrimins par

    les classes dj identifies.

    On tend les proprits d'une classe, sous forme de sous-classes, plus spcialises (permet l'extension du

    modle par rutilisation).

    Gnralisation o Dmarche ascendante, qui consiste capturer les particularits communes d'un ensemble d'objets, issus de

    classes diffrentes.

    On factorise les proprits d'un ensemble de classes, sous forme d'une super-classe plus abstraite (permet de

    gagner en gnricit).

    COMMENT FAIT-ON ! L'hritage (spcialisation et gnralisation) permet la

    classification des objets.

    Une bonne classification est stable et extensible : ne classifiez pas les objets selon des critres instables (selon

    ce qui caractrise leur tat) ou trop vagues (car cela

    gnre trop de sous-classes).

    Les critres de classification sont subjectifs.

    Le principe de substitution (Liksow, 1987) permet de dterminer si une relation d'hritage est bien employe

    pour la classification :

    "Il doit tre possible de substituer n'importe quel instance

    d'une super-classe, par n'importe quel instance d'une de

    ses sous-classes, sans que la smantique d'un programme

    crit dans les termes de la super-classe n'en soit affecte."

    Si Y hrite de X, cela signifie que "Y est une sorte de X" (analogies entre classification et la thorie des ensembles).

    -titre

    -auteur

    Oeuvre

    Livre Opra Film

    Roman BD

    Sp

    cia

    lisa

    tio

    n

    G

    n

    ralis

    atio

    n

    Exemple Le graphe d'hritage suivant prsente un exemple (trs modeste)

    de relation entre des classes factorisant un comportement

    d'animaux domestiques.

    Pour vrifier si l'hritage est utilis bon escient, on peut dire

    qu'un chat Siamois est une sorte de chat et le chat est une sorte

    d'animal domestique. Les relations d'hritage permettent de

    factoriser les comportements communs toutes ces classes.

    Dans la classe racine on trouvera :

    un attribut nom permettant de mmoriser le nom de

    l'animal domestique,

    une mthode toString permettant d'obtenir le nom de

    l'animal domestique,

    une mthode crier permettant d'obtenir le cri de

    l'animal domestique. Cette dernire mthode ne peut pas

    tre dfinie, puisqu'elle ne correspond aucun animal.

    Il faut redfinir crier dans chaque classe.

    Exemple : la classe AnimalDomestique instanci ci-

    dessous doit se comporter de faon suivante:

    ChatSiamois

    +ChatSiamois

    +crier: String

    AnimalDomestique

    -nom : String

    +AnimalDomestique+ toString: String

    +crier: String

    Perroquet

    +Perroquet

    +crier: String

    Chat

    +Chat+crier: String

    Chien

    +Chien+crier: String

    AnimalDomestique[] maMnagerie = new AnimalDomestique [2]; maMnagerie[0] = new Chat ("Sysvestre"); maMnagerie[1] = new Chien("Mdor");

    System.out.println(maMnagerie[0].crier()); // doit afficher le cri du chat System.out.println(maMnagerie[1].crier()); // doit afficher le cri du chien

  • Java concentr sucr V1.3 -29-

    Daniel Tschirhart. Edition du 06/09/2013, mise jour 06/09/13 (Java concentr sucr2013.docx).

    CLASSES ABSTRAITES ET METHODES VIRTUELLES PURES Pour rsoudre le problme prcdent il y a deux solutions possibles :

    1. Dfinir la mthode crier dans la classe AnimalDomestique avec aucun code dans le corps de la mthode.

    maMnagerie[0].crier()) est donc dfini dans AnimalDomestique et il n'y a pas d'erreur de

    compilation +

    dfinir la mthode crier dans chaque classe hritant de la classe AnimalDomestique.

    Lors de l'excution avec maMnagerie[0].crier() c'est la mthode crier de l'objet Chat qui sera

    utilise (grce la rsolution des liens lexcution entre lappel de la fonction et la fonction appele

    lexcution). Mais !

    Si la classe Chat ne redfini pas la mthode crier, celui-ci deviendra aphone ! Pour obliger les classes

    drives de la classe AnimalDomestique redfinir la mthode crier la solution que proposent les

    langages orients objets dont Java est la suivante :

    Dclarer la mthode crier dans la classe AnimalDomestique sans corps de mthode. Une telle

    mthode est dite virtuelle pure (mthode sans dfinition). Une telle classe doit tre prfixe avec le mot

    abstract. Une classe abstraite ne peut pas tre instancie.

    Si la classe Chat ne redfini pas la mthode crier, elle hrite la mthode virtuelle pure crier de la

    classe parent et devient abstraite son tour (donc non instanciable).

    Pour traduire la relation d'hritage entre classe une classe Y et une classe X (parent de Y) on utilise le mot rserv

    extends de faon suivante :

    class X

    {

    }

    class Y extends X // Y drive de X

    {

    }

    Finalement le code de la classe AnimalDomestique et de la classe Chat est le suivant :

    // Classe abstraite

    public abstract class AnimalDomestique

    {

    private String nom;

    public AnimalDomestique(String n)

    {

    nom=n;

    }

    public String toString()

    {

    return nom;