2.1k likes | 2.33k Vues
Programmation Objet et JAVA. Phelma 2013. 1. Organisation du cours. 11 séances de CM/TD/TP Les chapitres essentiels Java, la notion d’Objet et de Classes L’héritage et le polymorphisme Les collections, Les exceptions, les fichiers Les interfaces graphiques en Swing 7 sujets de TD/TP
E N D
Programmation Objet et JAVA Phelma 2013 1
Organisation du cours • 11 séances de CM/TD/TP Les chapitres essentiels • Java, la notion d’Objet et de Classes • L’héritage et le polymorphisme • Les collections, Les exceptions, les fichiers • Les interfaces graphiques en Swing • 7 sujets de TD/TP • Sujets donnés à l’avance • 1 examen écrit de 2h • Documents : • Site : http://tdinfo.phelma.grenoble-inp.fr/2APOO/ • Le poly • Les sujets de TD • Site indispensable : • http://java.sun.com/j2se/1.5.0/docs • http://java.sun.com/javase/6/docs/api 2
Caractéristiques • Objet : • Inspiré du C++, Objective C et Smalltalk : Java fortement objet. • Simple • Suppression des sources d’erreurs classiques : pas de pointeurs, pas de gestion mémoire par le programmeur • Robuste • Nombreuses vérifications sont faites à la compilation (protection des classes,…) • Sécurisé à la conception du langage • Les notions de sécurité réseau sont incluses (SecurityManager), en particulier pour les applets • Compact • Java a été conçu pour fonctionner dans un environnement évolutif. • L'interpréteur Java n'a besoin que de 215Ko. • Chargement dynamique des classes
Introduction : caractéristiques Pas de Fichier Executable Dépendant du processeur et de l ’OS Dépend de la Réalisation de la machine virtuelle • Langage Interprété • Traduit et exécuté à chaque chargement • Développement plus simple • Temps d’exécution plus long Fichier *.java Indépendant du processeur et de l ’OS dépend de la définition de la machine virtuelle Fichier *.class Indépendant du processeur et de l ’OS dépend de la définition de la machine virtuelle
Introduction : caractéristiques • Indépendant de l'architecture : Portable • Conçu pour cela (machine virtuelle) • Ensemble complet d’exécution : machine à pile 32 bits • Jeu d’instructions précis • Des registres • Une pile • Interprète du byte_code : intermédiaire entre compilation et interprétation • Seule, la JVM change entre MAC, PC, Windows, Unix…. • Les types de base ont des tailles fixes • Multithread • Gestion de plusieurs tâches prévue • Réseau • Ensemble de classes pour utiliser des protocoles TCP/IP tels que HTTP et FTP • Gestion des langues • Deux types de programmation différents • Applications • Programmes écrits en Java • Exécuté sur une machine qui possède un interpréteur java. Ce programme pourra se lancer indifféremment sous n'importe quelle machine/OS. • Applets
Introduction : Applets Serveur www distant • Applets : intégration de java au www • Programmes écrits en Java, installés généralement sur un serveur Web • L'applet est téléchargée depuis le serveur Web sur le poste client • Exécutés sur le poste Client par la JVM du navigateur à la demande de celui-ci • Testés grâce à appletviewer 2 chargement applet (.class) 1 : demande Poste client netscape, IE, ... 3 execution
Java versus C • JAVA est portable sans recompilation sur toutes les plates formes (processeur/OS) • PC, Mac, • PDA, telephone, etc… • Même syntaxe, même structure de contrôle que C et C++ • Principales différences • Pas de variables globales • Pas de préprocesseur #define, #include #ifdef • Pas de pointeurs • Le main est une fonction interne à une classe • C++ : Pas de surcharge des opérateurs • C++ : Pas d'héritage multiple • Nombreuses bibliothèques standard • Réseau,Système, thread • Graphisme, Interface utilisateur, Multimédia • E/S, chaînes et expressions régulières` • RMI : applications réparties sur plusieurs machines • Securité, cryptographie • Base de données, xml 8
Types de base • Langage fortement typé comme C++ • huit types de base Type Taille Valeur int 4 bytes -2147483648 à + 2147483647 ( 231) short 2 bytes -32768 à +32767 long 8 bytes 263 byte 1 byte -128 à +127 float 4 bytes +/- ( 1,4.10 - 45 à 3.4 10 + 38 ) double 8 bytes +/- ( 4,94 .10 -324 à 1,79 . 10 + 308 ) char 2 bytes 65536 caractères (internationaux) boolean true or false • Valeurs extrémales par Type.MAX_VALUE, type.MIN_VALUE • char c = Byte.MAX_VALUE 9
POO et UML Notions de base 10
Concept de classe : le point 2D • Problème posé • Définir les outils nécessaires pour un logiciel de géométrie tel que cabri ou pour un logiciel de dessin • Exemple : définir la symétrie centrale et les translations et homothéties sur des points dans le plan cartésien • Qu’est ce qu’un point du plan • Définition statique : ce sont les champs ou attributs • Une entité comportant 2 coordonnées • abscisse • ordonnée • Que doit on pouvoir faire avec : ce sont les méthodes • Entrées/sorties • Le créer : mettre des valeurs dans les coordonnées • L’afficher : ecrire les valeurs à l’écran • L’utiliser pour résoudre un problème • Translation d’un vecteur donné • Homothétie par un facteur k • Trouver le symétrique d’un point 11
Le point 2D en procédural ou en objet class point Structure point avec champs x et y Attributs x et y Méthodes void affiche () void translate(double,double) point homothetie(double) point symetriecentrale() Fonctions void affiche (point) void translate(point*, double,double) point homothetie(point, double) point symetriecentrale(point) • En POO, on regroupe champs et fonctions au sein de la classe • il existe un lien physique entre attributs, méthodes et objets • On ne peut pas utiliser affiche sur un int • En C, pas de liens entre les fonctions et les structures de données qu’elles manipulent • Exemple : on peut utiliser affiche sur un entier par erreur 12
En C, le point 2D et ses fonctions Point : 2 coordonnées typedef struct Point { /* Definition des champs d'un point */ double x; double y; } POINT; /* definition des fonctions sur un point */ /* Comment afficher un point */ void affiche(POINT a) {printf("x:%lf y:%lf\n",a.x,a.y);} /* Comment translater un point */ void translate(POINT* ax, double a, double b) { ax->x += a; ax->y += b; } /* constante x point ==> point */ POINT multcste(POINT a, double k) { POINT res; res.x = k*a.x; res.y = k*a.y; return res; } /* Symetrie centrale d’un point : ==> point */ POINT symetriecentrale(POINT a) {POINT res; res.x = -a.x; res.y = -a.y; return res; } } Quelles sont les actions réalisables sur un point ? 13
En C, le point 2D et ses fonctions void main() { int i; POINT p1, p2, p3; printf("Premier exemple"); p1.x=2; p1.y=8; affiche(p1); translate( &p1, 1,-6); // Attention aux pointeurs !!! affiche(p1); p2 = multcste(p1, 10.0); affiche(p2); p3=symetriecentrale(p1); affiche(p3); affiche(i); // Rien n’empeche cela : il n’y a aucun lien entre affiche et la structure POINT } 14
Exemple de classe : le point 2D Point : 2 coordonnées public class Point { /* Definition des champs d'un point */ private double x; private double y; /* definition des methodes d'un point */ /* Constructeur : valeurs initiales d'un point */ public Point () { x = 0; y = 0; } public Point (double a, double b) { x = a; y = b; } /* Comment afficher un point */ public void affiche() { System.out.println("Abcisse "+x+" ordonnee : "+y);} /* Comment translater un point */ public void translate(double a, double b) { x += a; y += b; } /* constante x point ==> point */ public Point multcste(double k) { Point res; res = new Point(this.x, this.y); // Ou Point(x,y) res.x = k*res.x; res.y = k*res.y; return res; } /* Symetrie centrale d’un point : ==> point */ public Point symetriecentrale() { return new Point(-x,-y); } } Quelles sont les actions réalisables sur un point ? Comment initialiser un point : 2 possibilités 15
Exemple d’objet : des points particuliers 3 Points : p1 p2 p3 public class Ex1b { public static void main (String[] args){ Point p1, p2, p3; System.out.println("Premier exemple"); p1 = new Point(2,8); p1.affiche(); p1.translate(1,-6); p1.affiche(); p2 = p1.multcste(10.0); p2.affiche(); p2=null; p3=p1.symetriecentrale(); p3.affiche(); } } Creation de p1 Affichage de p1 16
POO : concepts de base • 1 programme ; 1 ensemble d’objets qui s’envoient des messages • Encapsulation : données+méthodes+sécurité • Données et méthodes dans une même entité : la classe • données : les informations propres à un objet, • méthodes : les actions réalisables sur/avec cet objet • Objet : instance d'une classe • Sécurité : Cloisonne l’intérieur et l’extérieur de l’objet • privé : inaccessible de l'extérieur de la classe ou de l’objet • public : ce qui l'extérieur à le droit d'utiliser • Réutiliser • sans connaître le fonctionnement interne • Sans risquer de modifier ce qui est fait • Héritage • Graphe de parenté entre des Classes • Héritage des méthodes et données qui ne sont pas à redéfinir • Ajouter des nouvelles fonctionnalités à ce qui existe déjà • Isole les éléments nouveaux pour la sécurité du code existant • Polymorphisme : une même méthode prend plusieurs formes • Une méthode est typée par ses paramètres. Le même nom est utilisable par plusieurs classes ou type de données • Quand on utilise une classe donnée, elle sait quelle est la bonne fonction à utiliser pas de test de type en POO. 17
Conception, Modèles et Diagrammes en POO • UML : Unified Modeling Langage • Langage graphique de modélisation de projet informatique orienté objet : • Définition des classes/attributs et des méthodes (modèle statique) • Définition des aspects dynamiques et temporels (modèle dynamique). • Le modèle statique permet • de structurer les besoins de l’utilisateur du logiciel : diagramme use-cases • de structurer les attributs et les méthodes en les répartissant dans des classes, reliées entre elles par des liaisons de trois types : héritage, agrégation, relation : diagrammes d’objets, de classes, • De structurer l’application en terme de modules (diagramme de composants) et de matériel utilisé (diagramme de déploiement) • Le modèle dynamique décrit le comportement dynamique et temporel du système : • Structurer les interactions entre objets (diagramme de collaboration) et leur séquencement temporel, ie ordre d'exécution des méthodes (diagramme de séquence) • Spécifier les séquences d’etats possibles des objets (automates) : diagramme d’etat-transition 18
Diagramme de classe : UML • Une classe Nom de la classe Attributs ou champs + : public # : protégé - : private méthodes 19
Questions • Faire le diagramme de classe d’un complexe • Quels sont ses attributs ? • Donnez les prototypes de 4 méthodes utiles 20
Notion d’objet Les classes et les objets 21
Les classes en JAVA • Une classe permet de définir des modèles ayant une certaine autonomie • La classe définit la structure des objets • Les champs • les méthodes utilisables par un objet de ce type, i.e. les actions qu’un objet de ce type peut réaliser • Syntaxe [public] class Nom_de_ma_classe { // déclaration des champs; [public, private] type nom_champ; //déclaration de methodes; [public, private] type_retour nom_de_fonction(type nom_parametre, …) } • En java, pas de rédéfinition des opérateurs à l’inverse du C++ • En pratique, le nom d’une classe commence par une majuscule • Le nom du fichier est celui de la classe contenant la fonction main ou celui de la classe public 22
Les objets et les variables en JAVA • Un objet = un exemple ou une entité dont le modèle (type) est une classe • On dit aussi une instance de classe. • La variable est une référence (pointeur constant) sur cet objet • En Java, 3 étapes • Définition de la variable : Point p1; • Sa durée de vie est celle du bloc • Création et allocation de l’objet : p1= new Point(2,8); • Sa durée de vie est celle de son utilisation • Elle est détruite AUTOMATIQUEMENT par le garbage collector, quand elle est devenue inutile • Utilisation du point p1 : • par exemple, appliquer affiche() à p1 : p1.affiche() • ou changer la valeur de l’abscisse : p1.x=10; • Donc • En java, une variable est une référence, i.e. un pointeur "masqué" • Le passage d’un objet comme paramètre d’une fonction permet de modifier cet objet : pas besoin de passage de l’adresse • Pas de pointeur, de gestion mémoire par le programmeur 23
22 2 88 8 20 80 Concept d'objet : exemple public class Ex1c { public static void main (String[] args){ System.out.println("Premier exemple"); Point p1=null, p2=null; // Définition p1, p2 p1 = new Point(); // Creation p1 p1.x=2; p1.y=8; // On change p1 p1.affiche(); p1 p1 p2 = new Point(20,80); ` p2.affiche(); p1 p2 p1.x = p1.x + 20; p1.y += 80; p1.affiche(); p1 p2=null; // l’objet pointé par p2 est libre } // les variables p2 et p1 sont détruites } p1.affiche() p2.affiche() p1.affiche() 24
Notion d’objet Les attributs et les méthodes 25
Accès aux membres • Accès aux membres d’un objet : objet.champ • Attention, objet est une référence • Exemple : a.x est l’abscisse du point a. • Appeler/exécuter une méthode : objetappelant.methode(param); • Cela signifie que l’on exécute methode(parametres) « SUR » objetappelant • Les méthodes s’exécutent sur un objet • p.affiche() signifie • On cherche la classe de p : c’est la classe Point • On cherche si une méthode affiche() existe dans la classe Point : • si elle n’existe pas, erreur de compilation « Cannot find Symbol » • On exécute cette fonction avec un paramètre supplémentaire invisible :this, qui est l’objet sur lequel on travaille = objet appelant. Ici, this = p public void translate(double a, double b) { x = x + a; y = y + b; } Si on appelle translate avec le point p sous la forme p.translate(2,3), p.x et p.y qui sont incrémentés de 2 et 3 • Comment écrire public void translate(double x, double y) 26
Paramètre this • Dans une méthode, il y a toujours un paramètre « implicite » this, qui est l’objet sur lequel on travaille • p.translate(1,2) ==> this est une référence sur p • Donc public void translate(double a, double y) { ATTENTION !!!!! x = x + a; y = y + y; } // Quand on écrit y, est ce le paramètre de la fonction ou l’attribut de p ? public void translate(double a, double y) { x = x + a; this.y = this.y + y; } 27
Notion d’objet Sécurité 28
Accès et protection • Principe de la POO : L’objet est responsable de son état • les membres (attributs ou méthodes) peuvent etre protégés en lecture/écriture des autres fonctions ou objets du programme. • Public • Les membres public sont accessibles pour toutes les méthodes et fonctions du programme • On peut lire et ecrire les champs à n’importe quel endroit dans le code • On peut executer une méthode dans n’importe quelle lméthode • Private • Un membre private n’est accessible que par les méthodes de sa classe ou de son package • Une méthode private peut être exécutée par une autre méthode de la classe, mais pas par celles des autres classes. • Un champ private n’est accessible que par une méthode de la classe. • En particulier, main() est une fonction qui n’appartient pas à la classe Point : elle ne peut pas accéder aux champs x et y d’un objet de la classe Point 29
Accès aux membres et aux méthodes (2) Lecture de 2 nombres au clavier, creation d’un point … Ex6.java import java.util.*; public class Ex6 { public static void main (String []arg) {double x1, x2; Point a,b,c ; Scanner clavier = new Scanner(System.in); System.out.println("Entrer 2 reels "); x1=clavier.nextDouble(); // Lecture d’un reel x2=clavier.nextDouble(); // 3,14567 :virgule a= new Point(x1,x2); // Création du point avec x1 et x2 a.affiche(); // On execute affiche sur a; ici, this = a b = new Point(3,8); b.affiche(); // On execute affiche sur a; ici, this = b b.x=x1; // Interdit car x est privé b.translate(2,6); b.affiche(); a.translate(b); a.affiche(); c = a.multcst(2.); c.affiche(); } } 30
Accès et protection Exemple :Fichier Ex7.java class Point { private double x,y;…… // x et y ne peuvent être lus/modifiés que par des méthodes de la classe private void interdit() {x=0; System.out.println("Appel interdit hors classe"); } // interdit() ne peut être appelée que par des méthodes de la classe public void autorise() {this.interdit(); } // OK car autorise() est dans la classe // autorise() peut être appelée par des méthodes d’autres classes }; public class Ex7 { public static void main (String []arg) { Point a,b ; a= new Point(1,2); a.affiche(); b= new Point(); b.affiche(); a.x=5; // Interdit car x est private b.interdit(); // Interdit car interdit() est private b.autorise(); // Autorise car autorise() est public } } 31
Accès et protection : pourquoi ? class Fraction{ public double numerateur, denominateur; // Constructeur : jamais de denominateur nul public Fraction(double a, double b) { if (b==0) { System.out.println("Denominateur nul"); System.out.exit(1); } else {set=a; denominateur=b; } } Fraction produit(Fraction q) { // Attention si q.denominateur est nul, rien n’est verifié ici numerateur *= q. numerateur; denominateur *= q. denominateur; } public String toString() { return numerateur + "/" + denominateur; } }; public class Ex7c { public static void main (String []arg) { Fraction a = new Fraction(1,2); Fraction b = new Fraction(3,4); System.out.println("b vaut " + b); b.produit(a); System.out.println("b vaut " + b); a.denominateur=0; // C’est contraire au fonctionnement de la classe, mais comme denominateur n’est pas privé, c’est syntaxiquement correct. b.produit(a); System.out.println("b vaut " + b); } } 32
Mutateurs/Accesseurs Accesseurs et mutateurs • Le concepteur de la classe se pose la question : • Qu’est ce qui est utile aux autres classes et fonctions de ma classe, i.e. le monde extérieur • Ce qui est utile est public, le reste, utile au fonctionnement interne de l’objet est private. • De cette manière, « l’extérieur » ne peut modifier le comportement interne et voulu par le concepteur : c’est l’encapsulation • En pratique, • les champs sont souvent privés • Si besoin, autoriser la lecture du champ par un accesseurgetchamp() que vous devez définir • Parfois, autoriser la modification du champ par un mutateursetchamp() que vous devez définir • Les mutateurs/accesseurs peuvent etre public ou privé • Toujours initialiser les champs grâce aux constructeurs • C’est le concepteur qui décide et non l’utilisateur de l’accès possible • Classe Fraction • Attributs • num et denum • Méthodes internes à la classe void init(double,double) • Méthodes autorisées à l’extérieur • main() { • } 33
Accesseurs et mutateurs class Fraction{ //Attributs privés private double numerateur, denominateur; // Accesseurs et Mutateurs: public double getnumerateur(){ return numerateur; } public double getdenominateur() { return denominateur; } public void setnumerateur(double a) {numerateur=a; } // Avec ce mutateur, on est sur que jamais une fraction ne sera infinie public void setdenominateur(double a) { if (b==0) {System.out.println("Denominateur nul"); System.exit(1); } else denominateur=a; } // Methode interne à la classe, inutile pour les autres classes private void init(double a, double b){setnumerateur(a); setdenominateur(b); } // Constructeurs : on utilise la méthode privée public Fraction(double a, double b) { init(a,b); } public Fraction(Fraction q) { init(q.a,q.b); } // Meme la methode produit peut utiliser les mutateurs, avec verification automatique du denominateur. public void produit(Fraction q) { setnumerateur(numerateur*q. numerateur); setdenominateur(denominateur*q. denominateur); } }; 34
Accesseurs et mutateurs public class Ex7c { public static void main (String []arg) { Fraction a = new Fraction(1,2); Fraction b = new Fraction(a); System.out.println("b vaut " + b); b.produit(a); System.out.println("b vaut " + b); a.setdenominateur(0); // C’est contraire au fonctionnement de la classe, qui refuse les fractions infinies, et le programme va quitter à cet endroit. b.produit(a); System.out.println("b vaut " + b); } } 35
Notion d’objet Initialisation, construction, destruction 36
Constructeur • Constructeur : méthode appelée automatiquement à la création d'un objet • Rôle • Initialise les différentes parties de l'objet : on connaît toujours l’état initial • Réalise les actions indispensable à l'état initial de l'objet • Plusieurs manières d'initialiser un objet Surcharge possible i.e. plusieurs constructeurs de même nom • Construire un point à partir de 2 réels • Construire un point à partir de rien • Construire un point à partir d’un autre point • Syntaxe • Fonction de même nom que la classe, comme en C++ • Attention • Par défaut, java ajoute un constructeur sans paramètres • Quand on définit un constructeur, on ne peut plus construire des points sans utiliser un de ceux ci 37
Constructeur class Point { private double x; private double y; /* Constructeur : quelles sont les valeurs initiales d'un point */ public Point (double a, double b) {System.out.println("C1"); x = a; y = b;} public Point () { System.out.println("Constructeur 2"); x = 0; y = 0; } public Point (Point a) { System.out.println("Cons 3"); x = a.x; y = a.y; } }; public class Ex4 { public static void main (String []arg) { Point a ; System.out.println("Creation de a"); a= new Point(1,2); // Création du point 1,2, constructeur 1 System.out.println("Fin xreation de a"); System.out.println("Creation de b"); Point b = new Point(); // Création du point 0,0 constructeur 2 System.out.println("Fin creation de b"); System.out.println("Creation de c"); Point c = new Point(b); // Création de C à partir de b; System.out.println("Fin creation de c"); } } 38
Destructeur • Fonction appelée automatiquement lors de la destruction des objets • Prototype : protected void finalize() • En C++, ~nom_de_la_classe() • En java, très peu utilisé car vous ne gérez pas la libération de la mémoire : c’est automatique, grâce au ramasse miette • GC ou ramasse miette : • Récupère automatiquement la mémoire des objets devenus inutiles et appelle la méthode finalize • On ne sait pas quand il est appelé : on ne sait donc pas quand est utilisé le destructeur • Objets inutiles : • objets réels alloués qui ne sont plus utilisés • Difficile à trouver ==> quand un objet est inutile, pour qu’il puisse etre détruit, mettre sa référence à null • En général, • on n’appelle pas le gc() directement car il peut etre tres lent • pas de destructeur 39
Destructeur import java.util.*; class Point { …… protected void finalize() {System.out.println("Appel au Destructeur"); } }; public class Ex5 { public static void main (String []arg) {Point a ; Scanner clavier = new Scanner(System.in); System.out.println("Creation de a"); a= new Point(1,2); // Création du point 1,2, constructeur 1 System.out.println("Fin xreation de a"); a=null; clavier.nextLine(); System.gc(); // Destruction du point a System.out.println("Creation de b"); Point b = new Point(); // Création du point 0,0 constructeur 2 } On passe dans le destructeur Ligne : System.gc() 40
Notion d’objet Surcharge de méthodes 41
Surcharge ou Polymorphisme de méthodes : • Possibilité pour une fonction ou méthode d’avoir un même nom si les signatures différentes • Signature : type de retour, nombre et type des paramètres • En Java et C++, surcharge uniquement sur les paramètres • La fonction réellement exécuter est déterminée sur la base des paramètres utilisés • En java, il y a liaison dynamique décidé à l’execuion • Attention : • on ne peut pas surcharger uniquement sur le type de retour 42
Surcharge ou Polymorphisme de méthodes : class Point { private double x, y; /* Constructeur */ public Point (double a, double b) {x = a; y = b; } public Point (Point a) {x = a.x; y = a.y; } public void affiche() { System.out.println( "x:"+x+" y:"+y);} // Deux methodes de translations : A partir de 2 reels public void translate(double a, double b) { x += a; y += b; } // A partir d’un point public void translate(Point p) { x += p.x; y += p.y; } }; public class Ex5 { public static void main (String []arg) { Point a= new Point(1,2); // Création du point 1,2 Point b = new Point(10,20); Point c = new Point(b); // Création de C à partir de b; b.affiche(); b.translate(1,2); b.affiche(); c.affiche(); c.translate(a); c.affiche(); } } 43
1 1 2 2 Objets et référence ou le retour des pointeurs • p1 = new Point (2,3); • p1 est une référence sur un objet réel • C’est donc un pointeur constant public class Ex8b { public static void main (String []arg) { Point a,b,c ; a= new Point(1,2); a.affiche(); b = a; c = new Point(a); b.affiche(); c.affiche(); a.setx(8); a.affiche(); b.affiche(); c.affiche(); } } Qu’est ce que ce programme affiche 8 a c 2 b 45
22 2 88 8 20 80 Le passage d’objets en paramètres • Un objet passé en paramètre d’une méthode est passé par adresse et il peut être modifié par la fonction class Point { …. /* Cette fonction modifie son parametre meme si elle est stupide : */ void ajoutemoiap(Point p) { p.x = p.x+x; p.y += y; } public class Ex1c { public static void main (String[] args){ Point p1=null, p2=null; p1 p1 p1 = new Point(2,8); p1.affiche(); p1 p2 = new Point(20,80); ` p2.affiche(); p2 p2.ajoutemoiap(p1); // Ici p1 est modifié à cause de ajoutemoiap p1.affiche(); p1 } // les variables p2 et p1 sont détruites } p1.affiche() p2.affiche() 46 p1.affiche()
Divers 47
Les Entrées Sorties en pratique • Lire des nombres et des chaines : classe Scanner • Créer un objet de la classe scanner associé au flux de lecture voulu : le clavier • Les méthodes nextDouble(), nextInt(), nextLine() de la classe scanner permettent la lecture des réels, entiers et chaines. • Afficher : System.out.println() import java.util.*; public class Essai { public static void main (String []arg) { double x1, x2; String x; Scanner clavier = new Scanner(System.in); System.out.println("Entrer 2 reels "); x1=clavier.nextDouble(); // Lecture d’un reel x2=clavier.nextDouble(); // 3,14567 :virgule System.out.println("Voici x1 : " + x1); System.out.println("Tapez une chaine"); x=clavier.nextLine(); System.out.println("Ce que vous avez ecrit : " + x); } } 48
Méthodes existantes dans une classe • Tous les classes JAVA héritent de la classe de base Object, qui contient : • Pour l’affichage : toString() • Doit retourner une représentation textuelle de l’objet • Elle est utilisée par System.out.println • Pour les tests d’égalité : equals() • a==b ne test pas si les objets a et b sont identiques mais si a et b regarde le même objet • Il faut définir le test d’égalité avec la méthode equals • Pour recopier un objet : clone() class Point { …… public String toString() {return("abscisse:"+x+" ordonnée:"+y);} // Avec cette methode, on peut afficher point avec System.out.println(a) public boolean equals(Point b) {return( x==b.x && y==b.y); } }; public class Ex8c { public static void main (String []arg) { Point a,b,c,d; a= new Point(1,2); b = new Point(1,2); c=new Point(1,3); d=a; System.out.println(a);// Affiche a if (a==b) System.out.println("a et b pointe le meme objet"); if (a==d) System.out.println("a et d pointe le meme objet"); if (a.equals(b)) System.out.println("a et b de contenu identique"); if (a.equals(c)) System.out.println("a et c de contenu identique"); if (a.equals(d)) System.out.println("a et d de contenu identique"); } } 49
Résumé • Un programme objet : • 1 fonction main qui démarre le programme, crée les objets et les enchainements d’actions • 1 ensemble de classes décrivant les capacités des données manipulées • 1 classe : type de données qui rassemble des données (champs) et la manière de s’en servir (méthodes) • Données et méthodes protégées si besoin : • public : n’importe quelle fonction du programme peut les modifier ou les utiliser • private : seules les méthodes de la classe concernée peuvent les modifier ou les utiliser • En pratique • données privées. • Que doit faire l’utilisateur avec la classe que je développe ? ==> seules méthodes publiques • Initialisation, affichage, addition, etc.. • Autres méthodes privées • Constructeurs : comment initialiser l’objet ? • Accesseurs et mutateurs : méthodes publiques ou privées définissant l’accès en lecture/ecriture à un champ • Surcharge : plusieurs fonctions peuvent avoir le même nom, mais pas les mêmes nombres et/ou types de paramètres • 1 objet : 1 instance • Définir la variable • Créer l’objet • Destruction de l’objet automatique quand on n’en a plus besoin : pas de gestion mémoire ni pointeurs • Exécuter une méthode ou fonction : objet.méthode(parametres); • x.affiche(); ou c1.add(c2,c3); • INTERDIT : affiche(x) • Aucune fonction/méthode hors d’une classe, aucune variable hors d’une méthode • Mélanger, ajouter 3 litres de jus d’orange, 1 litre de vodka, et ca doit marcher !!! 50