JAVA Le cœur du langage

81
Stéphane Frénot - [email protected] - Dpt Télécommunications IJA1 JAVA Le cœur du langage

description

JAVA Le cœur du langage. Programmation Objet : Objectifs. Simplifier Code plus lisible Code facilement maintenable Code plus « humain » Organiser Développement Suivit ==> Projets Mieux Gérés ==> Gains. Classes et Objet. En java tout est objet Tout objet est défini par une classe - PowerPoint PPT Presentation

Transcript of JAVA Le cœur du langage

Page 1: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA1

JAVALe cœur du langage

Page 2: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA2

Programmation Objet : Objectifs

• Simplifier– Code plus lisible– Code facilement maintenable– Code plus « humain »

• Organiser– Développement– Suivit

==> Projets Mieux Gérés ==> Gains

Page 3: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA3

Classes et Objet

• En java tout est objet• Tout objet est défini par une classe

• Classe = Type• Objet = Instance du type

• Guitare c;• c=new Guitare("Fender");

c

"Fender"

Page 4: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA4

Objets

• Morceau de programme identifié par – Ses Attributs

• Représentés par des variables déclarée dans l'objet

• Représentent un état de l'objet

– Ses méthodes • fonctions auxquelles l'objet sait répondre

• Représentent un comportement de l'objet

• Objet Eleve durand ?• Objet Connexion uneConnexion ?

180 m80 kg"Jean"

getAge()

listeCours()

Page 5: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA5

Classes

• Usine de fabrication d'objets

• Outil du programmeur

• Permet de définir le comportement des objets

• Prennent la Première lettre en majuscule

• Classe Elève

• Classe Connexion

Page 6: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA6

Création d'un objet

• Pour manipuler un objet, on déclare une référence sur la classe de cet objet :Circle c;

• Pour créer un objet, on instancie une classe en appliquant l'opérateur new sur un de ses constructeurs. Une nouvelle instance de cette classe est alors allouée en mémoire :c = new Circle();

Page 7: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA7

Constructeur

• Tout objet doit avoir ses valeurs initiales positionnées. Un constructeur permet de fixer ces valeurs à la création de l'objet

• Toute classe possède un constructeur par défaut, implicite. Il peut être redéfini. Une classe peut avoir plusieurs constructeurs qui diffèrent par le nombre et la nature de leurs paramètres.

• Un constructeur est une méthode qui possède le même nom que la classe, mais qui ne renvoie rien

Page 8: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA8

Création d'un objet

class Circle {

protected double x, y, r;

public Circle(double x, double y, double r) {

this.x = x; this.y = y; this.r = r;

}

public Circle(Circle c) {

this.x = c.getX(); y=c.getY(); r=c.getR();

}

public Circle() {

this(0.0, 0.0, 0.0);

}

public double getX(){return this.x;}

public double getY(){return this.y;}

public double getR(){return this.r;}

}

2310

getX()

getY()

getR()

Circle(double x, double y, double z)

Circle(Circle c)

Circle()

Page 9: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA9

Définition d'une classe

class Circle {

… /*cf précédent*/

public int perimeter(){

return (Math.PI*2*r);

}

public int area(){

return (Math.PI*r*r);

}

}area()

perimetre()

2310

getX()

getY()

getR()

Circle(double x, double y, double z)

Circle(Circle c)

Circle()

Page 10: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA10

Attributs et Variables

• Les attributs sont relatifs aux objets– Ils sont définis dans la classe

• Les variables sont relatives à une méthode– Elles sont définies dans une méthode

class Bidon {

protected Toto x;

public int calcul(){

int tmp=0;

while(tmp < CONST_X){

x=x.ajoute(tmp);

}

}

}

x 0x123

calcul()

Page 11: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA11

Exercice

• Instancier un objet de la classe Patient, avec comme nom durand et comme prénom paul

• Réaliser une classe de gestion de division

Page 12: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA12

Instance et Classe : statique

• La classe est également vue comme un objet

• Les attributs et les méthodes statiques sont associés à la classe

• Toutes les instances de la classe partagent la valeur de attributs "static"

• Il n'est pas nécessaire d'instancier une classe pour accéder à ses éléments statiques

Page 13: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA13

Exemple du mot clé statique

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++;}

... /*cf ppt précédent*/public static Circle bigger(Circle c1, Circle c2){

if (c1.r > c2.r) return c1; else return c2; }}

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 }}

area()

perimetre()

2310

getX()

getY()

getR()

count 2

area()

perimetre()

45

1000

getX()

getY()

getR()

bigger(Circle, Circle)

Page 14: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA14

Exercice

• Réaliser la classe Division avec des méthodes statiques

• Comment lancer un programme ?

Page 15: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA15

Enfin mon premier programme

public class HelloWorld { public static void main(String [] arg){ System.out.println("Hello, World !"); }}

main(String [] arg)

HelloWorld

HelloWorld.java

Compilateurjavac HelloWorld.java

HelloWorld.class

Machine Virtuellejava HelloWorld.java

HelloWorld

Page 16: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA16

Composition de classe

• Une classe est un agrégat d'attributs et de méthodes : les membres

• Principe de COMPOSITION

Durand

PatientString

String

Paul

nomprenom

String getNom()

Page 17: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA17

D'où viennent les objets ?

• Les objets n'apparaissent que s'ils sont fabriqués par quelque chose...

• Et qu'on a obtenu une référence dessus (statique, récupération suite à un appel)

• SI ON N'A PAS UN OBJET, IL SUFFIT DE LE FABRIQUER

Page 18: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA18

D'où vient une classe ?

• Soit on l'a défini entièrement

• Soit on nous l'a fourni

• SI ON A BESOIN D'UNE CLASSE, IL SUFFIT DE L'ECRIRE

• Java fournit plus de 10 000 classes dans le kit de base (bibliothèque standard)

• La difficulté est d'en connaître leurs existences

Page 19: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA19

Communication entre objets

• Les objets communiquent entre eux en s'échangeant de messages

• Un message est un appel de fonction d'un objet vers un autre : « Invoquer une méthode »

==> Unique manière de communiquer entre objets

Durand

Patient

String

String

Paul

nomprenom

String getNom()

ListePatientsgetNom()

0x234

Page 20: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA20

Syntaxe d'un message

• <référenceDeL'objet>.<nomDuMessage>

==> Quels sont les messages impliqués

==> Exercice : réaliser la classe Addition

class PaintShopPro {Cercle leCercle=new Cercle(0,0,10);public int uneFonction() { int surface=leCercle.getArea(); return surface;}

}

Page 21: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA21

Référence et this

• Pour pouvoir accéder à un objet il faut avoir une référence dessus.

• La référence est le nom qu'on lui donne localement

• Si on veut se parler à soi-même on utilise « this »

class Cercle { public void afficheToi() { System.out.println(

"Je suis un cercle de surface"+this.getArea(); } }}

Page 22: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA22

Méthodes static

• Les méthodes statiques peuvent elles accéder à this ?

Page 23: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA23

Message or Not Message

Vector tmp=new Vector();

tmp.addElement("10");

c.r = 3;

a = c.area();

pi = Math.PI;

b = Math.sqrt(2.0);

System.out.println("toto"+"titi");

System.out.println("Bonjour");

int a=2;

int b=3;

int c=a+b;

String toto="Hello,";

String titi="World!"; 

String tata=toto+titi;

Page 24: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA24

Notion d'encapsulation

• La programmation objet permet de ne rendre visible 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.

Partie publique

Partieprivée

Page 25: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA25

Notion d'encapsulation

• Intérêts : – Modification de la partie privée, tout en gardant la

même définition publique– Masquer certains détails

• D'une manière générale – Tous les attributs d'une classe sont "protected"– Certaines méthodes sont "public" d'autres privées

Page 26: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA26

Exemple

public class ClientWeb {

protected void connect(String unServer){/* ouvrir une connexion reseau */

}

protected String getDocument(){/* Demander au serveur la page */

}

public String getPageWeb(String server){this.connect(server);String tmp=this.getDocument();return tmp;

}}

Page 27: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA27

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 fonction)

Page 28: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA28

Surcharge exempleclass Point {

protected 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 pointpublic 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éepublic 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éepublic 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'originepublic double distance(){

return Math.sqrt(x*x+y*y);}}

Page 29: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA29

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();

Page 30: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA30

Les types primitifs• Types

– byte : 1 octet– short : 2 octets– int : 4 octets– long : 8 octets– float : 4 octets– double : 8 octets– boolean : true false– char : 2 octets (Unicode)

• Ce ne sont pas des objets java. Donc … et Pourquoi ?

• Un type primitif ne prend pas de majuscule

Page 31: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA31

Les types primitifs

• Les affectations non implicites doivent être castées (sinon erreur à la compilation).

int i = 258;

long l = i; // ok

byte b = i; // error: Explicit cast needed to convert int to byte

byte b = 258; // error: Explicit cast needed to convert int to byte

byte b = (byte)i; // ok mais b = 2

• Pas de message sur un type primitif– Définition de classes Wrapper : Integer– Définition de fonctions de conversion

Page 32: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA32

Les classes Wrapper

• Classes qui encapsulent un type de base

• ==> Permettre aux classes qui manipulent des Objets de manipuler des types de base

• int i=4;

• Integer j=new Integer (4);

• Integer k=new Integer (i);

Page 33: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA33

Les trois représentation d’un nombre

String k=«5»;

int i=5;

Integer j=new Integer(5);

new Integer(i)

j.intValue();

j.toString();

String.valueOf(k);

Integer.toString(i);

Integer.parseInt(k);

Page 34: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA34

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– par copie pour les types primitifs

public class C {void methode1(int i, StringBuffer s) { i++; s.append("d");}

void methode2() {int i = 0;StringBuffer s = new StringBuffer("abc");methode1(i, s);System.out.println("i=" + i + ", s=" + s); // i=0, s=abcd

}}

Page 35: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA35

Principes de base

• Aucune instruction en dehors d’une classe

• Tous la communication se fait par échange de messages

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.disBonjour()); }

public String disBonjour(){return toto;}}

Page 36: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA36

Résumé

• Des objets, des classes pour fabriquer ces objets• Des attributs : soit des variables, soit des méthodes• L'encapsulation permet de masquer du code• Les membres static sont attachés à la classe• Seuls les types de base ne sont pas des objets• Les classes prennent leur première lettre en Majuscule• On ne travaille que sur des références d'objet sauf pour les

types de base

Page 37: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA37

Un peu d'algorithmique Java

Page 38: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA38

Bases du langage

• Types– byte : 1 octet– short : 2 octets– int : 4 octets– long : 8 octets– float : 4 octets– double : 8 octets– boolean : true false– char : 2 octets (Unicode)

• Instructions– if– while, do while, for– selection (switch)

• Opérateurs

– Arithmétique : =+-*/%

– Relationnels : <><= >= == !=

– Logiques : ! && ||

– Incréments : ++ --

– Bit Wise : & | ^ ~ >> << >>>

– Affectation : = += -= *= /= %=

Page 39: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA39

Bloc de programmation

• { } n ’importe où, mais la plupart du temps autour d’une classe ou d’une méthode

• Aucune instruction/déclaration hors d’un bloc

• Une variable peut être déclarée n’importe où dans un bloc. Elle possède la portée de ce bloc

Page 40: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA40

Les structures de contrôle et expression• Essentiellement les mêmes qu'en C

– if, switch, for, while, do while– ++, +=, &&, &, <<, ?:

• Fonctionnement du switch sur type primitif

Page 41: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA41

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[50]; // Lève une ArrayIndexOutOfBoundsException

Page 42: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA42

Les exceptions (1)

• Elles permettent de séparer un bloc d'instructions de la gestion des erreurs pouvant survenir dans ce bloc.

try {// Code pouvant lever des IOException ou des SecurityException

}catch (IOException e) {// Gestion des IOException et des sous-classes de IOException

}catch (Exception e){// Gestion de toutes les autres exceptions

}finally{// Dans tous les cas

}

Page 43: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA43

Les exceptions (2)

• Ce sont des instances de classes dérivant de java.lang.Exception

• La levée d'une exception provoque une remontée dans l'appel des méthodes jusqu'à ce qu'un bloc catch acceptant cette exception soit trouvé. Si aucun bloc catch n'est trouvé, l'exception est capturée par l'interpréteur et le programme s'arrête.

• L'appel à une méthode pouvant lever une exception doit :– soit être contenu dans un bloc try/catch

– soit être situé dans une méthode propageant (throws) cette classe d'exception

• Un bloc (optionnel) finally peut-être posé à la suite des catch. Son contenu est exécuté après un catch ou après un break, un continue ou un return dans le bloc try

Page 44: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA44

Les exceptions (3)

class MachineALaver { void laver() throws PasDAssietteException { ... assiettesSales.depiler(); … }

}

class PileSale{... assiette depiler () throws PasDAssietteException { if (pileVide()){ throw new PasDAssietteException(« fin de pile »); } return (Assiette)elemeentSuivant(); }}

1

2

3

45

67

8

class RobotLaveur { void demarre() { try { uneMachineALaver.laver(); } catch(PasDAssietteException e) { ... } catch(BrasCasseException e) { ... } finaly { ... } ...}

Page 45: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA45

Les unités de compilation

• Le code source d'une classe est appelé unité de compilation.

• Il est recommandé (mais pas imposé) de ne mettre qu'une classe par unité de compilation.

• L'unité de compilation (le fichier) doit avoir le même nom que la classe qu'elle contient.

Page 46: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA46

Les packages définition

• Unité d'organisation des classes– Organisation logique : time.clock.Watch– Organisation physique : time/clock/Watch.class

• Espace de nommage hiérarchique– Description de la hiérarchie : package time.clock;– Notion de nom complet : time.clock.Watch

• Les bibliothèques java sont organisées en package– java.util, java.net, org.objectweb,…

– Deux classes ayant le même nom complet ne peuvent pas s'exécuter en même temps.

Page 47: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA47

Nom de classe : résolution

• Pour résoudre un nom de classe dans une autre classe

...time.clock.Watch toto=new time.clock.Watch();...

import time.clock.Watch;...Watch toto=new Watch();...

import time.clock.*;...Watch toto=new Watch();Clock titi=new Clock();...

import time.*;...Watch toto=new Watch();Clock titi=new Clock();...

Page 48: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA48

Nom de classe : résolution

• Pour résoudre le nom d'une classe soit :– On donne son nom complet lors de l'utilisation– On résout initialement son nom – On résout initialement tous les noms d'un package– Les noms des classes du package java.lang n'ont pas à

être résolus

• On peut donc avoir deux classes Date java.util.Date

java.sql.Date

Page 49: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA49

Les packages : organisation

graph/2D/Circle.javapackage graph.2D;public class Circle(){ ... }

graph/3D/Sphere.javapackage graph.3D;public class Sphere(){ ... }

paintShop/MainClass.javapackage paintShop;

import graph.2D.*;

public class MainClass(){ public static void main(String[] args) { graph.2D.Circle c1 = new graph.2D.Circle(50) Circle c2 = new Circle(70); graph.3D.Sphere s1 = new graph.3D.Sphere(100); Sphere s2 = new Sphere(40); // error: class paintShop.Sphere not found}

Page 50: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA50

Où trouver une classe ?

• Les outils du système cherchent toutes les classes– Compilation et Exécution : typage fort C & E– Les classes sont recherchées sur le système de fichiers– Les classes standards sont automatiquement trouvées par

les outils– Pour indiquer l'endroit sur le système de fichier à partir

duquel il faut chercher les classes on utilise le classpath– Fonctionnement identique au path d'exécution

Page 51: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA51

Le classpath

• Il indique à partir de quel endroit recherche une classejavac -classpath /usr/local titi.Toto.java

• La classe titi.Toto est recherchée à partir du répertoire/usr/local /*Résolution physique*/

• Il faut donc que la classe soit définie dans le fichier :/usr/local/titi/Toto.java /*Résolution java*/

Page 52: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA52

Le classpath : le jar

• Un jar est une archive java • Regroupement de fichiers dans un fichier • Extension du système de fichiers

tutu/tutu/ours/ tutu/ours/Grumly.class package test;

import tutu.ours.Grumly;public class Test { Grumly toto=new Grumly();}

jar tvf toto.jar

vi Test.java

javac ? ???

Page 53: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA53

On revient sur la POO

Page 54: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA54

Destruction d'un objet

• La destruction des objets est prise en charge par le garbage collector (GC).

• Le GC détruit les objets pour lesquels il n'existe plus de référence.

• Les destructions sont asynchrones (le GC est géré dans une thread de basse priorité).

• Aucune garantie n'est apportée quant à la destruction d'un objet.

• Si l'objet possède la méthode finalize, celle-ci est appelée lorsque l'objet est détruit.

Page 55: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA55

Destruction d'un objetpublic class Circle {

...

void finalize() { System.out.println("Je suis garbage collecte"); }

...

Circle c1;

if (condition) {

Circle c2 = new Circle(); // c2 référence une nouvelle instance

c1 = c2;

}

// La référence c2 n'est plus valide mais il reste une référence,c1,

// sur l'instance

c1=null; // L'instance ne possède plus de référence. Elle n'est plus

// accessible. A tout moment le gc peut détruire l'objet.

...

}

Page 56: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA56

Classes et objets

public class Circle { protected double x, y; // Coordonnée du centre protected double r; // rayon du cercle

public Circle(double r) {this.r = r;} public double area() {return 3.14159 * r * r;} public void setX(int i){this.x=i;} public void setY(int i){this.y=i;}}

public class MonPremierProgramme() { public static void main(String[] args) { Circle c; // c, référence sur un objet Circle, mais pas encore un objet c = new Circle(5.0); // c référence maintenant un objet alloué en mémoire c.setX(10); c.setY(10); System.out.println("Aire de c :" + c.area()); }}

Page 57: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA57

L'héritage• Objectifs :

– Organiser les classes dans une hiérarchie de fonctionnement

– Les classes présentent dans ces relations d'héritage un rapport parent / fils

– La relation d'héritage représente une relation sémantique non standard entre le père et le fils

– Il n'existe pas de relation d'héritage universelle entre les classes. C'est le rôle de l'architecte d'application de définir la relation qu'il sous-entend

Page 58: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA58

L'héritage syntaxe

• La classe parente présente généralement soit des fonctions générales à toutes les classes filles, soit des fonctions types qui doivent être (re)définie dans dans les classes filles

public class Circle extends FormeGeométrique {…}

Page 59: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA59

Héritage

• La relation d'héritage indique ce que l'objet est.

Object

FormesGraphiques

FormesEuclidiennes

Ellipse

Cercle

Trapeze

Rectangle

Page 60: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA60

Sous-type

• Une sous-classe étend les capacités de sa super classe. Elle hérite des capacités de sa parente et y ajoute les siennes

• De plus une sous-classe est une spécialisation de sa super-classe. Toute instance de la sous-classe est une instance de la super-classe (pas nécessairement l'inverse).

Page 61: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA61

L'héritage

• ==> Ce qu ’une classe EST• Une classe ne peut hériter (extends) que d'une seule classe.• Les classes dérivent, par défaut, de java.lang.Object• Une référence sur une classe C peut contenir des instances de C ou

des classes dérivées de C.• L'opérateur instanceOf permet de déterminer la classe d'une instance.• Les classes final ne peuvent pas être redéfinies dans les sous-

classes.• super et this pour accéder aux membres d’une classe

Page 62: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA62

L'héritagepublic class Ellipse {

public double r1, r2;public Ellipse(double r1, double r2) { this.r1 = r1; this.r2 = r2;)public double area{...}

}

final class Circle extends Ellipse {public Circle(double r) {super(r, r);}public double getRadius() {return r1;}

}

Ellipse e = new Ellipse(2.0, 4.0);Circle c = new Circle(2.0);System.out.println("Aire de e:" + e.area() + ", Aire de c:" + c.area());System.out.println((e instanceOf Circle)); // falseSystem.out.println((e instanceOf Ellipse)); // trueSystem.out.println((c instanceOf Circle)); // trueSystem.out.println((c instanceOf Ellipse)); // true (car Circle dérive de

Ellipse)e = c;System.out.println((e instanceOf Circle)); // trueSystem.out.println((e instanceOf Ellipse)); // trueint r = e.getRadius();// Error: method getRadius not found in class Ellipsec = e; // Error: Incompatible type for =. Explicit cast needed.

Page 63: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA63

Liaison dynamique de méthodes

• Liaison dynamique des méthodes (dynamic binding of methods) : Indique que la méthode invoquée n'est choisie qu'au dernier moment (run-time), et non pas à la compilation.

• Différence entre Variable/Type et Objet/Classe :– Une variable est un lieu de stockage ayant un type associé. Ce

type est déterminé à la compilation. Déclaration statique.– Un objet est une instance d'une classe. Son type est déterminé

quand l'objet est crée (à l'exécution).

Page 64: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA64

Polymorphisme• Dans les langages statiques, il faut que la partie

gauche(lhs) et droite (rhs) d'un assignement soient de types compatibles

• Dans les langages objets, la partie droite droite doit être d'un sous-type de la partie gauche.

class FormesGeometrique{…}class Cercle extends FormesGeometrique{…}class Rectangle extends FormesGeometrique{…}

FormesGeometrique forme1, forme2;forme1=new Cercle();forme2=new Rectangle();

Cercle forme3;forme3=forme1; //Erreur de compilation forme1 de type FormesGeométrique

Page 65: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA65

Le masquage des variables

• Une classe peut définir des variables portant le même nom que celles de ses classes ancêtres.

• Une classe peut accéder aux attributs redéfinis de sa classe mère en utilisant super ou par cast.

• Une classe peut accéder aux méthodes redéfinies de sa classe mère en utilisant super.

Page 66: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA66

Le masquage des variablesclass A {

int x;void m() {...}

}class B extends A{

int x;void m() {...}

}class C extends B {

int x, a;void m() {...}void test() {

a = super.x; // a reçoit la valeur de la variable x de la classe Ba = super.super.x; // Syntax errora = ((B)this).x; // a reçoit la valeur de la variable x de la classe Ba = ((A)this).x; // a reçoit la valeur de la variable x de la classe Asuper.m(); // Appel à la méthode m de la classe Bsuper.super.m(); // Syntax error((B)this).m(); // Appel à la méthode m de la classe C (et non B)

}}

Page 67: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA67

Surcharge interdite : final

• Constantes

• Interdiction de surcharges

public static final int MAX=30;protected final String toto="coucou";

Page 68: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA68

Les classes abstraites

• Une classe abstraite est une classe ayant au moins une méthode abstraite.

• Une méthode abstraite ne possède pas de définition.

• Une classe abstraite ne peut pas être instanciée (new).

• Une classe dérivée d'une classe abstraite ne redéfinissant pas toutes les méthodes abstraites est elle-même abstraite.

Page 69: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA69

Les classes abstraitesabstract class Shape {

public abstract double perimeter(); }

class Circle extends Shape {...public double perimeter() { return 2 * Math.PI * r ; }

}

class Rectangle extends Shape {...public double perimeter() { return 2 * (height + width); }

}

...Shape[] shapes = {new Circle(2), new Rectangle(2,3), new

Circle(5)};double sum_of_perimeters = 0;for(int i=0; i<shapes.length; i++)

sum_of_perimeters = shapes[i].perimeter();

Page 70: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA70

Les inner classes

• Introduites avec java 1.1• Elles permettent de

– Déclarer une classe dans un bloc (inner class)– Instancier une classes anonymes (anonymous class)

• Elles affinent la localisation des classes• Elles simplifient le développement • Elles offrent une (autre) réponse pour les pointeurs de fonctions• Elles sont une caractéristique du compilateur et non de la JVM• Attention : elles peuvent réduire la lisibilité des sources.

Page 71: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA71

Les inner classes

public class FixedStack {Object array[];int top = 0;

public void push(Object item) { ... }public Object pop() { ...}public isEmpty() { ...}public java.util.Enumeration element() { return new Enumerator(); }

class Enumerator implements java.util.Enumeration {int count = top;public boolean hasMoreElements() { return count > 0; }public Object nextElement() {

if (count == 0) throw NoSuchElementExceptio("FixedStack");

return array[--count];}

}}

Page 72: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA72

Les interfaces (1)• ==> Quels comportements une classe peut avoir en plus de

ce qu ’elle est

• Spécification formelle de classe– Indique les services rendus par la classe qui implante

l'interface• !!! Technique / Conceptuel• Une interface correspond à une classe où toutes les méthodes

sont abstraites.• Une classe peut implémenter (implements) une ou plusieurs

interfaces tout en héritant (extends) d'une classe.• Une interface peut hériter (extends) de plusieurs interfaces.

Page 73: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA73

Les interfaces (2)

abstract class Shape { public abstract double perimeter(); }

interface Drawable { public void draw(); }

class Circle extends Shape implements Drawable, Serializable {public double perimeter() { return 2 * Math.PI * r ; } public void draw() {...}

}

class Rectangle extends Shape implements Drawable, Serializable {...public double perimeter() { return 2 * (height + width); } public void draw() {...}

}

...Drawable[] drawables = {new Circle(2), new Rectangle(2,3), new

Circle(5)};for(int i=0; i<drawables.length; i++)

drawables[i].draw();

Page 74: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA74

Un langage oo

• Echange de messages (méthodes)

• Encapsulation

• Abstraction par les classes– Composition, Héritage, Interfaces

Page 75: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA75

Trucs & @stuches

Page 76: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA76

Règles d'écriture de code Java

• Un fichier .java par classe• Entête classique : description...• Commentaires : JavaDoc

– Début de bloc : /** .... **/– Balises : @author, @version, @see, @param, @return, @exception

• Exemple/** * Affiche un bouton rond* <pre> * BoutonRond b = new BoutonRond(titre);* monPanel.add(b);* </pre>*@see awt.button*@author C. Nicolas**/

Page 77: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA77

Convention de nommage• paquetages minuscule

• classes MajusulePourLaPremiereLettreDeChaqueMot

• méthodes minusculePourLaPremiereCommeLaClasseAprès

• constantes MAJUSCULE_AVEC_SOULIGNE

• variables/méthodes priv/protected termineParSouligne_

• variables/méthodes statiques termineParDeuxSoulignes__

• variables locales à une méthode minuscules_avec_soulignes

• méthodes fabriquant des objets de classe X newX

• méthodes de conversion retournant des objets de type X toX

• accesseur d'un attribut y de type X X getY()

• accesseur de modification void setY(X valeur)

• classe de définition d'une exception FinDeLaClasseAvecLeMotException

• interface se distinguant d'une classe similaire InterfaceSeTermineParIfc

• classe qui se distingue de son interface ClasseSeTermineParImp

Page 78: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA78

Recommandations 1/2• Pas de variables d'instance publiques• Pas d'accesseurs inutiles• Identifier les variables immuables (pas de synchro)• Peu de variables/méthodes statiques (classe) • Long plutôt que int et double / float

– moins d'erreur de dépassement

• Protected mieux que Private• Minimiser les accès aux variables d'instance dans les méthodes

– utiliser des accesseurs protected

• Pas de surcharge sans nouveau paramètre (sinon utiliser instanceof())• Méthodes simples• Préferer void : x.methode1().methode2()• méthodes publiques = synchronized• Si surcharge de Object.equals() alors surcharge de Object.hashcode( )• Pas de clonage intempestif• Utiliser notifyAll plutot que notify ou resume

Page 79: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA79

Recommandations 2/2• Si possible créer un constructeur sans paramètre

– Class.newInstance()

• Pas de final sinon pour de l'optimisation de performances

• Interfaces mieux que classes abstraites (héritage simple)

• Préférer abstract void maMethodeVide(); à void maMethodeVide(){ }

• Import java.awt.Button mieux que java.awt.*

• Nommer les thread pour le débogage en distant

• Utiliser plutôt implements Runnable que extends Thread

• Ne pas abuser du Garbage Collector (-verbosegc et -prof)

• BufferedInputStream : optimisation des performances

• Surcharger toString des classes définies (debogage)

Ne pas croire tout ce qu'on dit !

Page 80: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA80

Ressources Java : Livres

• JavaSeries O'Reilly– Couvre tous les aspects : tutorial, thread, jdbc, Beans– Ecris par les concepteurs du langage : Exploring Java (valise), Niemeyer,

Peck

• Bibles de référence– The Java Language Specification : James Gosling, Bill Joy, Guy Steele

Addison-Wesley– Core java (2.0) v1

• Java client-server – Cédric Nicolas, Christophe Avare, Frédéric Najman, Eyrolle

• Sun (http://www.sun.com/)– Spécifications : Java, VM, JavaBeans...

• Conception Objets– Design Patterns Erich Gamma ITP

Page 81: JAVA Le cœur du langage

Stéphane Frénot - [email protected] - Dpt Télécommunications IJA81

Ressources Java : Web• http://www.sun.com

– jdk, documents, pointeurs, projets

• http://www.gamelan.com– Applet, Scripts, JavaScripts

• http://www.stars.com– Codes, Exemples, Tutoriels (pas que Java)

• JavaDevelopperConnexion– http://java.sun.com/jdc– http://java.sun.com/jdc/techDocs/newsletter/index.html

• http://www.blackdown.org