Vous êtes sur la page 1sur 68

Anne 2009-2010

Cycle Ingnieur - Formation Continue

Introduction Java
Frdric Voisin
Bibliographie: Anne Tasso: Le livre de Java, premier langage (3me dition), Eyrolles 2006. C. Delannoy: Programmer en Java (Java 5 et 6), Eyrolles, 2007 C. S. Horstmann et G. Cornel : Au cur de Java 2 (JDK 5.0), Vol. 1 Notions Fondamentales Campus Press 2005

Le Marketing Java
Moderne: objet, typ Fiabilit: vrifications dynamiques lexcution (ex: indices de tableaux), gestion transparente de la mmoire alloue (pointeurs) Portable: multi-plateformes (O.S., architectures) Largement disponible ( gratuit ), normalis Multi-usages via de nombreuses bibliothques: IHM, graphique, rseaux, audio, vido, Compatible avec tlchargement dynamique de code (applet, Web) trs mode actuellement : dveloppement multi plateformes (PCs, Internet/Intranet, PDA, PocketPC, mobiles,.) Moins mode (mais aussi utile): au cur de la norme J2EE qui dcrit de nombreux services (JDBC, JSP, )
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 2

Le Marketing Java (suite)


Au centre dun effort de normalisation (Norme J2EE)
13 services pour environnements ouverts : accs aux bases de donnes (JDBC) annuaires (JNDI) appels distance (RMI) envoi de messages, transactions, EJB ( Enterprise Java Beans ): dveloppement orient composants JSP/Servlet (Java Server Page/ Server Applets): WEB dynamique avec code Java excut du ct serveur et non pas client

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

Le Marketing Java (fin)


Les principaux concurrents (hors monde de la gestion)
C, C++, (monde Unix) plus quelques autres C#, C++ (Microsoft, environnement .NET )

Les acronymes principaux:


JVM: la machine virtuelle Java (le moteur dexcution) J2RE : ( runtime : JVM + les librairies dexcution) JDK: Java Development Kit : J2RE + compilateur + outils J2EE (Enterprise Edition), J2SE (Standard Edition), J2ME (Mobile Edition)

Un cousin: JavaCard, version restreinte et spcialise pour applications sur cartes puces !
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 4

Bref Historique de Java


JDK ( Java Development Kit ) :
Java 1.0.2: version historique de tous les navigateurs Web (applet) Java 1.1.5 (1997), 504 classes, 23 paquetages Abstract Window Toolkit (awt) : interface graphique Java 1.2 (dit encore Java 2 ! 1998), 1520 classes, 59 paquetages Swing (IHM), Drag and Drop, amlioration audio, amlioration I/O Java 1.3: amlioration des collections notamment (2130 classes !) Java 1.4 (2001/02): cryptographie, modles de scurit (2738 classes) Java 1.5 (dit encore Java 5.0, Automne 2004, 3270 classes) : Rvision majeure du langage ! Java 1.6 (dit encore Java 6.0) : de lordre de 3800 classes On va en voir une toute petite partie !

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

Java : Write once, run everywhere !

Source java (.java) Source java (.java)

javac (sun)

bytecode (.class) bytecode

Sun Java (JVM+JRE) Mac Java (JVM+JRE) Windows Java (JVM+JRE) Navigateur Java (JVM+JRE) excution sur une (autre) plateforme arbitraire
6

javac (Linux)

(.class)

bytecode (.class) Archive (.jar)

Source java (.java)

javac (windows)

Compilation sur une plateforme arbitraire


IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

Mode Compil pur


Deux phases successives : 1. Compilation 2. Excution Une seule compilation puis un nombre quelconque dexcutions Module objet et excutable lis un O.S. et une architecture
Modules source

Entres

Module objet

Compilateur et diteur de liens

Module objet

Module objet

+ Rapide lexcution, fiable (plus de contrles) excutable - Difficult la mise au point - Problme de diffusion du code: que diffuser ? Les modules source : oblige avoir un compilateur rsultats Les modules objets : trop spcifiques
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 7

Librairies

Mode Interprt pur


Une seule phase : analyse et excution des instructions au fur et mesure du droulement du programme !
Modules source

Entres

Interprte + librairies

- Lent: les instructions sont analyses chaque fois ! - Moins sr en gnral: moins de contrles ou doptimisations + Plus rapide mettre au point + Plus simple de diffuser le code: il suffit davoir un interprteur pour lO.S. et larchitecture
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 8

rsultats

Mode semi-compil la Java

Modules source

Module Objet (.class)

Entres

Compilateur (javac)

Module objet

JVM + JRE

Module objet

rsultats

On compile mais dans un format indpendant de lO.S. et de larchitecture, et on interprtera les modules objets
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 9

Mode semi-compil la Java (2)


La compilation permet de mcher le travail de linterprte (dcomposition dinstructions complexes, vrifications faites une fois pour toutes, ) Moins lent quun mode interprt pur Le format intermdiaire autorise la portabilit Autorise le tlchargement de code (vite la diffusion de mise jour) ce qui nest pas sans poser de nouveaux problmes ! (confiance dans le code tlcharg, compatibilit selon les versions de linterprte )

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

10

Java: la portabilit (rsum)


Bas sur le portage de la JVM et du JRE
spcification publique de la JVM: on peut avoir plusieurs fournisseurs la normalisation du langage permet dviter les drives dans de possibles extensions au langage (ex: guerre des navigateurs Web)

Il reste sassurer quon a la bonne version de JDK, JVM, JRE !


compatibilit ascendante en gros ( deprecated features)

Le mme code compil tourne sous Solaris, Windows, Linux, MacOS,


compatible avec les environnements des utilisateurs facile distribuer, tlcharger ce qui nest pas sans poser de nouveaux problmes : confiance dans le code tlcharg ? compatibilit selon les versions de la JVM ?

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

11

La plateforme Java (1.5)

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

12

Java: les principaux outils


java : linterprte de bytecode (la JVM) javac : le compilateur appletviewer : JVM pour lexcution des appliquettes jar : le gestionnaire darchives java (multi-fichiers, compress) javadoc : le gnrateur de documentation
commentaires normaliss --> document html la documentation reste en phase avec le code, moindres efforts !

Nombreux environnements de dveloppement dont Eclipse

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

13

Hello World en Java


Accueil.java public class Accueil { public static void main (String[] args) { System.out.println("Hello World"); } }
Javac Nom-Fichier ! Compilation: javac Accueil.java si pas derreur de compilation, cre Accueil.class

Correspondance entre noms de classes (publiques) et noms de fichiers respecter ! Une classe (publique) par fichier !

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

14

Hello World en Java (2)


Accueil.java public class Accueil { public static void main (String[] args) { System.out.println("Hello World"); } destinataire }

Par rapport au langage C: La classe doit tre contenue dans un fichier Accueil.java La fonction main est incluse dans une classe Un seul argument, obligatoire, pour main, de type String[] Le type de retour de main est void Syntaxe dappel dune fonction: destinataire.nom(paramtres)
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 15

Compilation / Excution
Unit de base = la classe Un nom de classe dbute par une Majuscule

public class MaClasse { liste non ordonne de attributs dinstances attributs de classe mthodes dinstances mthodes de classes } Mthode : lquivalent des fonctions/procdures

Pour chaque attribut ou mthode on prcise


sa visibilit (public ou private) Sil est relatif la classe (static) ou une instance

Pas de fonctions et des types sparment comme en C, mais des classes qui regroupent attributs et mthodes ! Tout est toujours dans une classe ! Un fichier peut dbuter par des directives de paquetages
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 16

Compilation / Excution (fin)


Excution: java Accueil paramtres-optionnels

java Nom-Classe

la JVM recherche dans Accueil.class une fonction den-tete public static void main (String[] args) et lexcute Si une telle mthode nexiste pas = erreur au lancement !
Exception in java.lang.NoSuchMethodError: main

Causes possibles derreur :


Le fichier Accueil.class nest pas accessible (utilise implicitement une variable CLASSPATH vue ultrieurement) la classe Accueil ou la mthode main ne sont pas public la mthode main nest pas static ou na pas le type de retour et le paramtre indiqus

Toute classe avec une telle mthode peut servir lancer une excution.
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 17

Un exemple avec accs aux paramtres


public class Echo { Llment dindice i public static void main (String[] args) { for(int i = 0; i < args.length; i++) { System.out.println(args[i] + " " + args[i]); } // System est une classe prdfinie // out rfrence un objet, attribut static de System // println est une mthode applique la valeur de System.out // loprateur + reprsente ici la concatnation de chanes } //length est un attribut prdfini des tableaux } javac Echo.java java Echo Hello les IFIPS
Hello Hello les les IFIPS IFIPS
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 18

Le mme exemple en mieux


public class Echo { public static void main (String[] args) { for(String v : args) { // pour tout v contenu dans args System.out.println(v + " " + v); } } }

lnumration des valeurs est faite par indice croissant On ne gre plus lindice de dpart (0), lindice de fin (args.length-1), lincrmentation Moins de chances de se tromper On doit rappeler le type de lobjet manipul (ici String) v parcourt les valeurs, pas les indices !
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 19

Un exemple avec lecture au clavier


import java.util.Scanner; public class Somme { public static void main (String[] args) { System.out.print("Entrez deux nombres: "); Scanner scan = new Scanner(System.in); int v1 = scan.nextInt(); int v2 = scan.nextInt(); System.out.println("Leur somme vaut: " +(v1+v2)); }

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

20

Java: Types prdfinis et classes


Syntaxe proche de celle du langage C, la smantique pas toujours Les chanes de caractres sont dfinies par une classe (String) pas de type entier non sign (unsigned du langage C) on distingue valeurs ( types primitifs ) et objets (classe) types primitifs : boolean char, byte short, int, long float, double void Classes java : prdfinies ou introduites par le mot-clef class; Instances : cres par le mot-clef new
Les instances des classes doivent tre cres explicitement ! Exemple: new Point2D(3.0, 5.0)

Unique structure de donnes : les tableaux ! Le reste correspond des classes (prdfinies)
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 21

Java: les dclarations de variables


T maVariable ; o T est un des types primitifs prcdents

maVariable peut directement stocker une valeur de type T Exemples: int i, j; int v = 3; // dclarations sans initialisations // dclaration avec initialisation

C maVariable ; o C est une classe maVariable ne peut pas stocker un objet de classe C mais une rfrence sur un objet de classe C. Lobjet doit tre allou par ailleurs. Plusieurs rfrences peuvent dsigner le mme objet Exemples: Point2D p = new Point2D Point2D p; // p ne rfrence rien ! Point2D(); p2 = new Point2D(); // dclaration et initialisation p3 = p2; // p2 et p3 rfrencent le mme objet
Frdric Voisin - Introduction Java 22

IFIPS-FC- 09-10

Java: les dclarations de variables (suite)


T[] monTableau; o T est soit un type primitif, soit une classe

Mme rgle que pour les classes: monTableau est une rfrence sur un tableau, mais pas directement un tableau. Le tableau doit tre explicitement allou. la dimension du tableau nest pas donne lors de la dclaration, mais lors de lallocation du tableau ! la dimension du tableau peut tre une expression int t[3]; // incorrect ! int[] t; // correct mais t ne rfrence rien t[2] = 5; // syntaxiquement correct mais erron int[] t = new int[3]; // correct t[2] = 5; // correct Point2D[] t2 = new Point2D[3]; // correct t2 reprsente un tableau de rfrences sur des instances de Points2D et non pas directement un tableau dinstances Point2D t2[2] = new Point2D();
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 23

Squelette dune classe (version simplifie)


public class NomClasse { private T attribut1; // attribut dinstance private static T attribut2; // attribut de classe public T f ( paramtres ){ corps de f // mthode dinstance ( comportement ) // le corps est toujours relatif une instance implicite. // l appel prcisera qui on demande dexcuter le comportement } public static T g ( paramtres ){ corps de g // mthode de classe } } // fin de la dfinition de classe Prsence de marqueurs de visibilit : public / private Possibilit de marqueur de classe : static
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 24

Un exemple simple: Point2D (1/3)


public class Point2D { private double x;// private ? cach aux autres classes private double y; public void move(double dx, double dy){ x += dx; y += dy; // x et y de qui ? }

non static : sadressent une instance // cre une reprsentation de linstance en question public String toString(){ particulire return "(" + x + ", " + y + ")" ; } public double abscisse() { return x; } public double ordonne() { return y; }

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

25

Point2D (2/3)
Un constructeur est une mthode qui a le nom de la classe et pas de type de retour. Il sert initialiser les objets, leur cration. Lappel est automatique. On peut dfinir plusieurs constructeurs qui diffrent par leurs paramtres.
public Point2D(double monX, double monY) { x = monX; y = monY; } public Point2D() { x = 0.0; y = 0.0; }
// utilise des valeurs par dfaut

// cre une nouvelle instance, sans modifier linstance courante

public Point2D symetrique() { return new Point2D(-x, -y); }


// par opposition modifie linstance courante

public void retourne() { x = -x; y = -y; }


IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 26

Point2D (3/3)
private static Point2D theOrigin = new Point2D(0.0, 0.0); public static Point2D getOrigin() { return new Point2D(Point2D.theOrigin.x, Point2D.theOrigin.y); } } // fin de la classe Point2D
non static : chaque point a ses propres attributs x et y. static : il existe un unique attribut theOrigin, rattach la classe. non static : symetrique() est applicable un objet, pas une classe. ex: Point2D.theOrigin.abscisse() static : getOrigin(), est applicable la classe.

Il manque une mthode pour tester lgalit de deux instances de Point2D: deux points sont gaux sils ont mmes coordonnes! On verra plus tard comment la programmer
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 27

Une classe de test simple

public class TestePoint2D { public static void main(String[] args) { Point2D p = new Point2D(12.0, 23.0); Similaire mais System.out.println(p.toString()); application du p.move(-5.0, 2.0); second System.out.println(p.toString()); constructeur Point2D p2 = new Point2D(); Point2D p3 = new Point2D(12.0, 23.0); Point2D p4 = new Point2D(12.0, 23.0); System.out.println(p3.symetrique().toString()); p4.retourne(); System.out.println(p4.toString()); p2 = Point2D.getOrigin(); System.out.println(p2.toString()); } } On ne dit pas do vient Point2D : pas de #include la C.
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 28

new Point2D(12.0, 23.0): Cration dune instance, application du constructeur, renvoi de la rfrence

Cercle: Une classe utilisatrice de Point2D


import java.lang.Math; public class Cercle { private Point2D centre; private double rayon; public Cercle(Point2D p, double r) { centre = p; rayon = r; } public Cercle() { centre = Point2D.getOrigin(); rayon = 1.0; } public void plusGrand(double dr) { rayon = rayon + dr; } public void move(double dx, double dy) { centre.move(dx, dy); }
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 29

Cercle (2/2)
// pow (power): puissance . Mthode static de Math. // sqrt (square root) : racine carre public boolean appartient(Point2D p) { double dx = Math.pow(p.abscisse() centre.abscisse(),2.0); double dy = Math.pow(p.ordonnee() centre.ordonnee(),2.0); return Math.sqrt(dx + dy) <= rayon; } } // Fin de Cercle Deux erreurs classiques : double dx = Math.pow(p.x centre.x,2.0); // KO ! double dx = pow(p.abscisse() centre.abscisse(),2.0); // KO !

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

30

Pour mieux comprendre la suite


Modle mmoire de la machine vue par la JVM

Pile :
appels de mthodes, paramtres, var. locales,

Tas :
instances

Ce qui a une dure de vie limite et connue est stock dans la pile et gr automatiquement (allocation/libration) Ce qui a une dure de vie non dtermine est stock sur le tas, allou explicitement et libr implicitement (en Java)
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 31

Pour mieux comprendre la suite (2/2)


public class Teste { public static Point2D t2(Point2D p) { return p.symetrique(); } public static Point2D t1() { Point2D monP, res; double v = 5.0; monP = new Point2D(3.0, v); res = t2(monP); System.out.println(res.abscisse() + res.ordonnee()); return res; } public static void main (String[] args) { Point2D p = t1(); // ou encore Teste.t1() } }

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

32

Java: les rfrences aux instances


on manipule toujours les objets via des rfrences
public class Point2D { private int x, y; } Instance de Point2D // monC est une rfrence sur une instance // de Point2D qui ne rfrence encore rien Point2D monC; monC.x = 45; // KO, pas dinstance rfrence // allocation dinstance + affectation monC monC = new Point2D(23, 6); monC.y = 12; // OK monC rfrence bien un objet Point2D monC2 = new Point2D(7, -5); Point2D monC3 = monC2;
IFIPS-FC- 09-10

23 12 7 -5

monC3 monC2 monC

Frdric Voisin - Introduction Java

33

Les rfrences aux instances (suite)


une fois les instances alloues, les rfrences sont transparentes: 1 monC.x = monC2.y + 2; 23

miette
le systme gre un ramasse-miettes pour les objets qui ne sont plus rfrencs

-3 7 -5

2 monC = monC3;
monC3 monC2 monC

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

34

Quelles affectation et galit ?


monC = monC2; // Corfrence (partage) monC4 7 -5 7 -5

if (monC == monC2) // galit de rfrences: true if (monC == monC4) // false On a souvent besoin dune autre galit (equals) : if (monC4.equals(monC2)) { } Par dfaut, == et equals concident, mais chaque classe pourra redfinir equals si besoin Pour les valeurs, seul loprateur == existe ! Mme problme de choix entre affectation ou copie dobjets (clonage) !

monC3 monC2 monC

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

35

Application aux Cercles et Point2D


Point2D p = new Point2D(3.0, 5.0); 1 Point2D p2 = p; 2 Cercle c = new Cercle(p, 2.0); 3 c.move(2.0, 2.0); 4 c.centre = p.symetrique();5 5 Dans le constructeur on a fait le choix de ne pas copier le point quon prend comme origine ! On garde juste une rfrence dessus, qui peut tre partage par dautres instances. Judicieux ou pas ? On pourrait aussi implmenter move dans Cercle diffremment (cration dun nouveau Point2D)
IFIPS-FC- 09-10

1
3.0 5.0 7.0

4 5.0 5
2.0

2
p2

c p

Frdric Voisin - Introduction Java

36

Les variables tableaux sont des rfrences !


// maTable rfrence un tableau de // 3 rfrences des instances de Point2D Point2D[] maTable = new Point2D[3]; // maTable[0] ne rfrence aucun objet maTable[0].x = 12; // KO ! for(int i=0; i<maTable.length; i++){ maTable[i] = new Point2D(); } maTable[0].x = 12; // OK ! // t rfrence un tableau de 2 entiers int[] t = new int[2]; t[0] = 25; t[1] = 13; // OK !
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java

25 13

? ? ?

maTable

37

Les variables tableaux sont vraiment des rfrences !


int[] t = new int[2]; t[0] = 25; t[1] = 13; int[] t2 = new int[3]; t2[0] = 12; t2[1] = 6; t2[2] = -1;

25 13

t2 = t; // OK (en Java; pas en C ou C++) ! // t2 rfrence maintenant un tableau de // 2 entiers. int[3] t; // incorrect syntaxiquement int t[3]; // aussi incorrect Pour accder la dimension (courante), utilisez t.length

12 6 -1

t2

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

38

Quelques classes utiles


String : les chanes de caractres (ont le statut de constantes !) charAt, compareTo, equals, concat, indexOf, length les String ne sont pas des tableaux de caractres (comme en C) les instances de String se comparent avec equals, ou equalsIgnoreCase, pas avec == ! StringBuffer: les chanes de caractres modifiables charAt, delete, reverse, append, Math: que des mthodes et attributs statiques (cos, sqrt, pi, ) Ex: double d = Math.cos(Math.pi);

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

39

Quelques classes utiles (suite)


Diverses collections (conteneur dinstances) :
ArrayList<uneClasse> // o T est une classe quelconque boolean add(uneInstance) // ajout la fin ! void add(int, uneInstance) // ajout un index prcis ! boolean remove(uneInstance) int size() // le nombre dlments actuel int indexOf(uneInstance) // indice de la premire occurrence uneClasse get(int) // retourne llment lindex indiqu

Exemple:
ArrayList<Point2D> liste = new ArrayList<Point2D>(); liste.add(new Point2D(3.0, 5.0); liste.add(new Point2D()); for(Point2D p : liste) { } // parcours de toute la collection

Ncessite dajouter en tte de fichier : import java.util.ArrayList;


IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 40

Retour sur les attributs


Chaque instance a son jeu de variables dinstances (non static) Il existe un seul exemplaire des variables de classe (static) Les rgles dinitialisation sont diffrentes
static = la premire rfrence la classe variables dinstance : via les constructeurs ou la dclaration

Les variables static sont accessibles laide du nom de la classe ou de lintrieur des mthodes (classes ou instances) de la classe final pour dire quun attribut ne change pas de valeur (constante) En gnral, les attributs ne sont pas public

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

41

Retour sur les mthodes


Mthodes dinstances: public, sauf si elles ne servent que de mthodes auxiliaires pour la ralisation dautres mthodes Appel: objetReceveur.nomMthodes(arguments)

dans le corps de la mthode : on peut accder aux attributs dfinis par la classe. on peut dsigner le receveur du message par this on peut omettre this pour laccs aux attributs ou aux mthodes : x est quivalent this.x f() est quivalent this.f()

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

42

Retour sur les mthodes (suite)


Mthodes de classes (static)
mme principe pour la visibilit appel: NomClasse.nomMthodes(arguments) accs impossible aux variables dinstance (quelle instance ?) Les mthodes dinstances et les mthodes de classes peuvent tre surcharges (avoir le mme nom mais un en-tte diffrent) Deux mthodes surcharges ne peuvent pas se diffrencier uniquement par le type retourn

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

43

Les constructeurs
syntaxe : pas de type de retour (mme pas void) le nom de la mthode est celui de la classe Ils servent initialiser les instances la cration: lappel new lance automatiquement le constructeur correspondant aux paramtres fournis. Erreur la compilation si aucun constructeur nest appelable (visibilit, paramtres), compte-tenu des constructeurs existants si une classe ne dfinit pas de constructeur, le systme fournit un constructeur par dfaut, sans argument si une classe dfinit au moins un constructeur, il nexiste plus de constructeur par dfaut implicite (mais on peut dfinir un constructeur sans paramtre qui en tiendra lieu!)

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

44

Les constructeurs (fin)


on peut surcharger les constructeurs public class Cercle { public Cercle(Point2D p, double r) { centre = p; rayon = r; } public Cercle() { centre = Point2D.getOrigin(); rayon = 1.0; } } un constructeur peut en appeler un autre via la notation this() mais celle-ci doit tre la premire instruction du nouveau constructeur public Cercle() { this(Point2D.getOrigin(), 1.0); // mieux ! }
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 45

Classes et Hritage
Dfinir une nouvelle classe par extension ou spcialisation dune classe existante, en nen donnant que ce qui diffre. class SousClasse extends SuperClasse { + gnrale SuperClasse }

+ spcifique, + riche

SousClasse

les instances de SousClasse sont vues comme tant aussi des instances de SuperClasse, utilisables partout o on attend une instance de la super-classe
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 46

Un exemple de hirarchie de classes


Figure Origine: contient(Point2D) dessiner() effacer() move(int dx, int dy)

Point2D x, y: double getX(), getY() move(int dx, int dy)

Cercle rayon: double contient(Point2D) dessiner() effacer()

Rectangle largeur, longueur: double contient(Point2D) dessiner() effacer()

Segment Oppos: contient(Point2D) dessiner() effacer()

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

47

Classe et Hritage (suite)


Une sous-classe peut
ajouter de nouveaux attributs (la redfinition ou loubli dattributs est interdit, mais un attribut peut en masquer un attribut de mme nom de la super-classe) ajouter de nouvelles mthodes redfinir (spcialiser) des mthodes de sa super-classe

Un attribut ou une mthode private de la super-classe nest pas visible des sous-classes : il est prsent mais pas rfrenable par les mthodes de la sous-classe. Les membres rfrenables par les sous-classes sont ceux qui ont une visibilit public ou protected. Lhritage est une relation transitive !

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

48

La hirarchie des figures en C (1 / 2)


Donnez un ensemble de types et de dfinitions C pour reprsenter cette hirarchie UML Question subsidiaire: ajoutez un nouveau type de figure.

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

49

La hirarchie des figures en C (2 / 2)


Une autre solution un peu amliore ? Plus conomique, mais pas plus volutive !

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

50

La classe Figure en Java


abstract public class Figure { // abstract ?? voir aprs ! protected Point2D origine; // mthode abstract: on ne donne pas son corps public abstract void dessiner(); public abstract boolean contient (Point2D P); public void move(int x, int y) { origine.move(dx, dy); } } public class Cercle extends Figure { public void dessiner() { ... } public boolean contient (Point2D P) { ... } ... }
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 51

Les hirarchies de classes Java


En Java, on ne peut driver via extends que dau plus une classe. On parle dhritage simple (par opposition hritage multiple) Si une classe na pas de super-classe explicite, elle drive implicitement de la classe prdfinie Object Toute classe hrite donc, directement ou non, de Object qui fournit des services par dfaut. Ces services par dfaut peuvent (et souvent doivent) tre redfinis dans les sous-classes :
public boolean equals(Object O) public String toString() protected Object clone()

Pour quune mthode de la sous-classe en redfinisse une autre, elle doit conserver la mme liste de paramtres.

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

52

Hritage et typage
Partout o on attend une Figure, on peut utiliser un Cercle :
public void f(Figure fig) { fig.effacer(); fig.move(12, 24); // correct, toujours dfini fig.dessiner(); Cercle c = new Cercle(); c.move(12, 24); // correct, toujours dfini fig = new Cercle();// correct, mais pour le compilateur // fig reste toujours une Figure arbitraire ! fig.rayon = 12; // KO c = fig; // KO ! que vaut c.rayon si fig tait une figure arbitraire ? } f( new Cercle() ); f( new Rectangle() ); // OK !

Ces conversions implicites vers Figure sont acceptes silencieusement par le compilateur et ne peuvent pas chouer !
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 53

Hritage et Liaison Dynamique de Fonctions


On se base sur le type rel de lobjet (et non pas sur son type apparent) pour savoir quelle mthode excuter (liaison dynamique) : Figure fig; Point2D p = new Point2D(1,1); Math.Random hasard = new Math.Random(); if (hasard.nextInt(2) != 0) // Pile ou face ? fig = new Cercle(p, Math.Pi); else fig = new Rectangle(p,1,1); fig.dessiner(); // quelle dessiner() ? Les mthodes peuvent sappuyer sur les comportements redfinis : public move(double dx, double dy) { // dans Cercle this.effacer(); super.move(dx, dy); this.dessiner(); }
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 54

Hritage et typage: exemple 2


ObjGraph dessiner()

Figure Point2D Origine dessiner()

Diagramme
ArrayList<ObjGraph> elements dessiner() ajouter(ObjGraph) supprimer(ObjGraph)

Cercle

Rectangle

dessiner()

dessiner()

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

55

Exemple 2 (suite)
Diagramme d = new Diagramme(); Point2D p = new Point2D(0,0); d.ajouter(new Cercle(p, Math.Pi)); d.ajouter(new Rectangle(p, 3.0, 5.0)); Diagramme d2 = new Diagramme(); d2.ajouter(d); d2.ajouter(new Cercle(p, 5.0)); d2.dessiner(); public void dessiner() { for(ObjGraph o: elements) { o.dessiner(); } } // dans Diagramme // quelle dessiner() ??

public void supprimer(ObjGraph p) { for(ObjGraph o: elements){ if (o.equals(p)) // quelle equals() ?? }


IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 56

Exemple 2 (fin)
La classe ObjGraphique (de mme que Figure) ne sert qu donner un cadre (type) commun aux sous-classes et dclarer les mthodes qui devront tre redfinies (notion de classes et mthodes abstraites) Rien nempche une classe abstraite davoir aussi des mthodes concrtes Dynamiquement, il nexiste que des instances des classes concrtes (Diagramme, Cercle, Rectangle) On na pas besoin de savoir la classe relle de lobjet sur lequel on travaille, du moment quil dispose des bonnes mthodes
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 57

La visibilit protected
public class C { protected int val; private int v2; } public class C2 extends C { public void f(C arg, C2 arg2) { this.val = 1; // OK (val est protected) this.val2 = 0; // KO (val2 est private) arg2.val = 1; // OK (val est protected, arg2 de classe C2) arg.val = 1; // KO (arg est de classe C, pas C2) } }

Il restera un quatrime niveau de visibilit voir !

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

58

Hritage et constructeurs
Les constructeurs ne sont pas hrits mais il existe un protocole pour effectuer les initialisations en cascade en remontant la hirarchie de classes dans Figure:
protected Figure(Point2D p) { origine = p; }

dans Rectangle:
public Rectangle(Point2D p, double long, double larg) { super(p); // Premire instruction ! longueur = long; largeur = larg; }

Mthodologiquement un constructeur ne devrait soccuper que des attributs dfinis son niveau.
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 59

Les classes abstraites


Classe abstraite = une classe sans instances ! Racine pour une hirarchie dans laquelle les sous-classes apporteront leurs particularits Permet de partager certaines descriptions : Variables dinstances (ou de classes) communes Mthodes dfinissant un comportement par dfaut Mthodes abstraites redfinir par les sous-classes Mthode abstraite = une mthode dont on donne uniquement le profil et qui devra tre redfinie dans toute sous-classe instanciable Toute classe qui a une mthode abstraite doit tre dclare abstraite Une mthode dune classe abstraite nest pas forcment abstraites Le compilateur interdit linstanciation des classes abstraites.

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

60

Hritage et typage (suite)


On a parfois besoin de la conversion de la super-classe vers la sousclasse :
cela doit tre explicite : c = (Cercle) fig; cela choue la compilation si la conversion na pas de sens cela peut chouer lexcution (leve dune exception) : si fig ne contient pas lexcution une instance (au sens large) de Cercle. Rectangle monR = new Rectangle(); Figure fig; Cercle monC; monC = (Cercle) monR; fig = monR; monC = (Cercle) fig; // KO la compilation car dsespr ! // toujours OK // OK la compilation, KO lexcution

le compilateur ajoute donc le code qui fera la vrification lexcution.

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

61

Hritage ou Composition
Il existe deux moyens de rutiliser une classe :
par hritage (Cercle hrite de Figure) par composition : avoir comme attribut un objet dune autre classe, comme Point2D qui est utilise dans Figure.

Les deux moyens ont des usages diffrents ! Autre exemple: dfinition de points colors :

class PointColore { Point2D lePoint; Couleur laCouleur; }


IFIPS-FC- 09-10

class PointColore extends Point2D {

???

Couleur laCouleur; }

Frdric Voisin - Introduction Java

62

Hritage ou Composition (suite)


Hritage : relation est une sorte de .
La classe drive est vue comme une extension, ou comme une spcialisation de la super-classe. Elle offre de nouveaux comportements et/ou en redfinit. Tous les comportements dfinis dans la super-classe et visibles sont applicables aux instances de la sous-classe. Super-classe et sous-classe doivent tre smantiquement et structurellement compatibles .

Hritage ? Seulement si
on veut rendre accessibles toutes les mthodes (non protected) de la super-classe les structures sont compatibles (nombre et type des champs)

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

63

Hritage ou Composition (suite)


Composition : relation est compose de : La classe rutilise participe limplantation de la classe considre mais les deux ne sont pas compatibles.
Les mthodes ne sont pas vraiment relies. Pour rutiliser , on dlgue: Figure.move(dx, dy) { origine.move(dx, dy); } F.getX() na pas de sens si F est une instance de Figure. Les membres de la classe compose ne sont pas visibles a priori : par exemple Point2D devra avoir prvu des mthodes (publiques) daccs aux coordonnes de l origine.

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

64

Hritage ou Composition (fin)


Exercice : A posteriori, quelles relations entre Figure et Point ? Figures / ObjetGraphique / Diagrammes ? Point2D et Point3D ? Point et PointColor ? Date, Intervalle et Dure ?

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

65

Hritage, surcharge et redfinition


une mthode de la sous-classe ne redfinit (et masque) que la mthode de la super-classe de mme profil : public boolean equals(Point2D) { } // dans Point2D ne redfinit pas et ne masque pas public boolean equals(Object 0) { } // dans Object Selon le type (statique) du paramtre on obtiendra lune ou lautre :-( Ne pas confondre surcharge et redfinition de mthodes, ni aspect statique et dynamique :
surcharge : plusieurs mthodes de mme nom mais de profils diffrents redfinition : cas particulier de surcharge en conservant exactement le profil et en prsence dune relation dhritage.
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 66

Hritage, surcharge et redfinition (suite)


A la compilation, on dtermine la famille (i.e. ensemble des redfinitions dans une hirarchie donne) de mthodes potentiellement appelables, compte-tenu de la surcharge A lexcution, la liaison dynamique appelle la bonne mthode dans la famille dtermine statiquement, selon la classe du receveur. La liaison dynamique se fait donc profil constant , le profil ayant t dtermin la compilation, selon le type des paramtres

IFIPS-FC- 09-10

Frdric Voisin - Introduction Java

67

Hritage, surcharge et redfinition (exercice)


class Object public boolean equals(Object P)

class Point2D public boolean equals(Object P) public boolean equals(Point2D P) class PointColore public boolean equals(Object P) public boolean equals(Point2D P) public boolean equals(PointColore P)

class A public boolean equals(Object P) public boolean equals(A monA)

Dterminez les familles de mthodes...


IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 68