La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Passer à la première page Programmer avec des objets Etienne Vandeput Namur 2002 – 2003 - 2004

Présentations similaires


Présentation au sujet: "Passer à la première page Programmer avec des objets Etienne Vandeput Namur 2002 – 2003 - 2004"— Transcription de la présentation:

1 Passer à la première page Programmer avec des objets Etienne Vandeput Namur 2002 –

2 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 2 Whos who? n Vu que nous ne sommes pas nombreux… n Attentes n Background n …

3 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 3 Objectifs n Remettre l'activité de programmation au goût du jour en présentant les mécanismes de la POO (et ce qui les justifie) n Apprendre à maîtriser un autre paradigme de programmation u obsession de lalgorithmique et de lexécution n Apprendre un langage qui a grandi avec le Web n Étudier les possibilités d'enseignement de ce type de programmation dans le secondaire u porter un regard pédagogique (méthodologie, types de représentations,…) n Réfléchir à des stratégies et à des méthodologies simples

4 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 4 Méthode n Des développements théoriques accompagnés d'exemples simples n Des exercices résolus en salle de cours n Des exercices à résoudre à domicile (parfois corrigés) u l'absence de pratique est justifiée par le fait que les participants sont censés travailler à domicile u ce postulat est souvent mis en défaut n Des références u Un syllabus notes (définitivement?) provisoires F Lisez les notes de bas de page u Une bibliographie avec des ouvrages de différents calibres (répondant à des besoins ): succincts, verbeux, illustrés,... u Une abondante documentation sur le web

5 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 5 Plat du jour n Les concepts fondamentaux et les mécanismes de la POO en toute généralité. n Des exemples simples pour amener les concepts de base n L'implantation des concepts élémentaires: classes, champs, méthodes,... en Java (premier contact avec le langage) n Quelques indications sur l'installation d'une version correcte du soft

6 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 6 En fin de séance, vous devriez pouvoir... n Posséder une idée très générale des mécanismes de la POO n Avoir compris ce quest une classe, un objet, un champ de donnée, une méthode n Identifier, dans une description semblable à celles que nous aurons données, des classes dobjets et des exemples pour leur structure en termes de champs de données et de méthodes n Être capables dimaginer dautres exemples semblables à ceux qui ont été présentés

7 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 7 Pourquoi la POO? n Les limites des langages de programmation impératifs u quelques milliers de lignes u quelques personnes n Penser le travail autrement u en terme de contrats à respecter n Comment? u boîtes noires (logicielles)… I/O n Dans quel but? u modularisation, réutilisation, adaptabilité (modification des exigences), simplification du débogage n NB Programmer « objet » utiliser un langage OO

8 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 8 Exemple 1: où il est question de voitures… n Classes u Les voitures… n Instance (objet) u Ma voiture u La voiture rouge qui est garée en face de chez moi… n Un état (ce qui caractérise lobjet statiquement) u kms au compteur u couleur u pneus (composition) n Des comportements possibles (ce qui caractérise lobjet dynamiquement) u freine u accélère u …

9 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 9 Quelques commentaires n Il importe dabord de décrire lenvironnement dune manière qui nous permette de développer linteraction entre les objets. n Létat dun objet peut changer au cours du temps. n Nous aurions pu parler de véhicules à quatre roues, véhicules,… u des airs de famille n Où se trouve la programmation? u dans le comportement des objets n Freine: un input, un output ou un changement détat u vitesse diminue

10 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 10 L'encapsulation n Aussi appelée dissimulation des données n Emballage de l'état de l'objet et de son comportement u l'état de l'objet est décrit par des champs de données u le comportement est décrit par des « méthodes » n Avantage u l'implantation est cachée à l'utilisateur de l'objet u l'objet fonctionne comme une boîte noire n Pour que l'encapsulation fonctionne correctement, il faut exiger que létat d'un objet ne soit modifiable que par lobjet lui-même et donc par l'intermédiaire des méthodes qu'il supporte u pas d'accès direct aux champs de données de l'objet de la part d'objets d'une autre classe

11 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 11 Classes, instances, variables d'instance n Les objets sont regroupés en classes u les objets d'une même classe supportent les mêmes méthodes et possèdent les mêmes champs n Un objet est une instance de classe n Les méthodes apparaissent comme des services, des contrats que l'objet s'engage à respecter u simplification du débogage n Le contenu des champs est variable d'une instance à l'autre F on parle de variables d'instances

12 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 12 Exemple 2: le carré n Qu'est-ce qui caractérise un carré (et qui est susceptible de nous intéresser)? u longueur du côté u sommet (coin supérieur gauche) u … n Autres possibilités u coordonnées des quatre sommets n Que pouvons-nous demander à un objet de type carré u de se dessiner u de nous « dire » son périmètre, son aire, la longueur de ses diagonales,… u de changer ses dimensions, sa position,...

13 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 13 Quelques observations n Le calcul du périmètre: u plusieurs façons de faire n La modification des dimensions: u l'objet garde le contrôle u il n'y aura jamais de carré dont la longueur du côté est négative (système consistant) n Les informations sont typées: u type prédéfini: la longueur du côté est du type "nombre entier", par exemple. u type construit: le sommet est de type "Point" (une autre classe d'objets) n La définition dune classe dobjets correspond en fait à la définition dun nouveau type dinformation

14 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 14 L'héritage n Le carré, un polygone régulier particulier (spécialisation) n Un polygone régulier possède des côtés de même longueur u la longueur du côté est propre aux polygones réguliers u le nombre de côtés en est également une caractéristique u le calcul du périmètre s'obtient en multipliant le nombre de côtés par cette longueur u une méthode pour calculer l'aire devrait exister mais elle est indéfinissable à ce niveau n La classe des carrés hérite de la classe des polygones réguliers, de ses champs, de ses méthodes mais peut en avoir davantage: u une méthode pour calculer la longueur de la diagonale

15 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 15 Héritage et polymorphisme n La classe des polygones réguliers généralise celles des carrés, des triangles équilatéraux, des pentagones réguliers,… n L'héritage permet de ne réinventer que ce qui est nécessaire. u la méthode de calcul du périmètre reste valable; celle de l'aire aussi à partir de l'angle au centre u la méthode de calcul de la longueur des diagonales du carré doit être inventée u la méthode de calcul de l'aire peut être redéfinie plus simplement n Un carré est aussi un polygone régulier. On parle à ce propos de polymorphisme. u On peut aussi considérer un carré comme un polygone régulier si on ne recherche pas un comportement spécifique au carré.

16 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 16 Surcharge n Un carré est un polygône régulier, mais aussi un quadrilatère. On parle à ce propos d'héritage multiple. n Un quadrilatère n'est pas nécessairement un carré. u assez évident dans l'exemple choisi, mais pas toujours en programmation n On peut calculer la longueur de la diagonale du carré sur base de la longueur de son côté, mais aussi à partir de la connaissance des coordonnées de deux sommets opposés. n Il peut exister plusieurs versions d'une méthode pour obtenir un résultat ou un traitement u on parle alors de surcharge u le compilateur doit effectuer un choix

17 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 17 Représentation n Nécessité dun « graphisme » simple pour représenter les classes n Rectangles (trois parties): u nom u champs: un type de donnée (simple ou complexe) u méthodes n Des règles à se donner

18 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 18 Exemple 3: points, droites et cercles n Programmer « objet », cest avant tout décrire un environnement, en termes dobjets et de classes dobjets, mais en pensant déjà un peu aux services que lon pourrait leur demander. n Pas aussi simple dans la pratique u besoin dun schéma statique des données (ERA) n Un système de messages n Un système de sous-traitance n Programme= grande conversation entre objets et classes dobjets

19 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 19 Énoncé n Une droite est constituée de points. Deux points permettent de définir une droite, mais il y peut y avoir dautres moyens. On peut avoir envie de modifier la direction dune droite, de la faire se déplacer parallèlement à elle-même. Pour autant que lon ait défini ce quest un cercle, on peut se demander si une droite est tangente à un cercle donné, si elle comprend un point donné etc.

20 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 20 Un bout dalgorithmique n Les méthodes sont des ensembles dinstructions n Parmi ces instructions, des appels de sous-traitance de lobjet courant à dautres objets ou classes: u. F maVoiture.freine F vitesse maVoiture.donneTaVitesse() u lobjet modifie lenvironnement ou fournit un résultat avant de rendre la main à lobjet ou la classe appelante

21 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 21 Exercice: À propos demballage de produits n Quelle(s) classe(s) dobjets y verriez-vous… u champs, méthodes n …de manière à pouvoir la faire évoluer en fonction des exigences? Je suis directeur d'une multinationale qui produit et emballe des produits très différents. Parmi ces produits, des chaussures pour hommes et pour dames. Je souhaite, à terme, disposer d'un logiciel qui me permettrait notamment de calculer le prix de revient de mes emballages et de ce qu'ils pourraient contenir.

22 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 22 POO vs programmation impérative? n Pas de concurrence avec la programmation impérative u toujours bien nécessaire pour le développement du code à l'intérieur des méthodes n Approche partiellement bottom-up alors que les adeptes de la programmation structurée prônaient davantage le top- down u la POO est naturellement structurée n "Orienté" objet u une orientation qui peut être plus ou moins manifeste F certains langages de script qualifiés d'orientés objet ne font pas apparaître de manière évidente ses mécanismes

23 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 23 Les avantages de la POO n Une approche plus naturelle (se rapprocher du monde réel qui est aussi composé d'objets concrets ou abstraits) u la programmation impérative oblige plutôt l'Hô à se rapprocher de la machine n Adaptabilité nettement supérieure u de nouvelles spécifications ne remettent pas en question le travail déjà effectué n Gestion simplifiée de la complexité u principe de sous-traitance, de contrat à respecter n Programme en POO = conversation entre objets u chaque objet rend un ensemble de services (sous forme d'appel de méthodes)

24 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 24 Le choix d'un langage n La pratique de plusieurs langages n'est sans doute pas souhaitable en situation d'apprentissage n Choix porté sur Java u mise en œuvre claire des mécanismes F héritage F polymorphisme F surcharge u pas trop d'implicites F seulement des raccourcis d'écriture u en phase avec le Web u portable F bytecodes interprétables sur de nombreuses plateformes

25 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 25 Définir une classe en Java n La classe Point class Point{ public int x; public int y; } n Le mot-clé class n Nom d'une classe: u lettre + lettres ou chiffres u convention: CompteurDeMots, GrandNombre,… u Java est sensible à la casse n Définition de la classe: u définition d'un bloc: { } u alignement des accolades

26 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 26 Modificateurs d'accès et types n Le symbole ; est le séparateur d'instruction n public est un modificateur d'accès u peut aussi s'appliquer aux méthodes et aux classes u peut aussi prendre les valeurs private, protected,… u on évite de donner un accès trop large si ce n'est pas nécessaire n Les champs de données u les variables d'instance x et y u convention: minuscule puis majuscule à chaque nouveau mot F firstNumber, secondNumber,… u les variables sont du type primitif int n Les méthodes u aucune pour l'instant

27 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 27 Types primitifs n Quatre types entiers u byte (1 octet) u short (2 octets) u int (4 octets) u long (8 octets) n Deux types numériques à virgule flottante u float (4 octets) u double (8 octets) n Un type caractère u char (2 octets unicode) n Un type booléen u boolean (deux valeurs: true et false )

28 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 28 A propos des types primitifs... n Tous les types numériques sont signés. n Il n'y a pas de type "chaîne de caractères" u mais il existe une classe String prédéfinie F remarquez la majuscule n Il est possible d'utiliser des écritures telles public int x = 3; private char c1 = 'a'; public float y = 1.; n Attention, "a" désigne un objet de type String et non un caractère.

29 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 29 Les méthodes class Point{ private int x; private int y; public int getAbscisse(){ return x; } public int getOrdonnee(){ return y; } public void setAbscisse(int a){ x=a; } public void setOrdonnee(int b){ y=b; }

30 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 30 Structure n Un modificateur d'accès u souvent public sauf si la méthode n'est utile qu'à l'intérieur de la classe n Le type du résultat s'il y en a un u public int... n void sinon u public void … n Le nom de la méthode u public int getAbscisse... n La liste des paramètres (s'il y en a) u public int getAbscisse()... u public void setAbscisse(int a)...

31 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 31 Mais encore... n Un bloc d'instructions u public void setAbscisse(int a){…} n La convention pour le nom des méthodes est la même que pour les variables n Les paramètres sont séparés par des virgules et précédés de leur type. n Les variables d'instance sont devenues private. u Cela empêche tout objet de les modifier directement lui- même. u Un objet étranger devra sous-traiter le travail à l'objet concerné. F Si p1 est un objet de type Point et n une variable de type int, un appel ressemblera à: p1.setAbscisse(n);

32 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 32 Et encore plus... n Une méthode void est l'équivalent d'une procédure. n Une méthode qui renvoie un résultat d'un certain type (primitif ou non) est l'équivalent d'une fonction. n L'objet dont on invoque la méthode est en quelque sorte un paramètre implicite. u p1 est un paramètre implicite dans p1.setAbscisse(n); n Si la méthode renvoie un résultat, celui-ci doit figurer dans une expression plus complexe: u int y = p1.getAbscisse(); F le type de y est précisé au moment de l'affectation; il aurait pu l'être plus tôt. u = est le symbole de l'affectation lorsqu'il est employé entre des expressions de types primitifs.

33 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 33 Comment naissent les objets? n Les membres d'une classe: u les champs u les méthodes u les constructeurs F sorte de méthodes particulières dont le travail est de créer des objets n Un constructeur porte toujours le nom de la classe. u Il existe un constructeur par défaut. F Que fait-il? u Il arrive souvent que la définition dune classe compte plusieurs constructeurs.

34 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 34 Signatures n La signature d'une méthode ou d'un constructeur se compose de son nom et de la liste des paramètres et de leur type. u setPoint(int a, int b) est une signature. u La signature est importante pour le compilateur. n Une méthode, un constructeur peuvent avoir plusieurs signatures différentes suivant le nombre et le type de leurs paramètres. u Le type du résultat ne fait pas partie de la signature.

35 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 35 Les constructeurs public class Point{ private int x; private int y; public Point(){// Constructeur 1 setPoint(0,0); } public Point(int a,int b){// Constructeur 2 setPoint(a,b); }... public void setPoint(int a,int b){ x=a; y=b; }

36 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 36 Utilisation des constructeurs n Notez que setPoint globalise deux méthodes et est utilisée dans les constructeurs. n Utilisation possible dans toute méthode de classe ayant un accès au constructeur u ici, toutes ( public ) n Exemples Point p1 = new Point(); Point p2 = new Point(3,-1); int n = 25; Point p3; … p3 = new Point(2,n); n NB: i nt et P oint et même S tring

37 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 37 Paramètre implicite et déclaration de variables n x = p1.getOrdonnee(); u OK si cette affectation se trouve dans la description d'une méthode concernant un objet de type Point (le champ x existe et la méthode getOrdonnee() aussi) u il s'agit de l'abscisse du point courant et de l'ordonnée du point p1 n la déclaration doit précéder l'utilisation u int x; x=…; ou int x=…; n la portée dune variable est le bloc dans lequel elle est déclarée u classe u structure de contrôle u méthode u...

38 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 38 Références n Un exemple daffectation utilisant des objets n Employé entre deux expressions de types construits, le signe = symbolise une affectation de référence. u en Java, les variables d'instances de types construits sont des références. F linstruction… Point p1, p2; …indique que p1 et p2 seront les adresses de deux objets de type Point. u Que signifie dès lors exactement… F p1=p2;

39 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 39 Programme objet = conversation entre objets n À tout moment, un objet ou une classe a la parole. n Il ou elle exécute une de ses méthodes. n Il ou elle rendra la main une fois son travail terminé sous forme: u dun résultat (valeur ou référence dobjet) u dun signal indiquant que son travail est terminé n Qui commence? n Programme = Une classe « Application » crée des objets et/ou invoque des méthodes sur ces objets

40 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 40 Un premier programme public class PremierProgramme{ public static void main(String [] args){ System.out.println("Bienvenue au cours Java!"); } n La classe doit être déclarée public et être enregistrée dans un fichier qui porte le même nom.

41 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 41 La méthode main n La conversation est initiée par une classe qui possède une méthode portant le nom prédéfini main. u static F elle concerne la classe et non un quelconque de ses objets u void F elle exécute des traitements mais ne renvoie pas de résultat u son paramètre est un tableau de chaînes de caractères F fournis en ligne de commande F possiblement vide F String args[] est équivalent à String [] args n La classe System u non instanciable u out: une variable objet (voir documentation)

42 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 42 Test n Compilation (production des octets de codes) u javac PremierProgramme.java n Exécution (lancement de la machine virtuelle) u java PremierProgramme n Précautions u lancer la compilation à partir du répertoire contenant le fichier source u vérifier que le chemin ( path ) contient bien la description du chemin d'accès au compilateur u gare à la casse u pas d'extension class pour le fichier fourni à la JVM

43 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 43 Installer l'environnement de programmation Java n Télécharger à partir de u java 2 sdk (software development kit), standard edition (j2se) v 1.4 u fichier exécutable de 40Mo environ n Installation par défaut dans c:\jdk1.4.1_03 sous Windows (dans usr/bin sous Linux)

44 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 44 Choix d'un éditeur n TextPad, un éditeur semi-intelligent qui gère notamment la coloration syntaxique, l'indentation… u disponible à l'essai sur u largement satisfaisant dans le cadre de nos activités n Le bloc-notes sous Windows ou des éditeurs comme vi ou emacs sous Linux u pour en savoir plus sur le mode d'emploi: france.org/article/appli/emacs/manuel/www.linux- france.org/article/appli/emacs/manuel/ u à réserver aux informaticiens claviérophiles qui tapent à dix doigts n Jbuilder, un outil fantastique pour les développeurs (à oublier dans le cadre de la découverte des mécanismes et des primitives d'un langage u Informations sur

45 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 45 La machine virtuelle Java (JVM) n Objectif de portabilité u développement d'Internet u architecture centralisée architecture de systèmes distribués (plus simples à faire évoluer) n Production, par compilation, de bytecodes u code intermédiaire pour machines hypothétiques u lisible par toute machine possédant un interpréteur adéquat n Installation de Java = fourniture de F différentes librairies de classes F différents outils: compilateur, interpréteur, générateur de documentation,… n JVM = système + instance(interpréteur) u plusieurs JVM peuvent tourner sur la même machine

46 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 46 Schéma simplifié de compilation-exécution n Écriture d'une classe Application (et éventuellement d'autres classes) n Enregistrement sous Application.java n Compilation (production de bytecodes) u javac Application.java production d'un fichier Application.class n Activation de la JVM u java Application (sans extension) n Choix des paramètres d'environnement corrects

47 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 47 Synthèse (0) n La POO a connu son succès par les solutions qu'elle a tenté d'apporter aux problèmes de réutilisabilité, d'adaptabilité et de contrôlabilité des programmes. n Les solutions prennent la forme de mécanismes dont les principaux sont u l'encapsulation (des données et des traitements) u l'héritage u le polymorphisme u la surcharge n Jusqu'ici, seul le mécanisme d'encapsulation a été quelque peu envisagé.

48 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 48 Synthèse (1) n Un programme POO est une conversation entre objets (et classes) n Les objets sont des instances de classes n La définition d'une classe peut comprendre notamment la définition u de champs de données u de méthodes supportées par les classes et/ou leurs objets u de différents constructeurs n Ce regroupement des traitements et des données est connu sous le nom d'encapsulation. u Son intérêt est de cacher à l'utilisateur la manière dont les traitements sont implémentés et de contrôler davantage les erreurs et la consistance des données

49 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 49 Synthèse (2) n Champs, méthodes et constructeurs sont des membres de classe n Une classe définit un type nouveau par rapport aux types existants et en particulier, les types primitifs qui sont au nombre de 8 en Java u 4 types entiers u 2 types nombres à virgule flottante u un type caractère u un type booléen

50 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 50 Synthèse (3) n Les champs de données ont tous un type (primitif ou construit) u par type construit, on entend une classe d'objets n Les méthodes et les constructeurs ont une signature qui se compose de u leur nom u la liste de leurs paramètres et de leurs types respectifs n Deux méthodes (constructeurs) diffèrent par leur signature n Les classes, champs, méthodes et constructeurs sont caractérisés par leur accessibilité u public u private u...

51 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 51 Synthèse (4) n Les méthodes renvoient ou non un résultat d'un certain type (construit ou primitif). u Le mot-clé void (pas de résultat renvoyé) ou le nom du type précède la signature. n Si le type du résultat est une classe d'objets, ce qui est renvoyé est une référence à un objet (son adresse en mémoire) n Les constructeurs renvoient toujours une référence à un objet du type d'objets qu'ils construisent. u Les adresses sont passées par valeur, ce qui signifie que leur modification à l'intérieur d'une méthode ou d'un constructeur ne se répercute pas en dehors de la méthode ou du constructeur.

52 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 52 Synthèse (5) n Les conventions pour le choix des identificateurs u variables: minuscules et majuscules pour la première lettre de chaque mot à partir du deuxième (nombre, longueurMot,…) u méthodes: idem (getName, affiche,…) u classes (et constructeurs qui ont le même nom): première lettre majuscule puis idem (Point, JeuDeCarte,…) n Les règles syntaxiques u séparateur d'instructions: le point-virgule u délimiteurs de bloc: les accolades !!! n Le symbole d'affectation (=) u entre variables de type(s) primitif(s): véritable affectation u entre variables de type(s) objet(s): affectation de référence

53 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 53 Synthèse (6) n La déclaration d'une variable doit précéder son affectation. n La portée d'une variable est le bloc. u classe, méthode, constructeur, structure de contrôle,… n Pour certains champs, des méthodes d'accès et d'altération s'imposent. n Les méthodes sont généralement accessibles de l'extérieur de la classe. n La valeur d'un champ n'est généralement accessible que de l'intérieur de la classe (à moins qu'il soit déclaré public, ce qui n'est pas une bonne habitude).

54 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 54 Synthèse (7) n Invocation d'une méthode (déclarée public ) u accès via le nom de l'objet appelé (s'il n'est pas l'appelant) suivi du nom de la méthode F int x = p1.getAbscisse(); F p2.setOrdonnee(4); n Référence au champ de donnée d'un objet u si l'objet fait partie de la classe ou si le champ est public F accès via le nom de l'objet et le nom du champ int n=p1.x; u s'il s'agit du champ de l'objet courant et qu'aucune confusion n'est possible F accès via le nom du champ int n=x;

55 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 55 Synthèse (8) n En Java, une application ressemble à une conversation entre des objets initiée par une classe possédant une méthode main (classe exécutable) u c'est une méthode de la classe modificateur static u elle ne renvoie pas de résultat void (elle représente, en quelque sorte, le programme principal) u elle a comme paramètre un tableau de chaînes de caractères F String [ ] args (args est un nom de paramètre souvent utilisé) n La déclaration de cette méthode commence donc par u public static void main(String [ ] args){… n Une application ressemble donc à public class Application{ public static void main(String [ ] args){…} }

56 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 56 Synthèse (9) n La méthode main crée des objets et/ou utilise des classes et/ou des objets prédéfinis sur lesquels elle invoque des méthodes. n Chaque méthode invoquée sur une classe ou sur un objet peut elle-même créer de nouveaux objets ou appeler des objets ou des classes existant déjà. n La plus courte application en Java public class Application1{ public static void main(String args[]){ System.out.println("Bienvenue au cours Java!"); }

57 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 57 Synthèse (10) n Possède un champ appelé out de type PrintStream class System{ static PrintStream out; … } n Les objets de type PrintStream supportent une méthode println qui prend comme paramètre une chaîne de caractères et envoie cette chaîne vers la sortie standard (l'écran). class PrintSream{... void println(String x){…}... }

58 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 58 Amélioration de la classe Point n Création d'une méthode distanceJusque qui prend comme paramètre un autre point u nécessité de faire appel à la méthode sqrt de la classe prédéfinie Math u la méthode sqrt est donc une méthode statique (voir sa définition) u p.x a du sens bien que le champ x soit déclaré private car p fait partie de la classe Point u la méthode sqrt de la classe Math renvoie un nombre du type primitif double (d'où le type de résultat de la méthode)

59 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 59 Description des classes NomClasse Champs (+accès) Méthodes (+accès) Application + main() PrintStream +println() Point -x: reel -y: reel + getAbscisse() reel + getOrdonnee() reel + setAbscisse(a: reel) + setOrdonnee(b: reel) + distanceJusque(p:Point):reel Math +sqrt(a: reel) reel

60 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 60 public class Point{ private int x; private int y; public Point(){ setPoint(0,0); } public Point(int a,int b){ setPoint(a,b); } public int getAbscisse(){ return x; } public int getOrdonnee(){ return y; } public void setAbscisse(int a){ x=a; } public void setOrdonnee(int b){ y=b; } public void setPoint(int a,int b){ x=a; y=b; } public double distanceJusque(Point p){ int diffX=x-p.x; int diffY=y-p.y; return Math.sqrt(diffX*diffX+diffY*diffY); }

61 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 61 public class Application2{ public static void main(String args[]){ Point p1=new Point(2,3); Point p2=new Point(); System.out.println("La distance entre p1 et p2 est " + p1.distanceJusque(p2) + "."); } Code de l'application

62 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 62 Schéma dinteraction des classes Application utilise Point System utilise Math utilise PrintStream compose

63 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 63 La somme de deux nombres n Approche impérative lire a, b somme a + b écrire somme n Voici ce que cela pourrait donner en Java : public class AdditionDEntiersImperatif{ public static void main(String [] args){ int n1 = 12; int n2 = 54; int somme = n1 + n2; System.out.println("La somme des nombres n1 et n2 est " + somme + "."); }

64 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 64 Approche objet n Fondée sur le système d'information u une classe de nombres entiers n Basée sur des extensions, des améliorations futures possibles u une méthode d'écriture des nombres en toutes lettres, en chiffres romains,… n Une application pour mettre en jeu les objets u construction u affichage des résultats

65 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 65 La classe Entier class Entier{ private int valeur; public Entier(int v){ valeur=v; } public Entier plus(Entier e){ return new Entier(valeur + e.valeur); } public int getValeur(){ return valeur; }

66 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 66 L'application public class AdditionDEntiers{ public static void main(String [] args){ Entier n1 = new Entier(12); Entier n2 = new Entier(54); System.out.println("La somme des nombres n1 et n2 est " + n1.plus(n2).getValeur()); }

67 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 67 Exercices n Ajoutez à la classe Entier une méthode qui renvoie le carré d'un Entier (sous forme de valeur entière ou d'objet) n Ajoutez à la classe Entier une méthode qui vérifie si un Entier est multiple de 7 (ou d'une valeur entière donnée) n Ecrivez la description d'une classe Triangle dont l'état serait caractérisé par les coordonnées des trois sommets et dont le comportement comprendrait une méthode de renvoi de son périmètre (on peut évidemment utiliser la classe Point) n Dressez le schéma de chaque classe et le diagramme dinteraction des classes

68 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 68 Triangle class Triangle{ Point s1,s2,s3; public Triangle(Point s1, Point s2, Point s3){ // Le constructeur ne vérifie pas si les points sont alignés. this.s1=s1; this.s2=s2; this.s3=s3; } public double perimetre(){ return s1.distanceJusque(s2)+s2.distanceJusque(s3)+s3.distanceJusque(s1); }

69 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 69 Exemple d'application public class ApplTriangle{ public static void main(String [] args){ Point p1=new Point(); Point p2=new Point(4,1); Point p3=new Point(3,-1); Triangle t=new Triangle(p1,p2,p3); System.out.println("Le périmètre du triangle ainsi défini est de "+t.perimetre()+"."); }

70 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 70 Comparaison d'objets n o1==o2 vérifie si les références sont identiques (op ==) n Besoin dune méthode ( egalA ) u existence dune méthode prédéfinie de la classe Object (héritage!!!) qui sappelle equals u elle a un comportement par défaut F comparaison des références F o1.equals(o2) renvoie la valeur true si o1==o2 u elle demande une réécriture dans toute classe souhaitant la spécialiser F exemple: comparaison des champs de données u il est conseillé de lui conserver, à la réécriture, les qualités d'une relation d'équivalence F réflexive, symétrique et transitive

71 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 71 Application public class Comparaison{ public static void main(String [] args){ Point p1, p2; p1=new Point(3,1); p2=new Point(3,1); if (p1==p2){ System.out.println("Les références sont identiques."); } else{ System.out.println("Les références sont différentes."); } System.out.println(); if (p1.equals(p2)){ System.out.println("L'objet p1 est identique à l'objet p2."); } if (p2.equals(p1)){ System.out.println("L'objet p2 est identique à l'objet p1."); }

72 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 72 La méthode equals remplacée public boolean equals(Point p){ return (x==p.x && y==p.y); } public boolean equals(Point p){ if (x==p.x && y==p.y){ return true; } else{ return false; } équivalent à

73 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 73 Les raccourcis d'écriture n Un exemple dans la méthode précédente n Une manière u d'associer la déclaration à l'initialisation F Point p1=new Point(4,-2); u d'éviter de créer des variables locales inutilement Point p=new Point(getAbscisse(),getOrdonnee()); au lieu de int a, b; a = getAbscisse(); b = getOrdonnee(); Point p; p = new Point(a,b); u d'associer plusieurs actions en une seule instruction F public Entier plus(Entier e){ return new Entier(valeur + e.valeur); }

74 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 74 La lecture au clavier n Un peu moins simple que l'écriture (à lécran) n L'objet System.in n Le passage par des classes prédéfinies u InputStreamReader et BufferedReader u méthode readLine n En attendant: u création d'une classe (non prédéfinie) Clavier et de plusieurs méthodes statiques de lecture des différents types primitifs de données F lireInt, lireFloat, lireDouble, lireString

75 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 75 Illustration public class LireAuClavier{ public static void main(String [] args){ System.out.println("Entrez un nombre entier au clavier: "); int i=Clavier.lireInt(); System.out.println(" Entrez un nombre à virgule au clavier: "); double d=Clavier.lireDouble(); System.out.println(" Entrez une chaîne de caractères au clavier: "); String s=Clavier.lireString(); System.out.println("La valeur du carré de l'entier est " + i*i + "."); System.out.println("La valeur de la racine carrée du nombre à virgule est " + Math.sqrt(d) + "."); System.out.println("La chaîne de caractères saisie est " + s); }

76 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 76 La méthode toString n Héritée de la classe Object n Sans réécriture: u nom de la classe u adresse de lobjet n La réécriture permet de préciser quelle chaîne de caractères doit être associée à lobjet. u Ex: Point n Si p est un objet de type Point, comment sera interprété println(p)?

77 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 77 Le passage des paramètres (1) n Le passage de paramètres à une procédure, une fonction, une méthode,… peut se faire par référence ou par valeur. u Référence (adresse) : une référence vers la variable est fournie à la procédure, la fonction, la méthode… lui permettant ainsi de la modifier F leffet de ces modifications est donc définitif (jusqu'à la prochaine modification) et visible en dehors de la procédure, la fonction, la méthode,… u Valeur : une copie de la valeur de la variable est transmise à la procédure, la fonction, la méthode… qui peut modifier à souhait cette copie sans toucher à l'original F l'effet de ces modifications n'est pas visible en dehors de cette procédure, fonction, méthode

78 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 78 Le passage des paramètres (2) n En Pascal, en C,… il est possible de passer un paramètre par référence (adresse) ou par valeur n En Java, le seul passage possible est le passage par valeur u Ce n'est pas gênant dès lors que la valeur (copie) transmise est elle-même une référence vers un objet. Possédant cette référence, la méthode peut provoquer une modification de l'état de l'objet. u Ce qui n'a pas changé après l'exécution de la méthode: la référence de l'objet u Ce qui peut avoir changé après l'exécution de la méthode: l'état de l'objet

79 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 79 public class Point2{ private float x; private float y; public Point2(){ setPoint(0,0); } public Point2(float a,float b){ setPoint(a,b); } public float getAbscisse(){ return x; } public float getOrdonnee(){ return y; } public void setAbscisse(float x){ this.x=x; } public void setOrdonnee(float y){ this.y=y; } public void setPoint(float x,float y){ setAbscisse(x); setOrdonnee(y); } public String toString(){ return "(" + x + "," + y + ")"; }

80 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 80 public Point2 symetrique(){ Point2 sym = new Point2(-x,-y); return sym; } public static void permute(Point2 p1, Point2 p2){ Point2 aux = p2; p2 = p1; p1 = aux; // Les références aux deux objets ont été permutées à l'intérieur de // la méthode. System.out.println("Après permutation et avant la sortie de \ la méthode..."); System.out.println("p1: " + p1); System.out.println("p2: " + p2); System.out.println(); }

81 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 81 Passage par valeur n Dans la méthode permute, les copies des deux adresses reçues sont bien permutées. u L'impression à l'intérieur de la méthode devrait le confirmer. n Une fois l'exécution de la méthode terminée, les copies disparaissent. n Les paramètres effectifs n'ont pas été modifiés. u L'impression dans la méthode main devrait le confirmer.

82 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 82 public class AppPoint2{ public static void main(String [ ] args){ Point2 p1=new Point2(3,-1); Point2 p2=new Point2(2,2); // L'invocation de la méthode "symetrique" sur l'objet p1 renvoie un // objet anonyme qui est "imprimé ". System.out.println("Le symétrique de " + p1 + " est " + p1.symetrique()); System.out.println(); System.out.println("p1: " + p1); System.out.println("p2: " + p2); System.out.println(); // La permutation des deux objets est une permutation de copies de // ces objets. Point2.permute(p1,p2); // Lorsque la méthode se termine, ces copies disparaissent. // La permutation est donc sans effets apparents. System.out.println("Après permutation et sortie de la \ méthode..."); System.out.println("p1: " + p1); System.out.println("p2: " + p2); System.out.println();

83 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 83 L'état des objets peut être modifié… // Il est pourtant possible de modifier de manière définitive la // coordonnée d'un point par l'intermédiaire d'une méthode. p1.setPoint(p2.getAbscisse(),p2.getOrdonnee()); System.out.println("Après..."); System.out.println("p1: " + p1); System.out.println("p2: " + p2); System.out.println(); }

84 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 84 La classe String n Les packages u une manière d'organiser les librairies u le package java.lang F importation automatique de classes considérées comme fondamentales F String, Math, System et bien d'autres (voir documentation) n De nombreuses méthodes "prêt-à-l'emploi" u length, charAt, indexOf, valueOf, substring, toUpperCase, startsWith, replace, trim,...

85 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 85 Exemples public class AppString{ public static void main(String [] args){ String message="Bienvenue au cours Java!\n"; String messageMaj=message.toUpperCase(); System.out.println(message + "\n" + messageMaj + "\n"); int a=12, b=4599; double c=215.34; System.out.println(String.valueOf(a).charAt(0) + "\t" + String.valueOf(b).charAt(2)); System.out.println(String.valueOf(c).indexOf(".") + "\n"); String mot=message.substring(19,23); System.out.println(mot + "\t" + message.length() + "\n"); }

86 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 86 Exercice Imaginez une application utilisant une classe "Personne" avec les champs de données nécessaires pour donner corps aux méthodes suivantes: une méthode qui provoque "l'affichage" de l'objet "Personne" les champs nom, prénom, n°tel séparés par des tabulations une méthode qui provoque l'affichage d'une carte de visite 1e ligne: Prénom Nom 2e ligne: Organisme 3e ligne: Fonction 4e ligne: (tabulations) adresse une méthode qui provoque l'affichage d'une étiquette d'adresse 1ère ligne: 1ère lettre du Prénom+point+ Nom (1ère lettre en majuscule et le reste en minuscules) 2e ligne: Adresse 3e ligne: CP + Localité

87 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 87 Les champs statiques n Un champ de données peut être propre à la classe et non à un objet particulier de cette classe. u un numéro d'ordre indiquant la prochaine valeur à utiliser lors de la création d'un objet F private static long prochainNumero=1; F la valeur de prochainNumero n'est accessible qu'à partir de la classe ( private ) est propre à la classe ( static ) et de type entier ( long ) u Autres exemples: F les champs in et out de la classe System

88 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 88 Modification d'un champ statique public static int prochainNumero = 1;// champ statique de la classe Cassette public int numero;// champ dynamique de type primitif entier public String Titre; public Date enregistreLe;... Cassette c = new Cassette(); // création dun objet c de type Cassette c.numero = Cassette.prochainNumero++// affectation du numéro à la cassette

89 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 89 Les méthodes statiques n Une méthode peut aussi être propre à la classe. u la méthode sqrt de la classe Math u la méthode d'altération d'un champ de donnée statique F celle qui ré-initialiserait la valeur de prochainNumero, par exemple private static void initialiserProchain(){ prochainNumero=1; } u une méthode utilitaire public static auCarre(int x){ System.out.println("Le carré de " + x + " est " + x*x + "."); }

90 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 90 Le modificateur d'accès final (1) n Son rôle est d'empêcher toute modification future du champ ou de la méthode auxquels il peut s'appliquer. u Champ: F Exemples private final nom; private static final DIMENSION_MAXIMALE=10; F correspond à la déclaration et à l'affectation d'une variable dont la valeur ne pourra changer F un champ final doit être initialisé au plus tard au moment de la construction F les variables déclarées static final sont en fait des constantes F l'utilisation des lettres majuscules et du caractère de soulignement pour les constantes font partie des règles de bonne pratique

91 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 91 Le modificateur d'accès final (2) u Méthodes F une méthode déclarée final ne peut être redéfinie dans une sous-classe (voir héritage) F une méthode déclarée static est nécessairement et implicitement final F une méthode déclarée private est nécessairement et implicitement final u Classes F elles peuvent aussi être déclarées final si on ne souhaite pas que d'autres classes en héritent n Ce modificateur d'accès permet d'optimiser le travail du compilateur. u Un appel à une telle méthode peut être remplacé par son code.

92 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 92 Les opérateurs n Arithmétiques u les classiques +, -, *, /, % (reste de la division entière de … par…) u attention aux conversions (promotions)de types n Compile? compile pas? public class Promotion{ public static void main(String [] args){ byte b1=2, b2=5, b3; b3=b1+b2; byte b4=b1+6; } public class Promotion{ public static void main(String [] args){ byte b1=2, b2=5; int b3=b1+b2; byte b4=b1; }

93 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 93 Compile? Compile pas? public class Promotion{ public static void main(String [] args){ int i1=50000, i2=60000; int i3=i1+i2; long i4=i1*i2; System.out.println(i3 + " " + i4); } public class Promotion{ public static void main(String [] args){ long i1=50000, i2=60000; long i3=i1+i2; long i4=i1*i2; System.out.println(i3 + " " + i4); }

94 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 94 Mais encore... public class Promotion{ public static void main(String [] args){ int i=50000; float f1=i+2.; float f2=i+2.f; System.out.println(f1 + " " + f2); } public class Promotion{ public static void main(String [] args){ char c='a'; int i=5; System.out.println(c); System.out.println(c+i); c+=i; System.out.println(c); c=c+i; System.out.println(c); }

95 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 95 Incrémentation, décrémentation n Incrémentation u suffixe i++, préfixe ++i F for(int i=0; i<50; i++) n Décrémentation u suffixe i--, préfixe --i Quel est celui des deux messages qui sera imprimé? int i=5; if ( i++>5) System.out.println(Le test précède lincrémentation); if ( ++i>5) System.out.println(Lincrémentation précède le test); Résultat? int a = 2, b = 5; int i = a * ++b; System.out.println(i vaut + i +.);

96 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 96 Affectation élargie n Une autre manière de raccourcir les écritures: u a *= 2 a = a * 2 u existe aussi avec +, -, / et % int a = 25, b = 25; a /= 4; b %= 6; System.out.println(a + "\t" + b); u fonctionne également avec + pour les chaînes de caractères String nom = "Vandeput"; String prenom = "Etienne"; nom += " " + prenom; System.out.println(nom); concaténation du prénom au nom avec espace entre les deux

97 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 97 Opérateurs logiques, relationnels, conditionnel n Les classiques ET, OU, NON et les opérateurs optimisés u &, |, ^,! u &&, || n Pour la comparaison: u, =, ==, != n L'opérateur conditionnel permet également de beaux raccourcis d'écriture du genre int a, b; a = … ; b = … ;... int max = a > b ? a : b;

98 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 98 Les commentaires n // pour les fins de ligne u co++; // incrémentation du compteur n mais aussi /* … */ pour des textes de n'importe quelle longueur (plusieurs lignes) u /* Programme de … réalisé par … Copyright … */ n /** … */ pour des textes destinés au générateur de documentation, l'utilitaire java.doc

99 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 99 Le jeu du compilateur n Repérer les erreurs de syntaxe u attention des conversions implicites de types sont possibles u byte, short int n Transformer les instructions correspondantes en commentaires (//) n Prédire laffichage n Tester

100 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 100 public class Ex11ch4{ public static void main(String [ ] args){ byte b1 = 5, b2 = 127; short s1, s2; int i; char c = 'b'; b2 += b1; b2 = b2 + b1; b1 += 2; s1 = b1 + 2; s2 = s1 * 2; c += 2; c = c + 2; i = b1 + b2; i += 5; System.out.println(b1); System.out.println(b2); System.out.println(s1); System.out.println(s2); System.out.println(i); System.out.println(c); }

101 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 101 A retenir... n Les opérateurs arithmétiques provoquent des "promotions" des types byte et short vers le type int n L'opérateur d'affectation élargie n'a pas tout à fait le même effet qu'une opération suivie d'une affectation u pas de conversion implicite dans le cas d'une affectation élargie u b2 *= b1 OK u b2= b2*b1 KO n Pas de promotion par les opérateurs arithmétiques pour les expressions de type int

102 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 102 Le jeu du compilateur (suite) n Les invocations sont-elles correctes? n Les affectations sont-elles correctes? n Correction n Compilation

103 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 103 public class Ex12ch4{ public static void main(String [] args){ Bidon b = new Bidon(); long valeur = 100; b.reagir(valeur); b.agir(valeur); agir(valeur); } class Bidon{ private static final long k = 5; private long champ; static void agir(long valeur){ champ = valeur; } void reagir (long valeur){ champ = valeur; k = valeur; }

104 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 104 A retenir... n Défense de modifier un champ final n Inutile d'invoquer une méthode statique par le biais d'un objet u le faire plutôt par le biais de la classe Bidon.agir(valeur); n Une invocation de méthode sans nom d'objet (ou de classe) exige que cette méthode soit définie à l'intérieur de la classe.

105 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 105 Choix de la méthode par le compilateur n Résolution de la surcharge u choix de la meilleure méthode F basé sur la signature F doit coller au nombre de paramètres F doit coller le mieux possible aux types des paramètres (promotions acceptées) n Un exercice pour comprendre: quel affichage produit le programme suivant? u attention aux accès F public, private F même classe, classes différentes

106 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 106 public class Ex13ch4{ public static void main(String [] args){ A a = new A(); a.g(); System.out.println("A partir de la méthode MAIN"); System.out.println(" "); int n =1; long q = 12; float x =1.5f; double y = 2.5; a.f(n,q); a.f(q,n); a.f(n,x); a.f(n,y); } class A{ public void f(int n, float x){ System.out.println("f(int n, float x)\tn = " + n + " x = " + x); } private void f(long q, double y){ System.out.println("f(long q, double y)\tq = " + q + " y = " + y); } public void f(double y1, double y2){ System.out.println("f(double y1, double y2)\ty1 = " + y1 + " y2 = " + y2); } public void g(){ int n =1; long q = 12; float x =1.5f; double y = 2.5; System.out.println("A partir de la méthode g"); System.out.println(" "); f(n,q); f(q,n); f(n,x); f(n,y); }

107 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 107 Les tableaux n Non dimensionnés à la déclaration String [] prenoms; Point [] sommets; int [] baremes; n Dimensionnés à l'initialisation u prenoms = new String [5]; int [] multiplesDe3 = new int [] {0, 3, 6, 9} int [] valeurs = {128, 135, 136, 141}; u baremes = {128, 135, 136, 141}; // incorrect n Exemple u calcul d'une série de points du graphe d'une fonction

108 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 108 public class Tableau{ public static void main(String[ ] args){ Point[ ] tableValeurs = new Point[5]; for (int i = 0; i<5; i++){ tableValeurs[i] = new Point(i, i*i); System.out.println("t[" + i + "] = " + tableValeurs[i]); } Exemple n L'initialisation d'un tableau passe souvent par l'emploi d'une structure de contrôle répétitive

109 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 109 Lancers de dés n On souhaite lancer deux dés un certain nombre de fois et produire une statistique sur la somme des deux points obtenus à chaque fois. n Une classe DeuxDes pour implémenter une méthode statique lancer u pas besoin de créer objets quand on peut en réinitialiser un seul (la classe) u les champs premier et second et les méthodes d'accès sont là pour le fun u appel à la classe Math u transtypage pour obtenir un effet d'arrondi (vers le bas)

110 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 110 public class AppLancer{ public static void main(String [] args){ int [] stat = new int [11]; System.out.println("Combien de lancers?\n"); int i = Clavier.lireInt(); for (int j=0; j0){ System.out.println("\nRésultats après " + i + " lancers:\n"); for (int j=0; j<11; j++){ System.out.println(Integer.toString(j+2) + ": \t" + stat[j] + "\t soit " +100*stat[j]/i+ "%"); } else{ System.out.println("Aucun lancer!"); } class DeuxDes{ private static int premier; private static int second; public static int lancer(){ premier = (int)(Math.random()*6)+1; second = (int)(Math.random()*6)+1; return premier + second; } public static int getPremier(){ return premier; } public static int getSecond(){ return second; }

111 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 111 A propos des E/S... n L'utilisation d'un environnement type "ligne de commande" peut s'avérer restrictif à terme. n A ce stade de connaissance du langage, il peut être fait usage de quelques méthodes statiques de certaines classes graphiques. u Les classes graphiques sont issues de deux packages: F java.awt (plus ancien) F javax.swing u La méthode statique showInputDialog de la classe JOptionPane affiche une boîte de dialogue attendant un input de l'utilisateur. u La méthode showMessageDialog produit un output dans une boîte de dialogue

112 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 112 Illustration naïve import javax.swing.*; public class EntreeDeDonnees{ public static void main(String [] args){ String nom = JOptionPane.showInputDialog("Quel est votre prénom?"); JOptionPane.showMessageDialog(null,"Bienvenue au cours Java, " + nom + "."); System.exit(0); } n Une instruction explicite de sortie du programme est nécessaire lorsque des classes graphiques sont utilisées.

113 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 113 Héritage n Motivation u le regroupement d'objets en classes ne suffit pas F besoin de descriptions plus fines F besoin de modifier certains comportements u réutilisation F ne pas tout inventer mais plutôt améliorer l'existant n Localisation dans un énoncé u relations de type "...est un…", "...est une…" F un carré est un quadrilatere F un compte épargne est un (e sorte de) compte u à ne pas confondre avec les relations de type "…a un…", "…a une…" F un cercle a un centre (qui est un point) F une planète a un satellite (qui est aussi une planète)

114 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 114 Spécialisation... n Une classe qui hérite d'une autre classe la spécialise u plus de champs F les objets de la classe CompteCourant auront un champ decouvertAutorise, par exemple u plus de méthodes et/ou des constructeurs spécifiques F la classe CompteEpargne définira une méthode calculInteret, par exemple u des méthodes modifiées F la méthode calculPerimetre de la classe Carre peut être redéfinie plus simplement (ou effectuer le calcul sur d'autres bases)

115 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 115 …et généralisation n Une classe dont une autre classe hérite la généralise. u Parfois on se rend compte que plusieurs classes peuvent avoir des états et des comportements communs. F Une classe Quadrilatere peut généraliser des classes comme Carre, Rectangle, Losange,… u Les classes de généralisation sont assez souvent abstraites F Elles ne sont pas complètement implémentées mais on veut pouvoir tirer profit de la généralisation en invoquant des comportements dont la sémantique est commune la méthode pour calculer sa surface, par exemple, pourrait être définie concrètement au niveau de chaque sous- classe on pourrait aussi en signaler l'existence (sans la décrire) à plus haut niveau

116 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 116 Vocabulaire n On parle de u sous-classe pour désigner la classe qui hérite u superclasse pour désigner la classe dont hérite une classe donnée u on dit d'une sous-classe qu'elle étend sa superclasse n En Java, il n'y a que de l'héritage simple u une classe ne peut hériter de plusieurs classes différentes n Et l'héritage multiple alors? u parfois utile, il est simulé par l'usage des interfaces u une classe peut implémenter une ou plusieurs interfaces

117 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 117 Surcharge vs remplacement n La surcharge u (en anglais overloading ) concerne la possibilité, pour une méthode, d'avoir plusieurs signatures. F m(int) m(String,int) n Le mécanisme d'héritage enrichit les possibilités de surcharge u si les signatures sont différentes de celles qui existent déjà F m(String,String) n Le remplacement u (en anglais overriding ) concerne l'existence de la signature d'une méthode dans une classe plus élevée de la hiérarchie F m(int)

118 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 118 Illustration de ces trois mécanismes n Les classes u Personne u Eleve (qui hérite de Personne ) u Residence F pour illustrer la composition dans Personne

119 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 119 /* Illustration de l'héritage, de la surcharge et du remplacement */ class Personne{ protected final String nom; protected final String prenom; protected Residence r; // > Composition public Personne(String nom){ this.nom = nom; this.prenom = ""; } public Personne(String nom, String prenom){ //---> Surcharge this.nom = nom; this.prenom = prenom; } public String toString(){ return "Identité: " + nom + " " + prenom; } class Residence{ private String rue; private String numero; private int codePostal; private String localite; }

120 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 120 class Eleve extends Personne{ private String classe; public Eleve(String nom, String prenom, String c){ super(nom, prenom); classe = c; } public String toString(){ // > Remplacement return "Identité " + nom + " " + prenom + "\nClasse: " + classe; } public class AppHSR{ /** Classe dapplication */ public static void main(String [] args){ /** Création de trois objets: */ Eleve e = new Eleve("Vandeput", "", "5TTr"); Personne p1 = new Personne("Vandeput"); Personne p2 = new Personne("Vandeput", "Etienne"); // Impression des objets comme chaînes de caractères System.out.println(e + "\n\n" + p1 + "\n\n" + p2 + "\n"); }

121 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 121 Commentaires n Modification de l'accès aux champs nom et prenom u nécessaire pour que la classe Eleve puisse accéder aux champs de la classe Personne u protected donne un accès aux classes qui héritent de la classe Personne (et à celles qui sont dans le même package - voir plus loin) n Le constructeur de la classe Eleve fait appel à celui de la classe Personne n Chaque fois qu'elle est redéfinie, la méthode toString vient en remplacement u pour rappel, elle existe déjà au niveau de la classe Object

122 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 122 Les inconvénients du M.A. protected n Une faille dans le système n Le programmeur peut faire hériter de cette classe, une classe qu'il construit. u De cette façon, il a un accès direct aux champs de la classe u Infraction au principe d'encapsulation u A utiliser avec modération...

123 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 123 Constructeurs et héritage n En l'absence d'un appel à un constructeur spécifique de la superclasse (comme dans l'exemple précédent) u appel au constructeur sans argument de la superclasse F il existe OK F il n'existe pas et il n'y en a pas d'autres OK F il n'existe pas mais il y en a d'autres KO n S'il y a appel spécifique à un constructeur de la superclasse, il doit précéder toutes les autres instructions. n Il est également possible d'appeler un autre constructeur de la classe. n Exemples

124 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 124 public class ConstrHerit{ public static void main(String [] args){ A a = new A(); B b = new B(2); System.out.println(a + "\n" + b); } class A{ int x; A(){ System.out.println("Un objet A est construit."); } public String toString(){ return "x: " + x; } class B extends A{ int y; B(int y){ this.y = y; } public String toString(){ return "x: " + x + "\t" + "y: " + y; }

125 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 125 Commentaires n L'existence d'un constructeur sans argument dans la définition de la classe A évite une erreur de compilation u conséquence: le message "Un objet A est construit" s'affiche même lors de la création d'un objet de type B n La méthode toString de la classe A remplace celle de la classe Object, celle de la classe B remplace celle de la classe A. n La substitution d'un constructeur avec argument à celui sans argument dans A nous oblige à quelques corrections. n Illustration

126 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 126 public class ConstrHerit2{ public static void main(String [] args){ A a = new A(5); B b = new B(2,4); System.out.println(a + "\n" + b); } class A{ int x; A(int x){ this.x = x; } public String toString(){ return "x: " + x; } class B extends A{ int y; B(int x, int y){ super(x);// Appel explicite dun constructeur de A this.y = y; } public String toString(){ return "x: " + x + "\t" + "y: " + y; }

127 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 127 Un exercice pour se distraire n Construction d'une pile u exemple des assiettes u les principales actions F empiler F dépiler F vérifier si la pile est vide F obtenir une copie de l'élément en haut de la pile

128 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 128 Le polymorphisme (1) n Idée u les membres d'une classe ayant hérité d'une autre classe peuvent être déclarés comme faisant partie de cette dernière (ou d'une classe située plus haut dans le graphe d'héritage) u class A{ void m(){ … } class B extends A{ … } … A b = new B(); … b.m();... u on peut donc invoquer sur un objet de la sous-classe une méthode définie à un niveau supérieur F …puisque la sous-classe en hérite ou la redéfinit

129 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 129 Le polymorphisme (2) n L'inverse n'est pas possible u un directeur est aussi un enseignant mais un enseignant n'est pas nécessairement un directeur F Enseignant e = new Directeur(); // OK F Directeur d = new Enseignant() // KO u d étant un objet dont le type réel est Enseignant, il est impossible de lui demander d'effectuer des traitements spécifiques aux directeurs

130 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 130 Le polymorphisme (3) n Mécanisme u le compilateur recherche la signature de la méthode à partir du type déclaré de l'objet (souvent, une classe de niveau supérieur dans le graphe d'héritage) u à l'exécution, l'interpréteur recherche une méthode qui a cette signature en commençant sa recherche dans la classe elle- même et en remontant dans la hiérarchie si nécessaire n Avantage u le programmeur est libéré d'une partie du travail u il s'occupe des généralités (et peut faire confiance à l'interpréteur pour les spécificités)

131 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 131 Liaisons statiques et dynamiques n Méthode déclarée static (ou private ou final ) u le compilateur sait que cette méthode ne sera pas redéfinie à plus bas niveau F il peut donc insérer le code de la méthode dans la séquence des opérations à effectuer n Méthode ne possédant aucune de ces limitations u l'interpréteur fera le choix de la méthode en fonction du type réel de l'objet à l'exécution F Ex: on définit un tableau de formes (la classe Forme possédant une méthode dessineToi ) On initialise ce tableau avec des formes diverses (carrés, rectangles, cercles,…) Une boucle parcourt le tableau en demandant à chaque forme de se dessiner. Les méthodes utilisées pourront être différentes d'un élément du tableau à l'autre.

132 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 132 Exercices n Héritage et constructeurs n Polymorphisme n Résolution de surcharge et choix de la bonne méthode à l'interprétation

133 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 133 public class Ex1ch5{ public static void main(String [] args){ A a1 = new A(); A b1 = new B(); A b2 = new B(5); A a2 = new B(-1); System.out.println(a1.valeur); System.out.println(b1.valeur); System.out.println(b2.valeur); System.out.println(a2.valeur); } class A{ int valeur; } class B extends A{ B(){ valeur=100; } B(int v){ valeur = valeur + v; }

134 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 134 public class Hierarchie1{ public static void main(String [] args){ Parallelogramme p = new Parallelogramme(); Rectangle r = new Rectangle(); Carre c = new Carre(); Quadrilatere q = new Quadrilatere(); Triangle t = new Triangle(); Polygone g = new Polygone(); Forme f = new Forme(); p.seDefinir(); r.seDefinir(); c.seDefinir(); q.seDefinir(); t.seDefinir(); g.seDefinir(); f.seDefinir(); System.out.println(); f = c; g = r; q = p; f.seDefinir(); g.seDefinir(); q.seDefinir(); }

135 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 135 class Forme{ public void seDefinir(){ System.out.println("Je suis une forme."); } class Polygone extends Forme{ public void seDefinir(){ super.seDefinir(); System.out.println("Je suis aussi un polygone."); } class Triangle extends Polygone{ } class Quadrilatere extends Polygone{ } class Carre extends Quadrilatere{ public void seDefinir(){ System.out.println("Je suis un carré."); } class Rectangle extends Quadrilatere{ public void seDefinir(){ super.seDefinir(); System.out.println("Je suis aussi un rectangle."); } class Parallelogramme extends Quadrilatere{ }

136 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 136 public class Poly2{ public static void main(String [] args){ A a = new A(); A b = new B(); A c1 = new C(); C c2 = new C(); B d1 = new D(); A d2 = new D(); a.m("Hello",5); a.m(5,"Hello"); a.m(5,10); a.m("5",10); b.m(5,"Hello"); b.m(5,10); c1.m(5,10); c1.m(5,"Hello"); c2.m(5,10); d1.m(5,"Hello"); d2.m("Hello",5); d2.m(5,10.f); d2.m(5.f,10); } class A{ void m(String s, int i){ System.out.println("Dans A: m(String, int)\t" + s + "\t" + i); } void m(int i, String s){ System.out.println("Dans A: m(int, String)\t" + i + "\t" + s); } void m(int i1, int i2){ System.out.println("Dans A: m(int, int)\t" + i1 + "\t" + i2); } void m(float f1, float f2){ System.out.println("Dans A: m(float, float)\t" + f1 + "\t" + f2); }

137 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 137 class B extends A{ void m(int i, String s){ System.out.println("Dans B: m(int, String)\t" + i + "\t" + s); } void m(float f, int i){ System.out.println("Dans B: m(float, int)\t" + f + "\t" + i); } class C extends A{ void m(int i1, int i2){ System.out.println("Dans C: m(int, int)\t" + i1 + "\t" + i2); } class D extends B{ void m(int i1, int i2){ System.out.println("Dans D: m(int, int)\t" + i1 + "\t" + i2); } void m(int i, String s){ System.out.println("Dans D: m(int, String)\t" + i + "\t" + s); }

138 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 138 Les structures de contrôle n Alternative, sélective, répétitives n Pas toujours nécessaires en fonction de la modélisation adoptée u Ex1: le problème de la sélection de la méthode selon le type d'objet de la forme est résolu par le polymorphisme et le graphe d'héritage u Ex2: il existe des interfaces "itérateurs" qu'il est possible d'utiliser pour éviter l'écriture de structures répétitives n La décision est à prendre en fonction de la complexité du problème

139 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 139 Alternative simple if (p1.equals(p2)){ System.out.println("Ces deux points ne définissent pas une droite!"); } else{ Droite d = new Droite(p1,p2); System.out.println("La droite d a pour équation: ", d); }

140 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 140 Sélectif switch (valeur_entière){ case valeur1: bloc_de_traitement1 case valeur2: bloc_de_traitement2... default: bloc_de_traitement_par_défaut }

141 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 141 Commentaires n Valeur entière pour le paramètre n Traitement par défaut u valeur non trouvée n Pas de traitement u si valeur non trouvée et pas de traitement par défaut n Interruption à préciser chaque fois si nécessaire u break n Une valeur de retour provoque l'interruption

142 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 142 public class H2D{ public static void main(String [] args){ String car = Clavier.lireString(); if (car.length()!=1){ System.out.println("ERREUR: un seul caractère"); } else{ char c=car.charAt(0); int val=deci(c); if(val!=-1){ System.out.println("Valeur du caractère:" + val); } public static int deci(char c){ switch(c){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return c-'0'; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': return c-'A'+10; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': return c-'a'+10; default: System.out.println("Ce caractère nest pas employé en hexadécimal"); return (-1); }

143 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 143 Répétitives n Boucle à parcourir u éventuellement 0 fois F tant qu'une condition est vérifiée F while u au moins une fois F jusqu'à ce qu'une condition soit vérifiée F do … while u un nombre connu de fois F détermination possible de ce nombre sur base d'une valeur initiale et d'une valeur finale F for

144 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 144 while while (expression_booléenne){ bloc_de_traitement } public class BoucleWhile{ public static void main(String [] args){ int i = 0; while (i++<8){ System.out.println("Bienvenue à la séance " + i + " du cours Java."); }

145 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 145 do - while do bloc_de_traitement while (expression_booléenne); public class BoucleDoWhile{ public static void main(String [] args){ int i = 1; do System.out.println("Bienvenue à la séance " + i + " du cours Java."); while (i++<5); }

146 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 146 for for (initialisations; expression_booléenne; incrémentations){ bloc_de_traitement { public class BoucleFor{ public static void main(String [] args){ for(int i=1;i<=8;++i){ System.out.println("Bienvenue à la séance " + i + " du cours Java."); }

147 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 147 Richesse syntaxique de la structure for n Initialisation possible de plusieurs variables u il est possible de tout écrire en arguments n Incrémentation possible de plusieurs variables u au sens large F x /= 2 est une incrémentation au sens large F x diminue n Exemple public static int pD2(int valeur){ int exp; for(exp=0, valeur-=1; valeur>0; exp++, valeur/=2){ } return exp; }

148 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 148 Les interruptions du flux normal d'exécution n break u pas seulement pour la structure switch u permet de quitter le bloc courant u possibilité de "s'échapper" davantage en travaillant avec des étiquettes n continue u renvoie l'exécution à la fin de la boucle F nouvelle incrémentation F nouveau test n return u retour à l'appelant

149 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 149 do int revenus = Clavier.lireInt() ; if(revenus<100000) break;... while(...); taxation: do int revenus = Clavier.lireInt() ; if(revenus<100000){ System.out.println("Pas de taxation"); break taxation; }... while(...);

150 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 150 Exercice n Le type abstrait Ensemble u éléments de même type u un même élément ne peut se répéter n Primitives u ajouter, supprimer un élément u vérifier l'appartenance d'un élément à un ensemble u obtenir sa cardinalité n Implantation u liste chaînée simple ou liste doublement chaînée

151 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 151 Une piste intéressante n Le site u à voir en particulier: F les pages de Jean Berstel et Jean-Eric Pin

152 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 152 Un exercice déchauffement! n Imaginez ce qui se passera si on fournit les instructions de droite au compilateur u va-t-il rejeter des choses? u sil les accepte, pouvez-vous imaginer ce quil va créer dans la mémoire et comment celle-ci va-t-elle évoluer?

153 Passer à la première page Programmer avec des objets © CeFIS 2004 Page A x = new A(); A y = new A(); x.methode(y); 2.A x = new A(); A y = new B(); x.methode(y); 3.A x = new A(); B y = new B(); x.methode(y); 4.B x = new B(); B y = new B(); x.methode(y); 5.A x = new B(); B y = new B(); x.methode(y); 6.B x = new B(); B y = new A(); x.methode(y); class A{ A autre; void methode(A v){ autre = new A(); } class B extends A{ int valeur; void methode(A v){ super.methode(v); valeur++; } void methode(B v){ autre = v; }

154 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 154 Autres mécanismes n Outre les mécanismes fondamentaux et incontournables... u Encapsulation u Héritage u Polymorphisme n …il existe d'autres concepts qui s'avèrent utiles dans certaines circonstances particulières u Classes (et méthodes) abstraites u Interfaces u Classes internes, anonymes

155 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 155 Classes abstraites n Sorte de conséquence du processus de généralisation u définir des classes et, dans ces classes, des méthodes dont la description d'une implémentation serait hâtive F une classe Forme F une méthode calculDuPerimetre n Idée u déclarer sans définir F pas d'accolades, juste une signature et des modificateurs d'accès u intérêt pour le développement: on sait que la méthode existe (sera implémentée) et on peut sen servir u à combiner avec le polymorphisme

156 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 156 Exemple n Trinôme du second degré u on souhaite F disposer des valeurs des racines quand elles existent F vérifier si une valeur se situe entre les racines quand la question a du sens F... u plusieurs sortes de trinômes... F avec deux racines F avec racine double F sans racines u …et si on souhaite travailler avec les nombres complexes F avec racines complexes

157 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 157 Observation sur l'héritage n Un graphe d'héritage n'est pas nécessairement synonyme de "partition de la classe d'héritage" u il n'est pas obligatoire de retrouver toutes les possibilités F héritent de Quadrilatere : Carre, Rectangle F et le reste? pas nécessairement utile u certaines classes ayant hérité peuvent correspondre à des situations identiques mais dont le choix est lié à des traitements différents F un trinôme sans racine est aussi un trinôme ayant deux racines complexes F selon les traitements escomptés, l'objet créé sera l'un ou l'autre

158 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 158 Problème du trinôme n Idée u définir les méthodes au niveau de la classe Trinome u tous les objets sont des trinômes mais au moment d'en créer un, on choisit sa spécificité (polymorphisme) n Difficulté u les méthodes comme calculerRacines, estEntreRacines,… ne peuvent être définies au niveau de la classe Trinome n Solution u elles sont déclarées mais pas définies u classes abstraites

159 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 159 Syntaxe Utilisation du mot-clé abstract dans la déclaration de la méthode et donc, obligatoirement, dans la déclaration de la classe public abstract class Trinome{ protected double a, b, c;... public abstract void calculerRacines();... }

160 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 160 Remarques n Dès qu'une méthode est abstraite, la classe qui en contient la déclaration l'est aussi. u le mot-clé abstract est donc nécessaire pour les deux F sinon erreur à la compilation n La déclaration de la méthode abstraite s'arrête après la signature de la méthode. n Une classe abstraite ne peut être instanciée. n Des méthodes d'une classe abstraite peuvent être concrètes. u une méthode getValeurDeA, par exemple n Une classe d'héritage ne devient concrète que si elle ne comprend plus aucune méthode abstraite.

161 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 161 Créer des objets en ignorant de quel type! n Le code de la méthode main ci-dessous illustre la création de trinômes. n Le programmeur qui rédige ce code ne sait de quel type véritable sera chaque objet. public class AppAbstract{ public static void main(String [] args){ Trinome t1 = Trinome.creer(1.,2.,1.); Trinome t2 = Trinome.creer(1.,-1.,1.); Trinome t3 = Trinome.creer(1.,5.,6.); t1.calculerRacines(); t2.calculerRacines(); t3.calculerRacines(); } }

162 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 162 Une classe Rho pour éviter les types primitifs class Rho{ private double valeur; public Rho(double a, double b, double c){ valeur = b*b - 4*a*c; } public double getValeur(){ return valeur; }

163 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 163 abstract class Trinome{ protected double a, b, c; Rho d; public Trinome(double a, double b, double c, Rho d){ this.a = a; this.b = b; this.c = c; this.d = d; } public static Trinome creer(double a, double b, double c){ Rho d = new Rho(a,b,c); if (d.getValeur()<0){ return new TrinomeSansRacine(a,b,c,d); } else{ if (d.getValeur()==0){ return new TrinomeAvecRacineDouble(a,b,c,d); } else{ return new TrinomeAvecDeuxRacines(a,b,c,d); } public abstract void calculerRacines(); }

164 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 164 Héritage n Trois classes étendent la classe Trinome et la concrétisent u TrinomeSansRacine u TrinomeAvecRacineDouble u TrinomeAvecDeuxRacines n Les constructeurs de ces classes font appel aux constructeur de la classe Trinome u essentiellement pour le remplissage des champs de données u la méthode abstraite calculerRacines est implantée dans chacune d'entre elles de manière différente

165 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 165 class TrinomeSansRacine extends Trinome{ public TrinomeSansRacine(double a, double b, double c, Rho d){ super(a,b,c,d); } public void calculerRacines(){ System.out.println("Il n'y a pas de racines réelles."); } class TrinomeAvecRacineDouble extends Trinome{ public TrinomeAvecRacineDouble(double a, double b, double c, Rho d){ super(a,b,c,d); } public void calculerRacines(){ System.out.println("La racine double est " + (-b/2*a)); } class TrinomeAvecDeuxRacines extends Trinome{ public TrinomeAvecDeuxRacines(double a, double b, double c, Rho d){ super(a,b,c,d); } public void calculerRacines(){ System.out.println("Les racines sont " + (-b+Math.sqrt(d.getValeur()))/ (2*a) + " et " + (-b-Math.sqrt(d.getValeur()))/(2*a) + "."); }

166 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 166 Observation n La méthode statique créer de la classe abstraite Trinome est intéressante u elle permet de créer des objets de types réels différents en fonction de la valeur du discriminant u on n'évite pas l'utilisation de structures de sélection mais c'est uniquement pour la création des objets u le programmeur de la méthode main invoque cette méthode pour créer des objets dont il pourrait ne pas connaître le type et invoquer les méthodes de la classe Trinome sur ces objets

167 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 167 Intérêt d'une telle approche n Adaptabilité? u première amélioration souhaitée F on souhaite parfois pouvoir calculer des racines complexes F on aimerait disposer d'une méthode qui examine si une valeur donnée se trouve ou non entre les valeurs des racines éventuelles n Création d'une classe supplémentaire qui étend la classe Trinome u pas de conflit avec la classe TrinomeSansRacine F la décision de construire un objet de tel ou tel type est prise dans la méthode creer de Trinome F le problème est réglé par l'ajout d'un paramètre booléen à la signature de cette méthode

168 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 168 Autre version de la méthode main n Un paramètre a été ajouté à la méthode créer public class AppAbstract2{ public static void main(String [] args){ Trinome t1 = Trinome.creer(1,2,1,true); Trinome t2 = Trinome.creer(1,-1,1,true); Trinome t3 = Trinome.creer(1,-1,1,false); Trinome t4 = Trinome.creer(1,5,6,true); t1.calculerRacines(); t2.calculerRacines(); t3.calculerRacines(); t4.calculerRacines(); } }

169 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 169 Modification de la méthode creer public static Trinome creer(double a, double b, double c, boolean complexe){ Rho d = new Rho(a,b,c); if (d.getValeur()<0){ if (complexe){ return new TrinomeAvecRacinesComplexes(a,b,c,d); } else{ return new TrinomeSansRacine(a,b,c,d); } else{ if (d.getValeur()==0){ return new TrinomeAvecRacineDouble(a,b,c,d); } else{ return new TrinomeAvecDeuxRacines(a,b,c,d); }

170 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 170 Nouvelle classe class TrinomeAvecRacinesComplexes extends Trinome{ public TrinomeAvecRacinesComplexes(double a, double b, double c, Rho d){ super(a,b,c,d); } public void calculerRacines(){ System.out.println("Les racines complexes sont " + ((-b+Math.sqrt(-d.getValeur()))/2*a) + "i et " + ((-b-Math.sqrt(-d.getValeur()))/2*a) + "i."); }

171 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 171 Exercice n Une deuxième amélioration est souhaitée: u on voudrait savoir si une valeur donnée est ou non située entre les racines éventuelles d'un trinôme F développer une méthode estEntreRacines renvoyant une valeur booléenne sur base de la fourniture d'une valeur numérique u on admet que s'il n'y a pas de racine réelle, la valeur renvoyée est false u suggestion: F définir une classe Racine et modifier les méthodes concernées F un objet de type Trinome possèdera deux champs de type Racine ; les champs pointeront "dans le vide" si les racines réelles n'existent pas

172 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 172 Les interfaces n Ce concept fait penser à celui de moyen de communication. u Exemple: comment faire pour lier une application comme toutes celles que nous avons développées jusqu'ici, à une interface graphique n ! Interface n'est pas synonyme d'interface graphique ! u Mais les interfaces graphiques tirent profit du concept plus général dinterface n Une première définition: u sorte de classe abstraite (mais complètement, ç-à-d. toutes les méthodes sont abstraites) et ne possédant pas instances et déclarant une espèce de contrat qui sera véritablement réalisé par toutes les classes qui l'implantent

173 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 173 Interfaces vs classes abstraites n Pourquoi des interfaces alors qu'il existe des classes abstraites? u dans une interface, toutes les méthodes sont abstraites u dans une classe abstraite, certaines méthodes peuvent être concrètes est des champs d'instance peuvent être définis n Pourquoi ne pas remplacer les interfaces par des classes abstraites sans champs d'instance et ne comprenant que des méthodes abstraites? u un autre mécanisme est recherché: celui de l'héritage multiple u une classe ne peut hériter que d'une seule autre classe u une classe pourra implanter plus d'une interface

174 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 174 Syntaxe et observations interface Forme{ public abstract double surface(); public abstract double volume(); } n Toute interface a un accès public u ce mot-clé est donc inutile devant le mot Interface u les méthodes sont, de manière automatique, abstraites et d'accès public F les mots-clés public et abstract sont donc également inutiles n Une interface peut en étendre une autre u héritage d'interface

175 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 175 Classe implantant une interface class Point implements Forme{ private double x, y;...// autres champs, constructeurs et méthodes public double surface(){ return 0.0; } public double volume(){ return 0.0; }

176 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 176 Autre exemple class Carre implements Forme{ private final String nom; private double cote; public Carre(String n, double c){ nom = n; cote = c; } public double surface(){ return cote*cote; } public double volume(){ return 0.0; } public String getNom(){ return nom; }

177 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 177 Détails n Pas de champs d'instance, mais possibilité de définir des constantes u si un groupe de constantes est régulièrement utilisé par les classes de certaines applications, il est possible de définir ces constantes dans une interface sans nécessairement y ajouter de méthodes u chaque classe qui voudra les utiliser n'aura qu'à implanter cette interface sans méthodes n Les noms portés par les interfaces sont souvent des adjectifs. u Ex: les interfaces Clonable et Comparable du package java.lang

178 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 178 Interface et héritage multiple n Une classe ne peut hériter que d'une seule autre mais peut implanter plusieurs interfaces u dans ce cas, elle devra remplir le contrat déclaré par chacune des interfaces u le "Canada dry" de l'héritage multiple F ça en a le goût, mais ça n'en est pas, notamment parce que des champs d'instance ne peuvent être hérités n Lorsqu'une classe implante plusieurs interfaces, on est sûr de pouvoir invoquer n'importe quelle méthode de n'importe laquelle de ces interfaces sur les objets de cette classe

179 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 179 Exemple dhéritage multiple n L'interface Clonable de java.lang ne comprend pas de méthode u son implantation par une classe assure simplement que la méthode clone de Object pourra être utilisée n L'interface Comparable de java.lang comprend la seule méthode compareTo voir les recommandations class MaClasse implements Comparable, Clonable{ public int compareTo(Object o){... } }

180 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 180 Interface graphique et événements n Une première approche u nécessité, pour des applications interactives utilisant des interfaces graphiques, de s'intéresser aux événements F clic de souris F modification du contenu d'une zone de texte F choix d'un item dans une liste F temps qui passe F…F… u le modèle des événements en (trop) bref F n'importe quelle classe peut implanter l'interface ActionListener comprenant la méthode actionPerformed F les instances d'une telle classe seront nécessairement des "écouteurs" qui réaliseront l'action décrite dans actionPerformed à chaque réception de message de la part d'un objet dont il est à l'écoute

181 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 181 Principe n Les objets écouteurs sont des instances de classes qui doivent implanter l'interface ActionListener u Nécessité de décrire la méthode actionPerformed dans les classes d'implantation n Certains objets, tels les objets graphiques, peuvent se voir attribuer une liste d'objets écouteurs u méthode addActionListener ou passage d'un paramètre (comme pour un objet Timer ) n Les objets possédant des listes d'écouteurs envoient des messages à ces écouteurs quand un événement particulier se produit n L'écouteur exécute la méthode actionPerformed

182 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 182 Exemple rudimentaire n Toutes les 5 secondes, un message affiche le temps écoulé. Une boîte de dialogue permet d'interrompre le programme. u Cette application provoque un affichage au niveau de la fenêtre de l'OS. u Elle sera améliorée par la suite. n Plusieurs packages sont nécessaires u voir justification dans le code

183 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 183 import java.util.*;// pour Date import java.awt.event.*;// pour ActionEvent et ActionListener import javax.swing.*;// pour JOptionPane import javax.swing.Timer;// pour éviter le conflit avec la classe Timer de java.util public class AppChrono{ public static void main(String [] args){ ActionListener chrono = new AfficheurDeTemps(); // Usage du polymorphisme Timer t = new Timer(5000,chrono); t.start(); JOptionPane.showMessageDialog(null, "Fin du programme?"); System.exit(0); } class AfficheurDeTemps implements ActionListener{ private final Date topChrono = new Date(); public void actionPerformed(ActionEvent e){ Date now = new Date(); System.out.println("Temps écoulé: " + (now.getTime() - topChrono.getTime())/ " secondes"); }

184 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 184 Intérêt des interfaces n Ingénierie logicielle u Souhait de développer séparément F les classes correspondant aux écrans de saisie et d'affichage F l'application qui traite les données fournies via ces écrans de saisie et qui y affiche les résultats u Association des deux, faite par le biais d'objets u Intérêt des interfaces pour ne pas perdre des opportunités de réutiliser et d'adapter, F les interfaces définissent le contrat à remplir par les objets sans savoir de quels objets il s'agit (pourvu que leur implémentation répond au contrat) n En Java u Utilité des interfaces également pour le fonctionnement du modèle des événements F voir exemple qui suit

185 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 185 De plus… n Le polymorphisme, les classes abstraites, les interfaces u des outils pour abstraire les problèmes en évitant de tout savoir à propos des objets concernés u lorsqu'on doit traiter avec un objet, et si c'est possible, il vaut mieux le considérer comme un objet d'une superclasse que sa classe étend ou comme une interface que sa classe implante u des outils au service de la souplesse des programmes

186 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 186 Le modèle des événements en Java n Des événements u qui seront généralement des objets de classes prédéfinies possédant champs et/ou méthodes n Des sources d'événements u autres objets de classes prédéfinies : bouton, champ texte, case à cocher, chronomètre,… n Des écouteurs u objets de n'importe quelles classes pourvu qu'elles implantent une ou plusieurs interfaces spécifiques… F ActionListener, MouseListener, FocusListener,… u...ou qu'elles étendent une classe particulière F WindowAdapter, MouseAdapter,...

187 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 187 Principe n Une source d'événements possède une liste d'écouteurs dévénements. u Plusieurs techniques permettent d'ajouter des objets écouteurs à la liste d'une source: F méthodes ( addActionListener, addMouseListener,…) F passage de paramètres à la création de l'objet source n Lorsque la source détecte un événement, il crée un objet événement particulier et envoie un message à ses écouteurs avec cet objet événement comme paramètre. u ActionEvent, MouseEvent, FocusEvent,… n L'écouteur (dont la classe implante des interfaces et/ou étend une classe) exécute la méthode concernée. u interface implantée ActionListener + événement ActionEvent méthode actionPerformed

188 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 188 Hiérarchies n D'événements u AWTEvent F ActionEvent F MouseEvent F... n De classes graphiques u Frame F JFrame F … n Pas toujours simple de s'y retrouver !

189 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 189 Exemple n Une boîte de dialogue se compose d'un champ texte précédé d'une étiquette (label) destiné à contenir un nombre entier et d'un bouton dont la pression doit permettre de vérifier si le nombre est un multiple de 7 ou non. n Le résultat est affiché sous forme d'une étiquette. n La source: u le bouton n L'événement u une pression de ce bouton n L'écouteur u un objet d'une classe à créer n Comme il faut créer une boîte de dialogue, il est commode de faire de cette boîte, l'objet écouteur.

190 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 190 Plusieurs versions n Une boîte de dialogue pour détecter les multiples de 7 u version 1 F pas de contrôle de fermeture de la fenêtre F pas de test sur le format des nombres u version 2 F contrôle de fermeture de la fenêtre u version 3 F modification du contrôle de fermeture (classe anonyme) F test sur le format des nombres u version 4 (suppression du bouton) F autres types d'événements validation ou perte de focus u version 5 F mise à jour automatique

191 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 191 Les classes utiles n JFrame u symbolise un cadre à l'écran (avec barre de titre) u un cadre ne peut être rempli directement n Container u symbolise un conteneur de divers éléments graphiques n FlowLayout u symbolise un gestionnaire de mise en page F le plus simple: les éléments se suivent n JTextField, JButton, JLabel u champ texte, bouton et étiquette Voir classes, héritages, constructeurs et méthodes

192 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 192 Concrètement n Création d'une classe BoiteMultiple qui implante ActionListener u la boîte de dialogue sera l'écouteur F possibilité de faire autrement u le constructeur de cette classe construit aussi l'interface graphique F il ne suffit pas de créer les éléments de la boîte, il faut les ajouter au conteneur F la boîte ne s'affiche pas sans une instruction pour la rendre visible à placer dans le constructeur ou dans la classe application u obligation d'implanter la méthode actionPerformed F examiner par quel élément l'événement a été produit et, le cas échéant, effectuer le traitement nécessaire

193 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 193 import java.awt.*;// Container, FlowLayout import java.awt.event.*;// ActionEvent import javax.swing.*;// JFrame, JButton, JTextField, JLabel public class AppGUI{ public static void main(String [] args){ BoiteMultiple bm = new BoiteMultiple(); bm.setVisible(true); } class BoiteMultiple extends JFrame implements ActionListener { JButton b; JTextField jt; JLabel lm; // Construction de la boîte de dialogue public BoiteMultiple(){ // Paramétrage de la fenêtre setTitle("Multiple de 7?"); setSize(450,80); setLocation(300,300); // Obtention d'une référence vers le conteneur Container c = getContentPane();

194 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 194 // Création d'un gestionnaire de mise en page pour le conteneur FlowLayout fl = new FlowLayout(); c.setLayout(fl); // Création des composants de la fenêtre JLabel ln = new JLabel("Nombre à examiner:"); jt = new JTextField(8); b = new JButton("Vérifier"); lm = new JLabel("Multiple de 7: "); // Ajout des composants au conteneur c.add(ln); c.add(jt); c.add(b); c.add(lm); // Ajout de l'objet courant à la liste des écouteurs du bouton b.addActionListener(this); } // Implantation de la méthode d'écoute public void actionPerformed(ActionEvent ae){ if (ae.getSource()==b){ int n = Integer.parseInt(jt.getText()); if (n % 7 == 0) lm.setText("Multiple de 7: " + "oui"); else lm.setText("Multiple de 7: " + "non"); }

195 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 195 Variante n Autre écouteur... u créer une classe EcouteBouton u y déplacer la méthode actionPerformed u créer un objet de ce type dans la classe application et le passer en paramètre au constructeur qui l'ajoutera dans la liste des écouteurs du bouton

196 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 196 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AppGUI2{ public static void main(String [] args){ BoiteMultiple bm = new BoiteMultiple(); bm.setVisible(true); EcouteFenetre ef = new EcouteFenetre(); bm.addWindowListener(ef); } class BoiteMultiple extends JFrame implements ActionListener { JButton b; JTextField jt; JLabel lm; // Construction de la boîte de dialogue public BoiteMultiple(){ // Paramétrage de la fenêtre setTitle("Multiple de 7?"); setSize(450,80); setLocation(300,300); // Obtention d'une référence vers le conteneur Container c = getContentPane();

197 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 197 // Création d'un gestionnaire de mise en page pour le conteneur FlowLayout fl = new FlowLayout(); c.setLayout(fl); // Création des composants de la fenêtre JLabel ln = new JLabel("Nombre à examiner:"); jt = new JTextField(8); b = new JButton("Vérifier"); lm = new JLabel("Multiple de 7: "); // Ajout des composants au conteneur c.add(ln); c.add(jt); c.add(b); c.add(lm); // Ajout de l'objet courant à la liste des écouteurs du bouton b.addActionListener(this); } // Implantation de la méthode d'écoute public void actionPerformed(ActionEvent ae){ if (ae.getSource()==b){ int n = Integer.parseInt(jt.getText()); if (n % 7 == 0) lm.setText("Multiple de 7: " + "oui"); else lm.setText("Multiple de 7: " + "non"); } class EcouteFenetre extends WindowAdapter { public void windowClosing(WindowEvent we){ System.exit(0); }

198 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 198 Autres variantes n Terminer proprement l'application u détecter l'événement de fermeture de la boîte dialogue u créer une classe qui étend WindowAdapter et donc implante la méthode windowClosing n Utiliser une classe anonyme pour ne pas multiplier inutilement le nombre de classes n Contrôler la saisie n Valider de plusieurs manières n Feed-back immédiat

199 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 199 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AppGUI3{ public static void main(String [] args){ BoiteMultiple bm = new BoiteMultiple(); bm.setVisible(true); bm.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent we){ System.exit(0); } ); } class BoiteMultiple extends JFrame implements ActionListener { JButton b; JTextField jt; JLabel lm; // Construction de la boîte de dialogue public BoiteMultiple(){ // Paramétrage de la fenêtre setTitle("Multiple de 7?"); setSize(450,80); setLocation(300,300); // Obtention d'une référence vers le conteneur Container c = getContentPane();

200 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 200 // Création d'un gestionnaire de mise en page pour le conteneur FlowLayout fl = new FlowLayout(); c.setLayout(fl); // Création des composants de la fenêtre JLabel ln = new JLabel("Nombre à examiner:"); jt = new JTextField(8); b = new JButton("Vérifier"); lm = new JLabel("Multiple de 7: "); // Ajout des composants au conteneur c.add(ln); c.add(jt); c.add(b); c.add(lm); // Ajout de l'objet courant à la liste des écouteurs du bouton b.addActionListener(this); } // Implantation de la méthode d'écoute public void actionPerformed(ActionEvent ae){ if (ae.getSource()==b){ try{ int n = Integer.parseInt(jt.getText()); if (n % 7 == 0) lm.setText("Multiple de 7: " + "oui"); else lm.setText("Multiple de 7: " + "non"); } catch(NumberFormatException nfe){ jt.setText(""); lm.setText("Multiple de 7: "); }

201 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 201 class BoiteMultiple extends JFrame implements ActionListener, FocusListener { JTextField jt; JLabel lm; // Construction de la boîte de dialogue public BoiteMultiple(){ // Paramétrage de la fenêtre setTitle("Multiple de 7?"); setSize(450,80); setLocation(300,300); // Obtention d'une référence vers le conteneur Container c = getContentPane(); // Création d'un gestionnaire de mise en page pour le conteneur FlowLayout fl = new FlowLayout(); c.setLayout(fl); // Création des composants de la fenêtre JLabel ln = new JLabel("Nombre à examiner:"); jt = new JTextField(8); lm = new JLabel(""); // Ajout des composants au conteneur c.add(new JButton("OK")); // Bouton inutile, pour tester la perte de focus c.add(ln); c.add(jt); c.add(lm); // Ajout de l'objet courant à la liste des écouteurs du champ texte jt.addActionListener(this); jt.addFocusListener(this); }

202 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 202 // Implantation des méthodes d'écoute // Pour l'interface ActionListener public void actionPerformed(ActionEvent ae){ mettreAJour(); } // Pour l'interface FocusListener public void focusGained(FocusEvent fe){} public void focusLost(FocusEvent fe){ mettreAJour(); } // Méthode de mise à jour (économie d'échelle) public void mettreAJour(){ try{ int n = Integer.parseInt(jt.getText()); if (n % 7 == 0) lm.setText("Multiple de 7"); else lm.setText(« Non multiple de 7"); } catch(NumberFormatException nfe){ jt.setText(""); lm.setText(""); }

203 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 203 class BoiteMultiple extends JFrame implements DocumentListener { JTextField jt; JLabel lm; // Construction de la boîte de dialogue public BoiteMultiple(){ // Paramétrage de la fenêtre setTitle("Multiple de 7?"); setSize(450,80); setLocation(300,300); // Obtention d'une référence vers le conteneur Container c = getContentPane(); // Création d'un gestionnaire de mise en page pour le conteneur FlowLayout fl = new FlowLayout(); c.setLayout(fl); // Création des composants de la fenêtre JLabel ln = new JLabel("Nombre à examiner:"); jt = new JTextField(8); lm = new JLabel(""); // Ajout des composants au conteneur c.add(ln); c.add(jt); c.add(lm); // Ajout de l'objet courant à la liste des écouteurs du "document" associé jt.getDocument().addDocumentListener(this); }

204 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 204 // Implantation des méthodes d'écoute // Pour l'interface DocumentListener public void insertUpdate(DocumentEvent de){ mettreAJour(); } public void changedUpdate(DocumentEvent de){ } public void removeUpdate(DocumentEvent de){ mettreAJour(); } // Méthode de mise à jour (économie d'échelle) public void mettreAJour(){ String s=jt.getText(); try{ int n=Integer.parseInt(s); if (n % 7 == 0){ lm.setText("Multiple de 7"); } else{ lm.setText("Non multiple de 7"); } catch(NumberFormatException nfe){ jt.setText(""); lm.setText(""); }

205 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 205 Traitement des exceptions n Java (comme d'autres langages avant lui) prévoit un système intéressant de traitement des erreurs u toute erreur génère une exception u les classes d'exceptions sont hiérarchisées u il existe des exceptions vérifiées (peu)… F problème d'IO, par exemple F le compilateur oblige le programmeur à prévoir leur traitement (fin correcte du programme, par exemple) u... et des exceptions non vérifiées F que le programmeur est libre ou non de prendre en compte F division par zéro, type incorrect,… u le programmeur peut aussi construire ses propres exceptions (throws) u une structure sympathique: try… catch F try pour le bloc sensible F catch pour le traitement à effectuer

206 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 206 Applets: les bases n En Java u Applications F méthode main u Applets F méthode init F la classe est fournie au navigateur, par le biais dun document HTML, qui se charge de la faire exécuter

207 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 207 Constructeur et méthode init n Méthode init : exécutée au lancement de lapplet u Voir aussi start, stop et destroy n Applet est une classe u Existence de constructeur n Préférence accordée à la méthode init n Une applet est un conteneur n Transformation possible dune application graphique en applet

208 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 208 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class AppletBoutons extends JApplet implements ActionListener{ private JPanel panneau, panneauCommande; private JButton b1, b2; public void init(){ panneau=new JPanel(); panneauCommande=new JPanel(); Container c=getContentPane(); c.add(panneau); c.add(panneauCommande,"South"); b1=new JButton("green"); b2=new JButton("red"); b1.addActionListener(this); b2.addActionListener(this); panneauCommande.add(b1); panneauCommande.add(b2); panneau.setVisible(true); } public void actionPerformed(ActionEvent ae){ if (ae.getSource()==b1){ panneau.setBackground(Color.green); } else{ panneau.setBackground(Color.red); }

209 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 209 Chrono version graphique n Un exercice récapitulatif sur le modèle des événements n Des améliorations par rapport à la version en ligne de commande u mise à jour du chronomètre toutes les secondes u possibilité darrêter, de relancer, de mettre à zéro n Voir code

210 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 210 Transformation en applet n La classe Chronometre doit hériter de Japplet et plus de JFrame. n Classe unique u à lécoute de tous les événements F qui doit donc implémenter Actionlistener F nécessité de travailler avec la méthode getSource pour distinguer les traitements F disparition des classes ChangeChrono et AfficheurDeTemps n La classe AppLayout doit disparaître. n Voir code et démo

211 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 211 Interfaces Java entre écrans et programme n Écran graphique simple pour gérer le fonctionnement d'un compteur u un bouton permet de réaliser l'incrémentation et l'affichage de la valeur s'effectue dans un champ texte n Doit fonctionner aussi, à terme, pour des compteurs plus spécifiques ou pour des classes dobjets qui ont au moins les fonctionnalités de base de ceux-ci. n Une version classique suivie par des versions avec interface qui montre que les écrans et leur gestion peuvent être réutilisés sans toucher à rien

212 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 212 Première version: solution classique n Classe Compteur u trois méthodes qui n'appellent pas de commentaires n Classe EcranCompteur u un constructeur F qui associe un compteur à l'écran construit u une méthode pour traiter l'événement n Classe pour être à lécoute de la fenêtre u gérer sa fermeture n Voir code

213 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 213 Variantes n Classe anonyme pour le contrôle de la fermeture de la fenêtre (2) n Utilisation d'une interface (3) u un objet écran n'a besoin que d'un objet supportant cette interface, peu importe son type u il ne faut pas réécrire la classe EcranCompteur pour qu'elle soit utilisable avec des objets d'autres classes que Compteur, pourvu que ces classes possèdent une description des méthodes de l'interface n Spécialisation par héritage de la classe Compteur (4) n Utilisation de l'interface avec une autre classe d'objets (5)

214 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 214 Les packages n Une organisation plus logique des classes et des interfaces. u Ex: des classes représentant des écrans de l'IHM seront regroupées dans un même package n Cette organisation est au service du programmeur qui est censé retrouver ces classes et ces interfaces plus aisément grâce à elle. n L'organisation des packages n'est en rien liée à l'héritage. u une classe d'un package peut hériter d'une classe se trouvant dans un autre package u voir documentation des classes prédéfinies

215 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 215 Nommage des classes et des packages n Lors de la description d'une classe, on utilise un nom court. class Point{... n Toute classe appartient à un package. u déclaration en début de fichier package be.ac.fundp.det.eva.ecrans n Le nom complet d'une classe est constitué du nom de son package suivi de son nom court. be.ac.fundp.det.eva.ecrans.Point n Il existe un package par défaut (sans nom) lié à la machine virtuelle. u permet d'éviter des instructions d'importation au début du développement

216 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 216 Identification des classes n Le compilateur utilise les noms complets. u soit que le programmeur les mentionne eva.ecrans.Point = new eva.ecrans.Point(); F plutôt contraignant mais parfois utile pour éviter une confusion classes portant les mêmes noms (cfr Date, Timer,…) u soit qu'il peut les reconstituer F importation d'un package complet import eva.ecrans.*; F importation d'une seule classe import eva.ecrans.Point F possibilité de créer une arborescence de packages package eva.ecrans package eva.ecrans.saisie F attention, pour importer ces 2 packages, il faut 2 instructions import eva.ecrans.*; import eva.ecrans.saisie.*;

217 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 217 Lien entre packages et file system n Le classpath est déterminant. u le classpath est c:\jdk1.3.1_02\exemples\classes u la classe Point3 doit être enregistrée dans un sous-dossier eva\geometrie construit à partir du classpath F c:\jdk1.3.1_02\exemples\classes\eva\geometrie import eva.geometrie.Point3; public class AppPackage{ public static void main(String [] args){ Point3 p = new Point3(3,7); System.out.println("Coordonnée de p: " + p); } n la classe AppPackage se trouve dans le package par défaut u elle est donc recherchée à partir du classpath

218 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 218 Classes "système" n Les packages tels java.lang, java.util et autres packages de classes prédéfinies se cachent dans des fichiers compressés u i18n.jar et rt.jar n Ces fichiers se trouvant dans des dossiers installés avec Java u en ce qui nous concerne, c'est le dossier c:\jdk1.3.1_02\jre\lib\ n Lorsque le programmeur le souhaite, il peut aussi archiver ses fichiers u utilitaire jar n Une référence intéressante: u

219 Passer à la première page Programmer avec des objets © CeFIS 2004 Page 219 Garbage Collector n Ou collecteur d'ordures, ou éboueur ou ramasse-miettes… n Les objets sont créés par l'instruction new(…) n Dès qu'ils cessent d'être référencés, les objets sont susceptibles d'êtres détruits u ils ne le sont pas nécessairement immédiatement car cela dépend des ressources disponibles en mémoire u le garbage collector est une tâche de la plus basse priorité u si des ressources sont mobilisées (un fichier, par exemple), il est bon que le code provoque la libération de ces ressources, ce qui est possible par l'utilisation de la méthode finalize (héritée de la classe Object )


Télécharger ppt "Passer à la première page Programmer avec des objets Etienne Vandeput Namur 2002 – 2003 - 2004"

Présentations similaires


Annonces Google