JAVA TD0 Prise en main du langage Environnement de base JAVA 1
Mon premier programme public class HelloWorld { public static void main(string [] arg){ System.out.println("Hello, World!"); main(string [] arg) HelloWorld HelloWorld.java Compilateur javac HelloWorld.java HelloWorld HelloWorld.class Machine Virtuelle java HelloWorld JAVA 2
L'environnement de travail 3 fenêtres Un éditeur de texte pour écrire les sources java un shell pour compiler un shell pour exécuter les 3 fenêtres positionnées dans le même répertoire (on fera mieux dans les séances suivantes) 1 répertoire par projet /exo 1 fichier source par classe nom fichier = NomClasse.java par conséquent, 1 fichier compilé par classe Exo 1-1 : faire HelloWorld, compiler (debugger of course!), lancer JAVA 3
Objet Morceau de programme UNIFIE ayant des attributs Représentés par des valeurs données à l'objet Représentent un état de l'objet des méthodes qui permettent de manipuler ces attributs fonctions que l'objet sait faire Représentent le comportement de l'objet getnom() listecours() 180 m 80 kg "Durand" objetetudiant premièrelettreenminusculepuispremiereenmajuscule Exo 1-2 : Définir sur papier plusieurs objets cercle et différentes manières de les exprimer JAVA 4
Classe Lieu de description d'objets similaires Permet de définir le comportement des objets de cette classe signature et code des méthodes la structure de l état des objets de cette classe liste et type des attributs (mais pas leurs valeurs) PremièreLettreEnMajusculePourChaqueMot JAVA 5
Création d'un objet = instanciation Pour pouvoir manipuler un objet, on déclare une référence de type la classe de cet objet Circle c; //c est une référence qui va me permettre de manipuler un objet de la classe Circle Pour créer un objet, on instancie une classe en appliquant l'opérateur new. Une nouvelle instance de cette classe est alors allouée en mémoire : c = new Circle(); //je fabrique un objet Circle et je le référence par c Circle() est une méthode particulière appelée constructeur ; elle a exactement le même nom que la classe JAVA 6
Constructeur Tout objet doit avoir ses valeurs positionnées. Un constructeur peut permettre de fixer ces valeurs à la création de l'objet (attention les structures de données sont de toutes façons reservées en mémoire) Un constructeur est une méthode qui possède le même nom que la classe, mais qui ne renvoie rien Si le programmeur n écrit pas de constructeur, le compilateur crée un constructeur par défaut, implicite (sans paramètre et avec corps vide). Une classe peut avoir plusieurs constructeurs qui diffèrent par le nombre et la nature de leurs paramètres. JAVA 7
Classe - exemple et exo public class Circle { private double x, y, r; public void affiche(){ System.out.println("x=" + this.x + "y=" + this.y + "r=" + this.r); public double getperimeter(){ return ( Math.PI * 2 * this.r ); public double getarea(){ return ( Math.PI * this.r * this.r ); public void Circle(double x1, double y1, double r1){ this.x = x1; this.y = y1; this.r = r1; Exo 1-3 : Ecrire, compiler la classe Circle complétée comme ci-dessus. Utilisez une classe TestCircle pour les tests. Exo 1.4 : Définir plusieurs constructeurs dans Circle, compiler, tester. JAVA 8
Standard de nommage et de représentation graphique (UML) Classe PremièreLettreEnMajusculePourChaqueMot rectangle Attribut et méthode NomClasse -attun -attdeux -methun() +methdeux() premièrelettreenminusculepuispremiereenmajusculepourchaque Mot rectangles accrochés sous la classe (facultatifs) + pour public / - pour private (il existe aussi protected, mais est-ce vraiment utile?...) Objet premièrelettreenminusculepuispremiereenmajusculepourchaque Mot rectangle, référence soulignée Exo 1-8 : Représenter les classes Circle et HelloWorld en UML. referenceobjet:objet JAVA 9
Hello World version 2 La première version ne possède pas de constructeur Définir un constructeur dans la classe HelloWorld qui se charge d écrire la phrase ("Hello, World!"); Modifier la méthode écrite en version 1 pour qu elle instancie un objet de la classe HelloWorld Compiler (et deboguer of course!), lancer JAVA 10
Mon second programme Ecrire le code d une classe DivisionO comportant des méthodes permettant de diviser deux double entre eux (2 façons de faire lequelles?) Compiler (et deboguer of course!) Ecrire le code d'une classe Client, utilisant une classe DivisionO Compiler (et deboguer of course!) Lancer le programme NB : faites les 2 façons!! JAVA 11
Classe Circle V1- sans constructeur Reprendre le code de la classe Circle, MAIS RETIRER tous les constructeurs, compiler (et deboguer of course!) Ecrire une classe TestCircle qui contient une méthode public static void main(string[] arg). Cette méthode crée un objet Circle et affiche les caractéristiques de l objet créé. Compiler (et deboguer of course!), lancer Pourquoi TestCircle réussit-il à créer un objet Circle alors qu il n y a pas de constructeur? Quelles sont les valeurs des attributs x, y, r de l objet créé? JAVA 12
Classe Circle suite V2 Modifier la classe Circle en lui ajoutant les 2 constructeurs public Circle(double lx, double ly, double lr) et public Circle(Circle c). Ne pas modifier la classe de test. Compiler, tester, conclusion? V3 Ajouter le troisième constructeur de la classe Circle, compiler, tester. Modifier la classe TestCircle pour qu elle crée 3 cercles différents (un par constructeur, donner des valeurs à x, y et r différentes de 0) et affiche leurs caractéristiques. Compiler, lancer JAVA 13
JAVA 14
Machine Virtuelle : Emulateur Byte-Code/P-Code/J-Code opcode : 1 octet pour l'instruction 0,n opérandes MicroProcesseur logiciel Jeu d'instructions Registres (pc, optop, frame, vars) Pile, Heap Ramasse-miettes Espace de stockage des méthodes Tas de constantes ==> Compilé ou Interprété MV Source.java Compilateur javac Byte-Code.class Interpréteur SE Matériel JAVA 15
Compilation, exécution & cie l Ecrire une classe Test1 représentant des objets ayant un attribut interne de type entier (int) appelé val. l Compiler cette classe (le compilateur s appelle javac) l Quels sont les fichiers générés? l Lancer la commande javap -c sur la classe Test1. Que voit-on? l Exécuter cette classe dans la machine virtuelle. Que se passe-t il et pourquoi JAVA 16
Une classe cliente Ecrire une classe Test2 cliente de la première (qui utilise des référence sur des objets de la première) qui possède deux attributs (att1, att2) de type Test1. l Compiler cette classe l Exécuter cette classe. Que se passe t il? l Lancer la commande javap -p sur la classe Test2. Que voit-on? JAVA 17
Le Main l Ajouter dans Test2 une méthode main(string[])ayant la signature suivante : public static void main(string [] arg) l A quoi sert le paramètre arg de cette méthode? l Compiler cette classe l Exécuter cette classe : que se passe-t-il? JAVA 18
Objets impossibles Dans la méthode main(string[]) de Test2, déclarez une variable t1 de classe Test1 mais instanciez un objet de type Test2 Test1 t1=new Test2() ; l Compiler. Que se passe-t il? Dans la méthode main(string []) déclarez une variable de type Toto, instanciez le. Toto x ; Compiler. Que se passe t il? JAVA 19
La classe vue comme un objet Toutes les classes instanciées sont connues de la machine virtuelle. Elles pourraient donc être également utilisées comme des objets. Hello new h2 coucou... Hello h2 = new Hello(); Res r = h2.coucou();... class Hello{ public void coucou(){ Comment écrire une méthode coucou dans la classe hello, mais dont le destinataire ne soit pas une des instances, mais la classe? JAVA 20
Le mot clé static On ajoute un mot-clé à la signature des méthodes public static coucou1(){... /*Cette méthode est connue de la classe */ public void coucou2(){... /*Cette méthode est connue des instances-objets*/ Comment l'objet h2 fait-il pour invoquer une méthode statique sur la classe Hello? On adapte le destinataire du message : Hello.coucou() ==> Indique que coucou() est relatif à la classe et non pas à une de ses instances Hello +static coucou1() +coucou2() public class Hello{ public void static coucou1(){... public void coucou2(){...... Hello h2=new Hello(); h2.coucou2(); Hello.coucou1();... JAVA 21
Exercice Ecrire le code d'une classe Client, utilisant une classe DivisionO réalisée en utilisant des méthodes d'objets Compiler Ecrire une classe DivisionO en objet Compiler, tester Modifier le code de la classe Client pour utiliser une classe DivisionS qui présente des méthodes statiques Compiler Ecrire une classe DivisionS en statique Compiler JAVA 22
Conséquences directes La classe est également vue comme un objet Les attributs et les méthodes statiques sont associés à la classe et non à chaque objet Toutes les instances de la classe peuvent être vues comme partageant la valeur des attributs "static" Il n'est pas nécessaire d'instancier une classe pour accéder à ses éléments statiques La notion de static peut être perçue comme représentant les valeurs communes à toutes les instances d'une même classe JAVA 23
Exemple du mot clé static public class Circle { public static int count = 0; public static double PI = 3.14; protected double x, y, r; public Circle(double r){ this.r = r; count++; bigger(circle, Circle) count 2 public static Circle bigger(circle c1, Circle c2){ if (c1.r > c2.r) return c1; else return c2; 4 5 1000 public class UneClasseExemple{ public UneClasseExemple(){ Circle c1 = new Circle(10); Circle c2 = new Circle(20); int n = Circle.count; // n = 2 Circle c4 = Circle.bigger(c1, c2); // c4 = c2 getx() getx() gety() getarea() getr() 2 3 10 gety() getr() getperimeter() getarea() getperimeter() JAVA 24
Pourquoi le main est-il static? public class HelloWorld { public static void main(string [] arg){ System.out.println("Hello, World!"); Static main(string [] arg) HelloWorld HelloWorld.java Compilateur javac HelloWorld.java HelloWorld HelloWorld.class Machine Virtuelle java HelloWorld JAVA 25
Exercice Décrire en terme d'objets et de messages la commande d'affichage System.out.println("coucou"); Lancer le programme de gestion des divisions. Quelles sont les différences entre approche statique et l'autre? A quoi ressemble l'approche statique? JAVA 26
Pourquoi? Pourquoi ne pas tout faire en statique? Parce qu'en programmation objet on manipule des objets qui sont beaucoup plus faciles à réorganiser Qu'est ce qui est statique? Le main (on n'a pas le choix, il n'y a pas encore d'objet) Les constantes : public static final int ETAT_STABLE = 1; toto.setstate(uneclasse.etat_stable); Les fonctions communes de service Dans ce cas on essaie de les regrouper dans une classe de service cf. classe Maths JAVA 27
JAVA 28
Les tableaux Déclaration int[] array_of_int; // équivalent à : int array_of_int[]; Color rgb_cube[][][]; Création et initialisation array_of_int = new int[42]; rgb_cube = new Color[256][256][256]; int[] primes = {1, 2, 3, 5, 7, 7 + 4; array_of_int[0] = 3; Utilisation int l = array_of_int.length;// l = 42 int e = array_of_int[40]; NB : on verra les Collections dans un autre TD JAVA 29
Bibliothèques : d'où viennent les objets, les classes? Les objets n'apparaissent que s'ils sont fabriqués par quelque chose... et si l'on a obtenu une référence dessus (appel de méthode par exemple) Les classes Soit on les écrit nous-même Soit on nous les fournit (bibliothèque) Java fournit plus de 10 000 classes dans le kit de base (bibliothèque standard) La difficulté est de connaître leur existence JAVA 30
Composition Une classe est un agrégat d'attributs et de méthodes : les membres COMPOSITION : quand un objet contient un attribut qui est objet d une autre classe ListePatients void affichenoms() lespatients * Diagramme de classes Patient String getnom() Diagramme d objets exemple :String nom prenom :String String maliste:listepatients lespatients[0]:patient lespatients[1]:patient :String :String :String Durand lespatients[2]:patient nom :String prénom Paul JAVA 31
Communication entre objets Message = appel de fonction d'un objet sur un autre on dit «Invoquer une méthode» ==> Unique manière de communiquer entre objets Syntaxe : référenceobjet.nommethode(parametres); lespatients[0].getnom() lespatients[0]:patient lalistepatients:listepatients 0x234 nom prenom String getnom() 0x234 String Durand String Paul JAVA 32
Référence et this Pour pouvoir accéder à un objet, il faut avoir une référence sur cet objet (attribut ou variable) La référence est le nom qu'on lui donne localement Si on veut se parler à soi-même, on utilise «this» //suite class Circle public void affichetoi() { System.out.println( "Je suis un cercle de surface" + this.getarea(); NB : les méthodes statiques peuvent-elles accéder à this? JAVA 33
Synthèse communication Aucune instruction en dehors d une classe Toute la communication se fait par échange de messages entre les objets public class MaClasse{ int i = 12; String toto = "Bonjour"; public static void main(string [] arg){ MaClasse unrepresentant = new MaClasse(); System.out.println("Je dis : "); System.out.println(unRepresentant.toString()); public String tostring(){ return toto; JAVA 34
Découverte de la méthode tostring() Ecrire une classe Patient avec des attributs String nom et prénom Ecrire une classe Client avec une méthode main avec une variable unpatient (Paul Durand) que donne la ligne System.out.println(unPatient); lancer, conclusion? Voir la documentation sur println! Ajouter une méthode dans la classe Patient public String tostring() qui retourne une chaine comportant nom et prénom. Relancer le client. Conclusion? Important! JAVA 35
Exo tableaux, composition, messages Créer une classe TableauCircles qui a un attribut tableau de 10 objets Circle des méthodes addcircle, deletecircle et AfficheCircles compiler, deboguer, mais ne pas encore tester... Faire une classe MonProgTableauCircle avec une méthode main qui: remplit le tableau avec 5 cercles prenez des x/y/r en dur demande l affichage de l ensemble des cercles Compiler, deboguer, lancer JAVA 36
Encapsulation Ne rendre visibles de l'extérieur que certaines parties de l'objet L'utilisateur d'un objet n'accède qu'à sa partie publique. L'autre partie est dite privée. Intérêts une classe fournit un ensemble de services. C est son problème de choisir comment elle fait : les clients n ont pas besoin de connaître les détails => lisibilité du code Modification de la partie privée, tout en gardant la même définition publique D'une manière générale Tous les attributs d'une classe sont "private" Certaines méthodes sont "public", d'autres "private" (il existe aussi protected et default mais on n'en parle pas maintenant) Partie publique Partie privée JAVA 37
Exemple encapsulation public class ClientWeb { private void connect(string unserver){ /* ouvrir une connexion reseau */ private String getdocument(){ /* Demander au serveur la page */ public String getpageweb(string server){ this.connect(server); String tmp = this.getdocument(); return tmp; ClientWeb - void connect(string) - String getdocument() + String getpageweb(string) JAVA 38
Exo encapsulation Reprendre la classe TableauCircles ajouter un attribut private qui compte le nombre d éléments dans le tableau et passez l attribut tableau public (c est interdit mais c est pour la bonne cause) modifier les fonctions addcircle, deletecircle et AfficheCircles en conséquence Reprendre la classe MonProgTableauCircle modifier son main pour qu'elle ajoute ellemême un objet Circle dans le tableau de TableauCircle tester, expliquer les dangers et pb... JAVA 39
Surcharge de méthode La surcharge (overloading) permet à plusieurs méthodes ou constructeurs de partager le même nom. Pour que deux méthodes soient en surcharge il faut qu'elles aient le même nom, mais une signature différente (paramètres de la méthode) Cela utilise le principe de polymorphisme : plusieurs formes possibles pour la même méthode JAVA 40
Surcharge exemple class Point { private double x,y; public Point (){ this.x = 0.0; this.y = 0.0; public Point (double x, double y){this.x = x; this.y = y ; //Calcule la distance entre moi et un autre point public double distance(point autre){ double dx = this.x - autre.getx(); double dy = this.y - autre.gety(); return Math.sqrt( dx * dx + dy * dy ); //Calcule la distance entre moi et une autre coordonnée public double distance(double x, double y){ double dx = this.x - x; double dy = this.y - y; return Math.sqrt( dx * dx + dy * dy); //Calcule la distance entre moi et une autre coordonnée public double distance(int x, int y){ double dx= this.x - (double)x; double dy= this.y - (double)y; return Math.sqrt( dx * dx + dy * dy ); //Calcule la distance entre moi et l'origine public double distance(){return Math.sqrt( x * x + y * y); JAVA 41
Surcharge exemple Appel Quand une méthode est appelée, le nombre et le type des arguments permettent de définir la signature de la méthode qui sera invoquée. Point p1 = new Point(); Point p2 = new Point(20.0, 30.0); p2.distance(p1); p2.distance(50.0, 60.0); p2.distance(50, 60); p2.distance(); JAVA 42
Passage de paramètres dans les méthodes Le mode de passage des paramètres dans les méthodes dépend de la nature des paramètres : par référence pour les objets les modifications faites par la méthode sont faites sur l objet et sont donc persistantes par copie pour les types primitifs les modifications faites par la méthode sont faites sur la copie et ne sont donc pas visibles par l appelante public class Exemple {//à taper, tester, valider!! public void methode1(int i, StringBuffer s) { i++; s.append("d"); public void methode2() { int i = 0; StringBuffer s = new StringBuffer("abc"); methode1(i, s); System.out.println("i=" + i + ", s=" + s); // i=0, s=abcd JAVA 43