Vous êtes sur la page 1sur 346

PPOOGL

Florent de Dinechin

Java pour les nuls (et les physiciens)

Java en 30 minutes

1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

Introduction
1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

La premi`re fois que vous mettez votre main dans le java e

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class javac Toto.java cre Toto.class (le c cest pour compilo) e

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class javac Toto.java cre Toto.class (le c cest pour compilo) e java Toto lance la mthode main de Toto.class dans la e machine virtuelle.

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class javac Toto.java cre Toto.class (le c cest pour compilo) e java Toto lance la mthode main de Toto.class dans la e machine virtuelle. Si on faisait une applet, cest pas une mthode main quil e faudrait.

La premi`re fois que vous mettez votre main dans le java e Fichier source Toto.java, chier objet Toto.class javac Toto.java cre Toto.class (le c cest pour compilo) e java Toto lance la mthode main de Toto.class dans la e machine virtuelle. Si on faisait une applet, cest pas une mthode main quil e faudrait. Et voici le code source : class Hello { // pas dattributs ni de mthodes, sauf e // la mthode main, statique. e // cela veut dire quoi, statique, dja ? e public static void main(String[] args) { System.out.println("Hello, java ?"); } }
3

Grands principes
1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

Les trucs reposants Une classe, un chier

Les trucs reposants Une classe, un chier

Pas de chiers .h

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e


Si cela se trouve, cest mme mieux que Caml e

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e


Si cela se trouve, cest mme mieux que Caml e

Edition de lien dynamique

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e


Si cela se trouve, cest mme mieux que Caml e

Edition de lien dynamique


Lorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e


Si cela se trouve, cest mme mieux que Caml e

Edition de lien dynamique


Lorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e


Si cela se trouve, cest mme mieux que Caml e

Edition de lien dynamique


Lorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u Pas dditeur de lien e

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e


Si cela se trouve, cest mme mieux que Caml e

Edition de lien dynamique


Lorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u Pas dditeur de lien e Pas de Makefile (je lai dj` dit ?) ea

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e


Si cela se trouve, cest mme mieux que Caml e

Edition de lien dynamique


Lorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u Pas dditeur de lien e Pas de Makefile (je lai dj` dit ?) ea Les chemins pour la compilation, pour ldition de liens et pour e lexcution sont les mmes. e e

Les trucs reposants Une classe, un chier

Pas de chiers .h La doc du code nest plus le chier .h, cest une vraie doc cre e
par javadoc

Pas besoin de Makefile ni dautoconf Pas de bug d au prprocesseur u e


Si cela se trouve, cest mme mieux que Caml e

Edition de lien dynamique


Lorsque la machine virtuelle a besoin de crer un objet de e classe Toto, elle charge Toto.class Il faut quelle sache o` le trouver (on verra plus loin) u Pas dditeur de lien e Pas de Makefile (je lai dj` dit ?) ea Les chemins pour la compilation, pour ldition de liens et pour e lexcution sont les mmes. e e Performance : des acc`s disques (et mme rseau) cachs au e e e e milieu de votre programme
5

Applet et application applet (en franais appliquette ou programmouillette) : c destin ` tourner dans une fentre de navigateur chez des ea e gens quon ne connait mme pas e drive dune classe qui en principe prot`ge la machine hte e e o (sandbox)
pas dcriture ni de lecture du disque local e par contre acc`s en lecture ` tous les chiers du Ternet par e a leur url

Applet et application

application (en franais application) c pas les restriction prcdentes e e un navigateur na pas plus le droit de la lancer quun autre excutable e

Applet et application applet (en franais appliquette ou programmouillette) : c destin ` tourner dans une fentre de navigateur chez des ea e gens quon ne connait mme pas e drive dune classe qui en principe prot`ge la machine hte e e o (sandbox)
pas dcriture ni de lecture du disque local e par contre acc`s en lecture ` tous les chiers du Ternet par e a leur url

application (en franais application) c pas les restriction prcdentes e e un navigateur na pas plus le droit de la lancer quun autre excutable e Applications et appliquettes partagent le gros de la biblioth`que e standard, notamment lawt (abstract windowing toolkit).
6

Au fait

JavaScript na rien ` voir avec Java ` part la syntaxe supercielle : a a cest un langage interprt, plein de trous de scurit, pas OO pour ee e e un sou, et quon laissera volontiers aux authentiques kakous.

Javadoc

Un outil qui prend du code bien document, et construit une e doc html toute jolie Les commentaires pour Javadoc sont entre /** ... */ Un commentaire de ce type par mthode, attribut, classe, etc. e Ligne de commande : javadoc Toto.java Les docs de rfrence des classes standard du langage sont ee construites comme cela

Javadoc

Un outil qui prend du code bien document, et construit une e doc html toute jolie Les commentaires pour Javadoc sont entre /** ... */ Un commentaire de ce type par mthode, attribut, classe, etc. e Ligne de commande : javadoc Toto.java Les docs de rfrence des classes standard du langage sont ee construites comme cela Exemple de commentaire de lan dernier : /** * classe Cartes */ public class Cartes extends Remote ...
8

Pour en nir avec lorganisation


1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

Paquetages

10

Paquetages Un paquetage cest comme un module en Caml.

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e Exemples tirs des biblioth`ques standard : e e java.applet java.math java.io java.awt java.awt.image java.awt.event

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e Exemples tirs des biblioth`ques standard : e e java.applet java.math java.io java.awt java.awt.image java.awt.event On dclare quune classe Toto fait partie dun paquetage e projetLala.tata en mettant tout au dbut de Toto.java : e package projetLala.tata ;

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e Exemples tirs des biblioth`ques standard : e e java.applet java.math java.io java.awt java.awt.image java.awt.event On dclare quune classe Toto fait partie dun paquetage e projetLala.tata en mettant tout au dbut de Toto.java : e package projetLala.tata ; En labsence dune telle ligne, la classe fait partie du paquetage par dfaut, constitu de e e
lensemble des classes dans le rpertoire courant e lensemble des classes accessibles par la variable CLASSPATH

10

Paquetages Un paquetage cest comme un module en Caml. Les paquetages sont organiss hirarchiquement en rpertoires. e e e Rien ` voir avec la hirarchie des classes. a e Exemples tirs des biblioth`ques standard : e e java.applet java.math java.io java.awt java.awt.image java.awt.event On dclare quune classe Toto fait partie dun paquetage e projetLala.tata en mettant tout au dbut de Toto.java : e package projetLala.tata ; En labsence dune telle ligne, la classe fait partie du paquetage par dfaut, constitu de e e
lensemble des classes dans le rpertoire courant e lensemble des classes accessibles par la variable CLASSPATH

On peut ranger un paquetage dans une archive zip, qui sappellera dailleurs jar, mais il faut lire le manuel.
10

Paquetages et nommages Le nom complet dune classe est paquetage.Classe

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membre

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membre
la fonction sinus : java.lang.Math.sin(x)

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membre
la fonction sinus : java.lang.Math.sin(x) la variable ` lunicit plantaire : a e e
com.projetMIM2002.www.lala.test.RandomTest.nombreErreurs

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membre
la fonction sinus : java.lang.Math.sin(x) la variable ` lunicit plantaire : a e e
com.projetMIM2002.www.lala.test.RandomTest.nombreErreurs

Si on a la emme de taper tout cela tout le temps dans Toto.java, on peut importer une fois pour toutes, au dbut e de ce chier,
une classe : import java.lang.Math ; ou bien toutes les classes dun paquetage : import java.lang.* ;

11

Paquetages et nommages Le nom complet dune classe est paquetage.Classe Unicit plantaire des noms par lURL renverse : e e e com.projetMIM2002.www.lala.test Le nom complet dun membre est paquetage.Classe.membre
la fonction sinus : java.lang.Math.sin(x) la variable ` lunicit plantaire : a e e
com.projetMIM2002.www.lala.test.RandomTest.nombreErreurs

Si on a la emme de taper tout cela tout le temps dans Toto.java, on peut importer une fois pour toutes, au dbut e de ce chier,
une classe : import java.lang.Math ; ou bien toutes les classes dun paquetage : import java.lang.* ;

On nest pas dispens de taper Classe.membre ou e objet.membre... Exemple Math.sin(x).


11

Quelques conventions

Tout le monde appelle ses classes avec une majuscule. Du coup les chiers aussi. Les membres de la plupart des programmeurs sont minuscules. Vous faites bien ce que vous voudrez.

12

Porte des classes, porte des identicateurs e e

13

Porte des classes, porte des identicateurs e e

Dans le corps dune mthode, cest comme en C. e

13

Porte des classes, porte des identicateurs e e

Dans le corps dune mthode, cest comme en C. e Dans le corps dune classe, un membre peut tre e
public : tout le monde le voit mme en dehors de la classe e private : visible uniquement ` lintrieur de la classe a e protected : visible dans la classe, ses sous-classes, et le paquetage rien du tout : visible dans le paquetage

13

Porte des classes, porte des identicateurs e e

Dans le corps dune mthode, cest comme en C. e Dans le corps dune classe, un membre peut tre e
public : tout le monde le voit mme en dehors de la classe e private : visible uniquement ` lintrieur de la classe a e protected : visible dans la classe, ses sous-classes, et le paquetage rien du tout : visible dans le paquetage

Dans un paquetage, une classe peut-tre e


public : tout le monde le voit mme en dehors du paquetage e rien du tout : visible dans le paquetage seulement

13

Porte des classes, porte des identicateurs e e

Dans le corps dune mthode, cest comme en C. e Dans le corps dune classe, un membre peut tre e
public : tout le monde le voit mme en dehors de la classe e private : visible uniquement ` lintrieur de la classe a e protected : visible dans la classe, ses sous-classes, et le paquetage rien du tout : visible dans le paquetage

Dans un paquetage, une classe peut-tre e


public : tout le monde le voit mme en dehors du paquetage e rien du tout : visible dans le paquetage seulement

Vous trouverez plein dexemples sur le Ternet.


13

Types de base et objets


1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

14

Les faciles Entiers signs de direntes tailles : byte (8 bits), short e e (16), int (32), long (64) Nombres en virgule ottante : float et double boolean qui vaut true ou false char est un caract`re Unicode (sur 16 bits !) e Tous ces types ont une valeur initiale spcie par le langage, e e mais javac fait des warning si on ne les initialise pas.
class HelloHello { public static void main(String[] args) { int i; for(i=0; i<10; i++) { System.out.println("Hello, java, " + i + " fois?"); } } }
15

Les objets

import java.awt.*; class HelloLaFenetre { public static void main(String[] args) { Frame objet_fenetre; objet_fenetre = new Frame("Hello, java ?") ; objet_fenetre.setSize(300,100); objet_fenetre.setVisible(true); } }

16

La vraie classe

import java.awt.*; public class ObjetHello { private Frame fenetre; public void construit(String titre){ fenetre = new Frame(titre) ; fenetre.setSize(300,100); fenetre.setVisible(true); } //constructeurs public ObjetHello(){ construit("Hello, java ?"); } public ObjetHello(String titre){ construit(titre); } // Pas besoin de main() ici } } } //import java.awt.*; // plus besoin ici public class ProjetHello { public static void main(String[] args) { // un objet que cest moi qui lai fait ObjetHello uoqcmqlaf; uoqcmqlaf = new ObjetHello(); uoqcmqlaf = new ObjetHello("Youpi!");

17

Hritage e Reprenons cet UML bcl : a e


straterisk

jeu

Plateau
+cases: Case[][] = +tour_de_jeu(): void +afficher(): void +enregistrer(): void +charger(): void

armee

Unite
terrain +force_de_frappe: int +dessine_toi(): void

Case
+occupants: Unite[] +meteo: Meteo +dessine_toi(): void +dessine_tes_occupants(): void

UniteAerienne

UniteNavale

UniteTerrestre

Mer
+dessine_toi(): void

Terre
+facilite +dessine_toi(): void

Desert
+dessine_toi(): void

Plaine

Montagne

18

Hritage e et passons-le ` dia2code a


package straterisk.terrain; import straterisk.terrain.Case; package straterisk.terrain; import straterisk.jeu.Plateau; public abstract class Case { /** Attributes */ public Unite[] occupants; public Meteo meteo; /** Associations */ private Plateau; /** * Operation * */ abstract public void dessine_toi ( ); /** * Operation * */ public void dessine_tes_occupants ( ){ } } public class Terre extends Case { /** Attributes */ public facilite; /** * Operation * */ public void dessine_toi ( ){ } } package straterisk.terrain; import straterisk.terrain.Terre; public class Desert extends Terre { /** * Operation * */ public void dessine_toi ( ){ } }

19

Remarques sordides

dia2code cest pas encore cela Il g`re bien les import et package dans le code source, mais e ne construit pas la hirarchie des rpertoires e e La version du CRI est un peu vieille Utilisable uniquement en phase initiale Mais bon, cela vous oblige ` bien rchir votre mod`le objet a e e e avant de coder...

20

Retour aux types de base : les bizarres

String est une classe dobjets (majuscule...) mais avec du sucre syntaxique dans le langage pour le constructeur, la concatnation (+), ... e int i,j ; String errorMessage ; (...) errorMessage="Feature not implemented, because we started the project two days before the deadline" ; Mthodes dune cha : errorMessage.length(), et plein e ne dautres. Il y a aussi des cha nes de taille variable (StringBuffer), etc

21

Retour aux types : les bizarres (2) Les tableaux sont aussi des objets avec du sucre syntaxique et smantique (classe paramtre). e e e
public class SpaceHello { public static void main(String[] args) { ObjetHello[] plein_de_fenetres; if(args.length == 0) System.err.println("Usage: java SpaceHello text "); else { int i; plein_de_fenetres = new ObjetHello[args.length]; for(i=0; i<args.length; i++) plein_de_fenetres[i] = new ObjetHello(args[i]); } } }
22

Le reste est dans le manuel


1 Introduction 2 Grands principes 3 Pour en nir avec lorganisation 4 Types de base et objets 5 Le reste est dans le manuel

23

Rfrences ee

Le site de Sun
Des tutoriels La doc de rfrence sur le langage (on sen passe bien) ee La doc de rfrences sur les classes standard (` parcourir ee a absolument !) le tout tlchargeable pour pouvoir partir en vacances avec ee

Plein de bouquins ` la biblioth`que a e Celui de Brondeau en franais c

court en franais c
un peu l`ge sur lOO e

24

Le langage Java - Syntaxe


LES BASES: litraux, types, expressions, instructions
LE LANGAGE JAVA - SYNTAXE LES COMMENTAIRES LES IDENTIFICATEURS LISTES DES MOTS RSERVS: LES LITRAUX BOOLENS LA DCLARATION DES VARIABLES TYPE SIMPLE VS COMPOS VECTEURS ET MATRICES VISIBILIT DES VARIABLES OPRATEURS TABLE DE PRCDENCE LASSIGNATION EXPRESSION... OPRATEUR DALLOCATION CONVERSION DE TYPE

1 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Les commentaires
Trois manires de crer des commentaires en JAVA. /* ... */.
/* ceci est un commentaire sur plusieurs lignes ... qui se termine ici */

//...
int i // ceci est une variable entire

/** et */. Ce commentaire est rserver dans les dclarations en vue dune documentation automatique

2 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

bonnes habitudes
Il faut absolument commenter les programmes. crit une seule fois relu des dizaines de fois, une reformulation de la spcification du programme

mauvais commentaire
int zoom=2 // zoom 2

aucun renseignement sur le rle de zoom et pourquoi 2. commentaire OK


int zoom=2 // valeur par dfaut du zoom au dmarrage

3 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Les identificateurs
nommer: les variables, les classes les mthodes les packages, ... des programmes JAVA.

identifier = "dans {a..z, A..Z, $, _}" < " dans {a..z,$,_,0..9,unicode character over 00C0}" > . des caractres a..z ou A..Z, des chiffres de 0 9 les _ et $ et les caractres Unicode suprieure 0X00C0. caractres nationaux tels que: , , ...
exemples didentificateur valides:
$valeur_system dateDeNaissance ISO9000

exemples didentificateur non-valides:


a 9neuf note# long // // // // comme premier caractre 9 comme premier caractre # pas au dessus de 0X00C0 OK mais cest un mot rserv!

4 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

listes des mots rservs:

Abstractboolean atchchar dodouble floatfor instanceofint packageprivate staticsuper threadsafethrow while

break class else goto2 interface protected switch transient

byte const2 extends if long public synchronized true

byvalue1 casec continue default false finally implementsimport native newnull retrun short this try void

Donc un identificateur ne doit pas tre un mot de cette liste.

1.

rserv, mais pas actuellement utilis

5 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

bonnes habitudes
ne pas utiliser le $ et le _ si vous devez utiliser des librairies en C; de ne pas utiliser le $ en premire position; de sparer les noms composs en capitalisant la premire lettre des noms partir du deuxime mot.

conseill
nomDeMethode ceciEstUneVariable

acceptable
nom_de _methode ceci_est_une_variable

dconseill
$init _type

6 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Les litraux
Les litraux dfinissent explicitement les valeurs sur lesquelles travaillent les programmes JAVA. trois catgories de litraux: les boolens, les nombres, les caractres.

7 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

boolens
false true initialiser des variables boolennes (Attention: ne peut tre assimile un 0 ou 1 comme dans le cas des langages C ou C++)

boolean resultatAtteint = false ; boolean continuer = true ;

8 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

entiers

trois formats: en dcimal, en octal, hexadcimal.

en dcimal ne commence jamais par un zro.


int nbrDeMois = 12;

Pour en octal, prcd dun zro.


int nbrDeDoigts = 012; // =10 en dcimal

en hexadcimal, prcd dun 0x ou 0X.


int dixHuit= 0x12;

entiers dclars littralement = int sur 32 bits. entier long en lui faisant succder un L (64 bits).

9 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

flottants
une mantisse ventuellement exposant en puissance de 10. obligatoirement un point dcimal ou un exposant

Exemple de flottants sans partie exposant: 2..52.52.0 .001 Exemple de flottants avec partie exposant: 2E02E32E-3.2E32.5E-3

Les nombres flottant dclars = float sur 32 bits. flottant double prcision, succder un D (64 bits) flottant float , succder un F ( 32 bits)
3.14F3.14159D

10 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

caractres
caractre / deux apostrophes (quotation simple):
xa4

lensemble des caractres Unicode (16bits)

caractre
continuation Nouvelle ligne tabulation retour arrire retour chariot saut de page backslash apostrophe guillemet caractre octal caractre hexadcimal caractre Unicode

abrviation
<nouvelle ligne> N HT BS CR FF \ " 0377 0xFF 0xFFFF

sque nce
\ \n \t \b \r \f \\ \ \" \377 \xFF \uFFFF

11 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

chanes de caractres
suite de caractres entoure de guillemets, type String. constitue une classe un vecteur de caractres.

la chaine de caractre
"" "\"" "texte sur 1 ligne" "texte sur 1 ligne \dfini sur 2 lignes" "texte sur 1 ligne \n crit sur 2 lignes"

le rsultat si on limprime
" texte sur 1 ligne texte sur 1 ligne dfini sur 2 lignes "texte sur 1 ligne crit sur 2 lignes"

12 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

La dclaration des variables


obligatoirement une dclaration. Le compilateur vrifications de compatibilit de type dans les expressions, visibilit de la variable, etc. augmenter la qualit des programmes dtecter des erreurs la compilation dtecter au moment de lexcution.

prfixer le nom de la variable par son type


int i; int i,j,k;

modifier la dfinition de la variable final = une constante.


final int NbreDeRoues=4; final float pi=3.14159;

13 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Type simple vs compos

Les types simples les boolens, les entiers ... types composs, construits partir dautres types les vecteurs, matrices, classes, interfaces.

14 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

boolens
dfinit une variable dont le contenue sera vrai ou faux. assigne false true rsultat dune expression logique

boolean voitureArretee=true;

15 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

entiers
quatre types dentier: byte, short, int long.

type entier
byte short int long

nombre de bits
8 16 32 64

exemples
byte NbrEnfant; short VolumeSon; int i,j,k; long detteSecu;

assigne les littraux entiers le rsultat dune expression entire.

16 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

flottants
deux types de flottant: float double

type flottant
float double

nombre de bits
32 64

exemples
float ageMoyen; double pi;

assigne les littraux flottant rsultat dune expression flottante.

17 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

caractres
une valeur de lensemble Unicode de caractres assigne les littraux caractre le rsultat dune expression caractre.
// le sparateur est un tabulateur char separateur="\t";

Le caractre en JAVA est reprsent sur 16 bits. Il ne sert qu conserver la valeur dun seul caractre. Les chanes sont reprsentes par la classe String.

18 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

vecteurs et matrices
post-fixer le type ou la variable par [ ].:
int i[ ]; // vecteur dentiers int[ ] j; // j le mme type que i char motsCroises[ ][ ]; // une matrice de caractres

pas contraints au moment de la dclaration. Lallocation au moyen dune mthode new

19 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

visibilit des variables


La variable est visible lintrieur du bloc o elle est dfinie. un bloc est dfinit comme lensemble des instructions comprises entre deux accolades { } .
class Test { // debut de test public static void principal(String args[]) { // debut de principal float x ... } // fin de principal public void methodeA () { // debut de methodeA char c ... } // fin de methodeA

Test principal x methodeA c


} // fin de principal

20 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

redfinition des variables


si dans un bloc on redfinit une variable existant dans un bloc suprieur, cette nouvelle variable masque la variable suprieur lintrieur de ce bloc (donc aussi pour ses sous-blocs).
class Test { // debut de test public static void principal(String args[]) { // debut de principal float echange; int a,b; ... if a < b then { int echange; echange=a;a=b;b=echange }; } // fin de principal public void methodeA () } // fin de principal

Test principal a,b,echange bloc du if echange

21 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

rserve des variables temporaires indice dune boucle.

22 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Oprateurs
regroups par type dopration: numrique, de comparaison, logique, sur les chanes de caractres, de manipulations binaires. le nombre doprandes : unaire, binaire ternaire. values de la gauche vers la droite, une table de prcdence ,la priorit entre les oprations.
x=z+w-y/(3*y^2)

on a = + / () par ordre de lecture La table de prcdence => () / + - =. Dans la (), on a * ^ par odre de lecture, lordre dexcution est aussi *^.

23 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

table de prcdence
(de la plus haute la plus basse). Les oprateurs de mme niveau depuis la gauche.
. ++ * + << < == & ^ && || ?: = , [] -/ >> > != () ! % >>> <= ~ instanceof

>=

op=

24 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

lassignation
Lassignation assigne lexpression de droite, lexpression de gauche (une variable). oprateur binaire qui modifie son oprande gauche.
j=2; // expression dassignation dun litral i=j*3; // expression dassignation dune expression i=j*3(j=2); // expression valide combinant les deux

Cette dernire expression a pour rsultat i=6! effets de bord: ~, ++ , -dans une mme expression rend confus la lecture. dcomposer les expressions un seul oprateur avec effet de bord.

25 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

expression numrique

les oprateurs unaires


++ --

action
ngation incrmentation de 1 dcrmentation de 1

exemple
i=-j; i++; i--;

++ et -- peuvent prfixer ou postfixer la variable.


++i; // est quivalent i++;

26 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

expression numrique ...


les oprateurs binaire action
+ += -= * *= / /= % %= modulo addition

exemple
i=j+k i+=2; // i=i+2 i=j-k; i-=j; // i=i-j x=2*y x*=x; // x=x*x i=j/k; x/=10; // x=x/10 i=j%k; i%=2; // i=i%2

soustraction

multiplication

division (tronque si les arguments sont entiers)

la division par 0 et le modulo par 0 gnre une exception lexcution. Les oprations dont la reprsentation dpasse le maximun du type de lentier dbordent dans les entiers ngatifs. Pour les flottant, les oprations mme smantique. ++ et -- on ajoute 1.0. Le % modulo appliqu au flottant prend le sens de la division dans les entiers. la division par 0 et le modulo par 0 gnre la valeur inf. Les oprations dont la reprsentation dpasse le maximun du type gnre la valeur inf. Les dbordements vers linfinement petit gnre 0.

27 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Le programme TestNumber
class TestNumber{ public static void main (String args[]) { int i=1000, j=1000; float x=1, y=1; for (int k=0; k<100;k++) { i*=10; j/=10; x*=10000; y/=10000; System.out.println("\ni="+i+" j="+j+" x="+x+" y="+y); } } } i=10000 j=100 x=10000 y=0.0001 i=100000 j=10 x=1e+08 y=1e-08 i=1000000 j=1 x=1e+12 y=1e-12 i=10000000 j=0 x=1e+16 y=1e-16 i=100000000 j=0 x=1e+20 y=1e-20 i=1000000000 j=0 x=1e+24 y=1e-24 i=1410065408 j=0 x=1e+28 y=1e-28 i=1215752192 j=0 x=1e+32 y=1e-32 i=-727379968 j=0 x=1e+36 y=1e-36 i=1316134912 j=0 x=Inf y=9.99995e-41 i=276447232 j=0 x=Inf y=9.80909e-45 i=-1530494976 j=0 x=Inf y=0 i=1874919424 j=0 x=Inf y=0 ...

28 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Oprateurs relationnels
tester tous les types avec une relation dordre: entiers, rels, caractres, ...

les oprateurs relationnels


< > <= >= == !=

action
plus petit que plus grand que plus petit ou gal que plus grand ou gal que gal diffrent de

exemple
x<i; i>100; j<=k; c>=a; i==20; c!=z;

ATTENTION relation dordre sur les flottants, x==y peut tre vrai y<x || y>x soit forcement vrai. loprateur == confondu avec =

29 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateurs logiques
oprandes boolennes. Les quatres oprateurs de base sont: ! la ngation, & le ET, | le OU ^ le OU exclusif.

Table de vrit des oprateurs logiques


p v v f f q v f v f !p f f v v p&q v f f f p|q v v v f p^q f v v f

30 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateurs logiques ...


forme assigne (sauf pour la ngation) donc:
p&=(i=10); // est quivalent p=p&(i<10)

valuation raccourcie pour le ET et le OU: && et ||. Lvaluation de lexpression logique est stoppe ds que sa valeur de vrit peut tre assure.
p1 && p2 && ... & pn

lvaluation est stoppe si pi est value faux. Dans le cas:


p1 || p2 || ... || pn

lvaluation est stoppe si pi est value vrai. permet dviter une erreur
i!=0 && x > ( y/i);// y/i nest pas valu si i gale 0

JAVA possde aussi une expression ternaire de la forme:


p?e1:e2;

Si p est vrai alors lexpression e1 est value sinon e2 est value. lassignation tant une expression, il est possible de lutiliser comme une instruction if.
if (p) e1; else e2; // est quivalent p?e1:e2;

31 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateurs logiques ...


les oprateurs logiques
! & | ^ && || != &= |= ?:

action

exemple

ngation ET OU OU exclusif ET valu OU valu ngation assigne ET assign OU assign Si alors sinon

!p; p & (i<10) p | q p ^ false p && q && r p || q || r p!=p; p&=q // p= p & q p|=q // p= p | q (i<10)?(j=2):(j=3)

Les oprateurs !, &, |, et ^ sont tendus des oprations de manipulation binaire sur les bits des oprandes entires. Pour chaque bit des entiers p et q, on utilisera la table de vrit des oprations, en substituant vrai 0 et faux 1.

32 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateurs sur les chanes de caractres

Concatnation + assignation += Les oprandes sont automatiquement converties.


System.out.println("\ni="+i+" j="+j+" x="+x+" y="+y);

les action oprateurs de concatnati on


+ += concatnation ajoute la fin

exemple

"conca"+"tnation";

s+=" la fin"; // s=s+" la fin"

33 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateurs de manipulation binaire

manipulations &, |, ^ dcalages binaires (deux oprandes): valeur binaire sur laquelle on effectue le dcalage le nombre de dcalages effectuer. On a donc:
i>>k; // decaler i vers la droite de k bits avec son signe i<<k; // decaler i vers la gauche de k bits i>>>k; // decaler i vers la droite de k bits sans signe

version assigne. les action oprateurs de manipulati on binaire


<< >> >>> <<= >>= >>>= dcalage gauche dcalage droite sign dcalage droite non sign dcalage gauche assign dcalage droite sign assign dcalage droite non sign assign

exemple

i<<n; i>>4; i>>>2; k<<=n; k>>=n; k>>>=n;

34 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Equivalence ...
opration de manipulation binaire les oprations arithmtiques sur les entiers. Pour i entier, on a: ~iest quivalent (i-1)-1 i>>kest quivalent i/2k si i>0 i<<kest quivalent i*2k i>>>kest quivalent i/2k si i>0 i>>>kest quivalent (i<<k)+(2<<(L-k-1) si i<0 o L=32 si i est int et L=64 si i est long;

35 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateur dallocation

Loprateur dallocation new crer un objet instance dune classe crer et de fixer les dimensions des vecteurs dclarer un vecteur, pour fixer sa taille:
// i un vecteur de 100 entiers int i[] = new int [100]; // c une matrice de 10 par 10 int c[][] = new char[10][10];

Les indices des vecteurs commencent 0,


i[0] = 1; //la premire position de i initialise 1 i[9] = 10; //la dernire position de i initialise 10 c[0][0]=a; // premire case de c c[9][9]=z; // dernire case de c

36 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

oprateur dallocation ...


Seule la premire dimension doit tre contrainte pour un type ayant plusieurs dimensions.
int c[][] = new char[10][]; //c une matrice de 10 par ?

Les autres dimensions dclare lexcution:


c[0] = new char [24]; // premire ligne de c = 24 caractres

Les dimensions variables:


c[1] = new char [12]; // deuxime ligne de c = 12 caractres

Dune manire gnrale, une allocation peut tre dune variable de dimension n peut tre vue comme une serie de n-1 boucles imbriques effectuant chaque allocation.
int c[][] = new char[10][10]; // est quivalent : int c[][] = new char[10][]; for (int i=0; i< c.length; i++) //allocation de chaque ligne de c c[i] = new char [10];

37 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

conversion de type

un caractre=> sa valeur entire. ? un entier=> sa valeur comme un ? convertir les valeurs des types int i;
char c c=(int) i // assigne c un caractre de valeur i i=(char) c; //assigne i un entier de la valeur de c

faites explicitement en JAVA possibilit de perdre de linformation:


int i; i == (int) ((float) i); // nest pas toujours vrai

38 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

tableau des conversions sans perte

tablea u des conve rsions sans perte de byte


byte short int oui

short
oui oui

int
oui oui oui

long
oui oui oui

float

double char
oui

oui oui oui oui perte de oui prcisio n perte de perte de prcisio prcisio n n oui oui oui oui

long

oui

float double char

oui

oui

oui

oui

Les autres conversions peuvent tre effectues sans perte dinformation dans certaines conditions, gnralement celles qui restreignent le type le plus large aux valeurs du type le plus troit.

39 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Le langage Java - Syntaxe


LES STRUCTURES DE CONTRLES LE BLOC DINSTRUCTIONS EXCUTION CONDITIONELLE SI ... ALORS ... SINON CASCADER LES CONDITIONS AU CAS O ... TANT QUE ... FAIRE ... FAIRE ... TANT QUE ... POUR ... FAIRE ... IDENTIFIER UNE INSTRUCTION RUPTURE CONTINUATION TESTPREMIER2 ... TESTAMICAUX

Les structures de contrles


les diffrentes stuctures de contrle: le si-alors, le faire-tantque, le tantque-faire, dans-le-cas

Le bloc dinstructions

contenu entre {}. dfinit la visibilit des variables. instruction = bloc dinstructions

Excution conditionelle
Il existe deux formes dexcution conditionnel. le si_alors_sinon et le dans_le_cas.

Si ... alors ... sinon

structure de base de la programmation Lexpression de test boolene (vraie ou fausse) if (e) S1;
if (i==1) s=" i est gal 1 ";

if (e) S1 else S2;


if (i==1) s=" i est gal 1 "; else s=" i est diffrent de 1 ";

De ces deux formes, nous pouvons driver: if (e) {B1};


if (i==1) { s=" i est gal 1 "; i=j; }

if (e) {B1} else {B2};


if (i==1) { s=" i est gal 1 "; i=j; } else { s=" i est diffrent de 1 "; i=1515; }

cascader les conditions


if (e1) S1 else if (e2) S2 ... else Sn;
if (i==1) s=" i est gal 1 "; else if (i==2) s=" i est gal 2 "; else if (i==3) s=" i est gal 3 "; else s=" i est diffrent de 1,2 et 3 ";

Lutilisation de {} est ncessaire marquer le dbut est la fin des instructions;


i=0; j=3; if (i==0) if (j==2) s=" i est gal 2 "; else i=j; System.out.println(i);

Que va imprimer le programme suivant 0 ou 3 ? Il va imprimer 3! car i=0 et j!=2 alors on excute i=j. Le else se rapporte en effet au if le plus imbriqu.

au cas o

switch = un aiguillage. limit char, byte, short ,int. value lexpression qui lui est lie, compare aux case. commence excuter le code du switch OK excute donc tous les instructions des cas suivants. isoler chaque cas, il faut le terminer avec un break. Si aucun cas , clause default case et defautl sont considrer comme des tiquettes. switch (e) { case c1: S1; case c2: S2; ... case cn: Sn; default: Sd }; Examinons la forme gnrale de switch avec break; switch (e) { case c1: S1 break; case c2: S2 break; ... case cn: Sn break; default: Sd };

au cas o ...
class TestSwitch{ public static void main (String args[]) { int i=3; switch (i) { case 1: System.out.println("I"); break; case 2: System.out.println("II"); break; case 3: System.out.println("III"); break; case 4: System.out.println("IV"); break; case 5: System.out.println("V"); break; default: System.out.println( "pas de traduction"); } } }

tant que ... faire ...

Lexpression e doit tre du type boolen. while (e) S1;. while (e) {B1};
class TestWhile{ public static void main (String args[]) { int i=100, somme_i=0, j=0; // boucle 1: expression sans effet de bord while (j<=i) { somme_i+=j; ++j; } System.out.println("boucle 1:"+somme_i); // boucle 2: expression avec effet de bord somme_i=0; j=0; while (++j<=i ) somme_i+=j; System.out.println("boucle 2:"+somme_i); } }

10

faire ... tant que ...

Lexpression e doit tre du type boolen. do S1 while(e); do {B1} while(e);


class TestDo{ /* le rsultat nest pas erron si lon execute une addition de trop si i= 0 ! */ public static void main (String args[]) { int i=100, somme_i=0, j=0; // boucle 1: expression sans effet de bord do { somme_i+=j; ++j; } while (j<=i); System.out.println("boucle 1:"+somme_i); // boucle 2: expression avec effet de bord somme_i=0; j=0; do somme_i+=j; while (++j<=i ); System.out.println("boucle 2:"+somme_i); }
}

11

pour ... faire ...

bas sur un itrateur qui est contrl dans linstruction expression initialise litrateur + le dclare expression teste si la condition dachvement expression modifie litrateur. for (e1;e2;e3) S1;. for (e1;e2;e3) B1; Les expressions e2 et e3 sont optionnelles. Le bloc B1doit modifier litrateur un break pour quitter la boucle. for est quivalent au while e1; while(e2) {S1; e3};

12

pour ... faire ...


class TestFor{ public static void main (String args[]) { int n[] = new int[100]; // boucle 1: calculer la somme des entiers pour // indice du vecteur for (int i=1; i<100; i++) n[i]=n[i-1]+i; // boucle 2: imprimer le rsultat par // ordre dcroissant for (int i=99; i>=0;) { // modification de i dans le bloc dinstructions System.out.println("somme("+i+")="+n[i]); i--; } } }

13

identifier une instruction

identifier une instruction ou un bloc dinstructions instructions de rupture continuation ditration.


class LabelInst{ public static void main (String args[]) { boucle1: for (int i=0;i<10;i++) for (int j=0; j<10;j++){ System.out.println(i+"/"+j); } } }

14

rupture

utilis dans linstruction switch, while, do et for quitter la boucle dans laquelle elle est comprise remonter de plusieurs niveaux
class TestBreak{ public static void main (String args[]) { boucle1: for (int i=0;i<10;i++) for (int j=0; j<10;j++){ System.out.println(i+"/"+j); // quitte la boucle locale if (j==1) break; // quitte la boucle for i ... if (i==2) break boucle1; } } } excution du programme TestBreak: 0/0 0/1 1/0 1/1 2/0

15

rupture ...
Le break quitte le bloc complet dinstruction libell. les clauses finally sont excutes.
class TestBreak2{ public static void main (String args[]) { boucle1:{ for (int i=0;i<10;i++) if (i==2) break boucle1; System.out.println("ne sera pas crit"); } } }

16

continuation

continue est utilise dans while, do et for. interruption du droulement normal de la boucle repris aprs la dernire instruction de la dassocier une tiquette
class TestContinue{ public static void main (String args[]) { boucle1: for (int i=0;i<10;i++) for (int j=0; j<10;j++){ // quitte la boucle locale if (j>1) continue; // quitte la boucle for i ... if (i>2) continue boucle1; System.out.println(i+"/"+j); } System.out.println("en dehors des boucles"); } } excution du programme TestContinue: 0/0 0/1 1/0 1/1 2/0 2/1 en dehors des boucles

17

TestPremier2
Dans le programme TestPremier2, dans la boucle1, nous cherchons tous les nombres premiers jusqu 1100. Nous conservons ces nombres dans un vecteur p. On remarquera : - i+=2; permet dincrmenter par deux. - j<i/j; la condition darrt volue avec lindice. - continue boucle1; interrompt les tests ds quun diviseur de i a t trouv. - seuls sont conservs les nombres nayant pas quitts la boucle prmaturment (donc ayant subit avec succs le test) Dans la boucle2, nous cherchons les intervalles les plus grands sans nombre premier (entre 7 et 11, nous avons un trou de 4). On remarquera : - la boucle portant sur lindice j test la primalit dun nombre en utilisant uniquement les nombres stocks dans le vecteur p (crible dEratosthme). - p[j]<i/p[j]; la condition darrt pour plus directement sur lindice j, mais sur les valeurs rfrences. - continue boucle2; On quitte la boucle de test si lon trouve un diviseur. - quand on trouve un nombre premier, on test sa distance avec le prcdent. Si elle est plus grande que la dernire trouve, alors on limprime.

18

TestPremier2 ...
class TestPremier2{ public static void main (String args[]) { int p[]=new int[200]; int dernierP=1; p[0]=2; p[1]=3; boucle1: for (int i=5;i<1100;i+=2){ for (int j=3; j<i/j;j+=2) if ((i%j)==0) continue boucle1; dernierP++; p[dernierP]=i; } System.out.println("P entre 2 et 1100: "+dernierP); int dp=11, trou=4; boucle2: for (int i=13;i<1000000;i+=2){ for (int j=1; p[j]<i/p[j];j++) if ((i%p[j])==0) continue boucle2; if (i-dp>trou) { trou=i-dp; System.out.println(dp+".."+i+" = "+trou); } dp=i; } System.out.println("fin!"); } }

19

TestPremier2 ...
Lexcution du programme TestPremier2:
P entre 2 et 1100: 193 31..37 = 6 89..97 = 8 139..149 = 10 199..211 = 12 293..307 = 14 887..907 = 20 1129..1151 = 22 1327..1361 = 34 9551..9587 = 36 15683..15727 = 44 19609..19661 = 52 31397..31469 = 72 155921..156007 = 86 360653..360749 = 96 370261..370373 = 112 492113..492227 = 114 fin!

20

TestAmicaux
permet de trouver les nombres amicaux (un nombre dont la somme des diviseurs est gale un autre nombre et vice-versa). Exemple: 220 et 284 sont amicaux somme_div(220)=1+2+4+5+10+11+20+22+44+55+110=284 somme_div(284)=1+2+4+71+142=220 Dans la boucle1, on calcule pour les nombres jusqu 10000, la valeur de la somme de leurs diviseurs que lon mmorise dans un vecteur p. Le code est trs semblable celui de la recherche des nombres premiers sauf quici nous voulons conserver la valeur des diviseurs. Dans la boucle2, on cherche les nombres amicaux. On remarquera : - ((p[i]<10000)&&(p[p[i]]==i)); la condition du test avec abandon, ceci permet de test si la somme des diviseurs est plus grande que 9999, alors on effectue pas le test damiti entre les nombres (dans le cas contraire, il ne faut pas effectuer ce test car on sort des valeurs autorises pour le vecteur p.

21

TestAmicaux ...
class TestAmicaux{ public static void main (String args[]) { int p[]=new int[10000]; int dernierP=1; p[1]=1; p[3]=1; p[5]=1; p[2]=1; p[4]=3; p[6]=6;

// boucle 1 for (int i=7;i<10000;i++) for (int j=1; j<=i/2;j++) if ((i%j)==0) p[i]+=j; // boucle 2 for (int i=2;i<10000;i++) if ((p[i]<10000)&&(p[p[i]]==i)) System.out.println(i+" "+p[i]); System.out.println("fin!"); } }

22

TestAmicaux
Lexcution du programme TestAmicaux:
6 6 28 28 220 284 284 220 496 496 1184 1210 1210 1184 2620 2924 2924 2620 5020 5564 5564 5020 6232 6368 6368 6232 8128 8128 fin!

Les nombres qui sont amicaux avec eux-mmes sont des nombres parfaits! (comme 6, 28, ...).

23

mais o sont les objets?

24

Objets et Programmation

origine des langages orients-objet modularit, encapsulation objets, classes, messages exemples en Java hritage, liaison dynamique

G. Falquet, Th. Estier CUI Universit de Genve

1 / 24

Origine des langages orients objet

structurs

Algol C Pascal (1970)

Simula (1967)

Smalltalk (1973) Modula-2

Ada

Object Pascal C++ Objective C

Eiffel

Ada95 Java
orients objet modulaires

G. Falquet, Th. Estier CUI Universit de Genve

2 / 24

Modularit et Encapsulation
Modularit technique de dcomposition de systmes rduire la complexit dun systme par un assemblage de sous-systmes plus simples russite de la technique dpend du degr dindpendance entre les soussystmes (ou degr de couplage) on appelle module, un sous-systme dont le couplage avec les autres est relativement faible par rapport au couplage de ses propres parties Encapsulation technique pour favoriser la modularit (lindpendance) des soussystmes sparer linterface dun module de son implmentation, interface (partie publique): liste des services offerts (quoi) implmentation (partie prive): ralisation des services (comment) structure de donnes instructions et algorithmes protection des donnes par des rgles (dans les instructions): les modules communiquent par messages, pas par accs aux donnes

G. Falquet, Th. Estier CUI Universit de Genve

3 / 24

Un module

message A

interface
rponse A
ic e A se rv

implmentation
A X B instructions

(daprs G. Falquet 1997)

serv

ice

structure de donnes

G. Falquet, Th. Estier CUI Universit de Genve

4 / 24

Types abstraits
Type classique
ensembles de valeurs possibles

Type abstrait
ensemble doprations applicables

TA rectangle -- Opration de construction:


rect: entier X, entier Y, entier L, entier H --> rectangle; translation: rectangle R, entier DX, entier DY--> rectangle; agrandissement: rectangle R, entier DL, entier DH --> rectangle.

-- Opration daccs
gauche: rectangle R --> entier; haut: rectangle R --> entier; largeur: rectangle R --> entier; hauter: rectangle R --> entier; bas: rectangle R --> entier; droite: rectangle R --> entier.

Smantique => quations


gauche(translation(R, DX, DY)) <==> gauche(R) + DX

G. Falquet, Th. Estier CUI Universit de Genve

5 / 24

Modules + Types abs. => Langage objet


Un objet est un module priv: variables dinstance, code des mthodes public: nom et paramtres des mthodes communication: invocation de mthodes, retour de rsultats Classe = gnrateur dobjet gnre des objets de mme structure localise la dnition de structure et action des objets dnit la visibilit: private , public , etc. Classe --> type abstrait
partie publique --> spcif. (partielle) TA

Classe --> structuration du logiciel liens client/serveur -> statiques (variables) -> dynamiques (mthodes) dcouplage spcication / ralisation -> diffrentes versions de la ralisation

G. Falquet, Th. Estier CUI Universit de Genve

6 / 24

Objet
Une entit contenant des donnes (tat) et des procdures associes (comportement) mthodes variables

Exemple: un objet rectangle

surface 25 105 diagonale

perimetre

hauteur largeur

doubler

Un objet possde une identit unique et invariable.

G. Falquet, Th. Estier CUI Universit de Genve

7 / 24

Messages
Pour utiliser un objet on lui envoie des messages Un message dclenche lexcution dune mthode Une mthode peut envoyer des messages dautres objets objA.m(x,y,z) m objB.k(y,u) i j en Java :
rect1.doubler(); d = rect1.diagonale(); System.out.println(Hello); Longtemps je me suis lev de bonne heure.size(); uneListe.insertAt(12, bien); z = Math.cos(2.45);

n o

p objA

k h objB

Un systme est constitu dobjets qui communiquent entre eux.

G. Falquet, Th. Estier CUI Universit de Genve

8 / 24

Classes
Une classe est un moule pour fabriquer des objets de mme structure et de mme comportement. Un objet est une instance dune classe perimetre

surface

hauteur largeur new

diagonale

doubler surface 6 5 diagonale rect1 doubler perimetre

Rectangle

Une classe C dnit un type C. Une variable de type C peut faire rfrence un objet de la classe C.

G. Falquet, Th. Estier CUI Universit de Genve

9 / 24

Dclaration dune classe en Java


class Rectangle { // variables dinstance int largeur, hauteur; // constructeur Rectangle(int initialL, int initialH) { largeur = initialL; hauteur = initialH; } // mthodes int perimetre() { return 2 * (largeur+hauteur); } int surface() { return largeur*hauteur; } void retaille(double facteur) { largeur = (int)(largeur*facteur); hauteur = (int)(hauteur*facteur); } }

G. Falquet, Th. Estier CUI Universit de Genve

10 / 24

Utilisation dune classe Java


Dclaration de variables
Rectangle r1, r2;

Cration dobjets (instantiation)


r1 = new Rectangle(50, 100); r2 = new Rectangle(32, 150);

Envoi de messages (utilisation)


r2.retaille(1.25); System.out.println( r2.perimetre() );

G. Falquet, Th. Estier CUI Universit de Genve

11 / 24

Rfrences aux objets


Une variable de type C fait rfrence une objet de la classe C.
Rectangle ra, rb; ra = new Rectangle(32, 125); rb = ra // les deux variables font rfrence au mme obj.

Les variables dinstance tablissent des relations entre objets.


class Dessin { Rectangle cadre; Couleur fond; Point[] forme; } ... d = new Dessin(); d.cadre = monRectangle; d.fond = rouge; d.form[0] = point1; d.forme[1] = pointZ; ...

cadre fond forme monRectangle

point1 pointZ ... rouge

G. Falquet, Th. Estier CUI Universit de Genve

12 / 24

Identit et Egalit
Une des difcults de la programmation O-O: distinction objet / valeur ==> identit galit
r1 = new Rectangle(128, 256); r2 = new Rectangle(256, 128); r3 = new Rectangle(128, 256); (r1 == r2) ==> false (r1 == r3) ==> false r1.equals(r2) ==> false r1.equals(r3) ==> true.

Test dgalit (simple) comparaison des variables dinstance (complexe) calcul sur les variables dinstance
class Fraction { private int numerateur, denominateur; public boolean equals(Fraction f) { return (this.numerateur * f.denominateur = this.denominateur * f.numerateur); }

G. Falquet, Th. Estier CUI Universit de Genve

13 / 24

Structures de donnes complexes


Tableaux : dans le langage
Point[] monPolygone = new Point[12];

Tuples / Records / Struct : classe avec variables dinstance


class Adresse { int no; String rue, ville, npostal;}

Ensembles/Listes/Piles/Files : classes de lenvironnement


Vector participants = new Vector(); participants.addElement(joeCool); s = participants.size();

Fonctions/Dictionnaires : classes de lenvironnement


HashTable localisation = new HashTable(); localisation.put(cnTower, toronto); localisation.get(tourEiffel);

Itrateurs:
Enumeration e = localisation.keys(); while (e.hasMoreElements()) { k = e.nextElement(); ... }

G. Falquet, Th. Estier CUI Universit de Genve

14 / 24

Egalit profonde et de surface


class ListeRect { private Reactangle[] lesRectangles; private int nbRectangles;

Egalit de surface si
a.lesRectangles[0] == b.lesRectangles[0] et a.lesRectangles[1] == b.lesRectangles[1] et etc.

Egalit profonde (ou rcursive)


a.lesRectangles[0].equals (b.lesRectangles[0]) et a.lesRectangles[1].equals (b.lesRectangles[1]) et etc.

Proprits maintenir Symtrique: a.equals(b) et b.equals(a) doivent toujours donner le mme rsultat; Rexive: a.equals(a) doit toujour donner true; Transitive: si a.equals(b) et b.equals(c) donnent true alors a.equals(c) doit aussi donner true.

G. Falquet, Th. Estier CUI Universit de Genve

15 / 24

La copie dobjets
Mme genre de questions que lgalit copie de surface
for (i=0; i<nbRectangles; i++) {b.lesRectangles[i] = a.lesRectangles[i]; }

copie profonde
for (i=0; i<nbRectangles; i++) {b.lesRectangles[i] = a.lesRectangles[i].clone(); }

La copie de surface introduit du partage de structure ! copie de surface copie profonde

G. Falquet, Th. Estier CUI Universit de Genve

16 / 24

Sous-classes
Technique de rutilisation
class Point { int x, y; public float distanceOrigine() {...} public float distance(Point pt) {...} } class PointTopographique extends Point { //hrit: int x, y; //hrit: public float distanceOrigine() {...} //hrit: public float distance(Point pt) {...} int alt; public int altitude() {...} public void ajusterAltitude(int a) {...} }

Rutilisation souple ( tout ou rien)

On peut rednir des mthodes


public float distance(Point p) {...}

ou les surcharger
public float distance(PointTopographique p) {...}

=> technique de rsolution des message (late binding)

G. Falquet, Th. Estier CUI Universit de Genve

17 / 24

Suppression des tests de typage


class Piece { String nom; boolean estComposee; //la pice est-elle compose ? int poids; int nbComposantes; Piece [] composantes; ... int poidsTotal() { if (estComposee) { int pt = 0; for (int i = 0; i < nbComposantes; i++) pt += composantes[i].poidsTotal(); return pt; } else return poids; } ...

* Variables inutilises * Code avec des tests de cas

G. Falquet, Th. Estier CUI Universit de Genve

18 / 24

Taxonomie et factorisation
abstract class Piece { String nom; // FACTORISATION abstract int poidsTotal(); void affiche() { // FACTORISATION System.out.println("nom:" + nom + " poids: " + this.poidsTotal()); } } class PieceSimple extends Piece { int poids; int poidsTotal() {return poids;} void affiche() { System.out.println("Pice simple: "); super.affiche(); } } class PieceComposee extends Piece { int nbComposantes; Piece [] composantes; int poidsTotal() { int pt = 0; for (int i = 0; i < nbComposantes; i++) pt += composantes[i].poidsTotal(); return pt; } }

G. Falquet, Th. Estier CUI Universit de Genve

19 / 24

Mcanisme de liaison dynamique


Une variable ou un paramtre de type C peut faire rfrence un objet de C ou dune sous-classe de C. Le choix de la mthode excuter se fait dynamiquement lors de lenvoi dun mesage. p.poidsTotal() si p fait rfrence une PieceSimple excute poidsTotal() de PieceSimple. si p fait rfrence une PieceCompose excute poidsTotal() de PieceCompose. etc. La gestion du typage est laisse au systme dexcution.

G. Falquet, Th. Estier CUI Universit de Genve

20 / 24

Construction dune hirarchie de classe


Conservation de la smantique des mthodes des mthodes de mme nom doivent faire la mme chose
class Rectangle { double perimetre() {return 2*(largeur+hauteur);} ... class RectangleMobile { * double perimetre() {return largeur*hauteur;} // !!!

Crer des abstractions pour factoriser


abstract class Personne {...} class PersonneMorale extends Personne {...} class PersonnePhysique extends Personne {...}

Eviter les hritages lenvers de la spcialisation


class Point {x y ...} * class Carre extends Points {x y c...} * class Rectangle extends Carre {x y c h...}

Un carr nest pas un point, un rectangle nest pas un carr ! Un carr est un rectangle particulier, un point est un carr de taille 0.

G. Falquet, Th. Estier CUI Universit de Genve

21 / 24

Interfaces
Comme une classe abstraite mais sans aucun code de mthodes Dnissent des proprits communes transversalement la

hirarchie des classes Htrarchie dinterfaces (hritage multiple) Dnissent des types Une classe peut implmenter une interface Pour cela elle doit dnir toutes les mthodes de linterface.
interface Vendable { double prix(); double rabais(); void acheter(); } class PieceSimple extends Piece implements Vendable { void affiche(){...} double prix(){return 7.5 * poidsTotal();} double rabais(){return 0.12 * prix();} void acheter(){...} } ... Vendable aVendre; aVendre = maPieceSimple12; x = aVendre.prix();

G. Falquet, Th. Estier CUI Universit de Genve

22 / 24

Outil pour la gnricit


// linterface est un contrat: sengager tre comparable interface Comparable { boolean inferieur(Object c); } // classe capable de traiter tout objet respectant le // contrat Comparable. class Tri { static void parEchange(Comparable[] x) { Comparable tmp; for (int i = 0; i<x.length - 1; i++) { for (int j = i+1; j<x.length; j++) { if (x[j].inferieur(x[i])) { tmp = x[i]; x[i] = x[j]; x[j] = tmp; } } } } }

G. Falquet, Th. Estier CUI Universit de Genve

23 / 24

class MotoTriable

extends Moto implements Comparable {

public boolean inferieur(Object c) { return this.prix() <= ((Moto)c).prix(); } } // Et maintenant trions des motos(triables): public static void main(String[] args) { MotoTriable motos[] = {new MotoTriable(Honda, 900, 18350), new MotoTriable(Kawasaki, 750, 14500), new MotoTriable(Gagiva, 650, 28300)}; Tri.parEchange(motos); for (int i = 0; i<motos.length; i++) {System.out.println(motos[i].label());}; }

G. Falquet, Th. Estier CUI Universit de Genve

24 / 24

Spcications
Types abstraits Spcication dune classe Prconditions Postconditions

1 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Types abstraits
Type classique
ensembles de valeurs possibles

Type abstrait
ensemble doprations applicables

TA rectangle -- Opration de construction: rect(entier X, entier Y, entier L, entier H) --> rectangle; rectangle.translation(entier DX, entier DY)--> rectangle; rectangle.agrandissement(R, entier DL, entier DH) --> rectangle. -- Opration daccs rectangle.gauche() --> entier; rectangle.haut() --> entier; rectangle.largeur() --> entier; rectangle.hauter() --> entier; rectangle.bas() --> entier; rectangle.droite() --> entier.

2 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Smantique: quations
Dterminent des quivalences entre expressions: rect(X, Y, L, H).gauche() <==> X rect(X, Y, L, H).haut() <==> Y rect(X, Y, L, H).largeur() <==> L rect(X, Y, L, H).hauteur() <==> L R.translation(DX, DY).gauche() <==> R.gauche() + DX R.translation(DX, DY).haut() <==> R.haut(R) + DY R.translation(DX, DY).largeur() <==> R.largeur() R.translation(DX, DY).hauteur() <==> R.hauteur() R.agrandissement(DL, DH).hauteur()<==> R.hauteur()+DH R.agrandissement(DL, DH).largeur() <==> R.largeur()+DL R.agrandissement(DL, DH).gauche() <==> R.gauche() R.agrandissement(DL, DH).haut() <==> R.haut() R.bas() <==> R.haut()-R.hauteur() R.droite() <==> R.gauche()+R.largeur()

3 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Spcication dune classe


Quelles sont les mthodes ? Que font-elles exactement ?

Description textuelle informelle


facile lire

Description formelle plusieurs techniques existent PRE conditions POST conditions invariants (de structure)

4 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Prconditions
/** * Change la largeur d'un rectangle * * PRECONTION: l > 0 */ public void defLargeur(int l) { ... } /** * Dplace un rectangle horizontalement et verticalement * * PRECONDITION: this.gauche() + dh > 0 * et this.haut() + dv > 0 */ public void deplace(int dh, int dv) {...}

Conditions exprime l'aide des mthodes publiques gauche() et haut() et non sur les variables prives gauche et haut. On peut la tester depuis l'extrieur de la classe Rectangle. On peut la comprendre sans entrer dans la reprsentation interne da la classe.

5 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Les post conditions


Dit ce qu'est devenu l'objet aprs l'excution de la mthode et quel est le rsultat produit.
/** * fournit la surface d'un rectangle * * PRECONDITION: aucune * * POSTCONDITION: resultat = this.hauteur() * this.largeur() */ public int surface() { ... }

Ne dit pas comment le calcul est fait mais ce quil doit produire;

6 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Post cond. avec modications de lobjet


/** * Change la largeur d'un rectangle * PRECONTION: l > 0 * POSTCONDITION: this_post.largeur() = l * le nouveua rectangle a une largeur l */ public void defLargeur(int l) { ... } /** * Dplace un rectangle horizontalement et verticalement * * PRECONDITION: this.gauche() + dh > 0 * et this.haut() + dv > 0 * * POSTCONDITION: this_post.gauche() = * this_pre.gauche() + dh * et this_post.haut() = * this_pre.haut() + dv */ public void deplace(int dh, int dv) { ...}

On ne dit que ce qui change (hypothse du frame) Lexpression ne contient que des mthodes visibles

7 of 7

1996, G. Falquet, Universit de Genve

Cours Java

Le langage Java - Syntaxe


CLASSES, INSTANCE,MTHODES, ... CLASSE EN JAVA, PAS PAS UTILISER DES CLASSES: C O=NEW C() UTILISER LES MTHODES: O.M() UNE CLASSE AVEC PLUSIEURS CONSTRUCTEURS LA SURCHARGE DES MTHODES VARIABLES DE CLASSE VARIABLES DINSTANCE LES MTHODES DE LA CLASSE EXEMPLE AVEC STATIC ET SI LON PARLAIT DHRITAGE CLASSE ET MTHODES ABSTRAITES LHRITAGE MULTIPLE VS INTERFACE. REGROUPER DES CLASSES DANS UN PACKAGE TYPER UN OBJET (CASTING) COPIER DES OBJETS COMPARER DES OBJETS

1 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Une introduction aux objets


il nous faut examiner ce quest un objet.

2 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

une vision animiste!


une vision animiste Dfinition de classe: Une classe est archtype qui conditionne tous les comportements Dfinition dobjet: Un objet est une instance dune et une seule classe. Un individu qui possde tous les comportements de la classe dont il est driv. Dfinition de mthode: Une mthode dfinit laction lmentaire que lon peut effectuer sur un objet. Lensemble des mthodes dfinissent le comportement de la classe. Dfinition de message: Un message est loccurrence de la demande dexcution dune mthode un objet.

3 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

classes, instance,mthodes, ...

classe Rectangle largeur, hauteur, surface() perimetre() diagonale() doubler()

classe Disque diametre surface() perimetre() rayon() doubler() d1

r1

r2

d2

4 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Classe en JAVA, pas pas


dclarer une classe
class Rectangle extends Object{ ... }

variables dinstances. largeur et hauteur


class Rectangle extends Object{ public double largeur, hauteur; ... }

mthodes de Rectangle
class Rectangle extends Object{ ... public double perimetre() { return 2*(largeur+hauteur); } public double surface() {return largeur*hauteur;} public double diagonale() { return Math.sqrt(largeur*largeur+hauteur*hauteur); } public void doubler() {largeur*=2; hauteur*=2;} }

5 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Classe en JAVA, pas pas


le constructeur (dit comment crer une instance) class Rectangle extends Object{ ... public Rectangle(double initL, double initH){ largeur=initL; hauteur=initH; } ... }

Le code complet de la classe Rectangle


class Rectangle extends Object{ public double largeur, hauteur; public Rectangle(double initL, double initH){ largeur=initL; hauteur=initH; } public double perimetre() {return 2*(largeur+hauteur);} public double surface() {return largeur*hauteur;} public double diagonale() { return Math.sqrt(largeur*largeur+hauteur*hauteur);} public void doubler() {largeur*=2; hauteur*=2;} }

6 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Classe Disque
class Disque extends Object{ public double diametre; private static final double pi=3.14159; public Disque(double initD){ diametre=initD; } public double perimetre() {return pi*diametre;} public double surface() {return (pi*diametre*diametre)/4;} public double rayon() {return diametre/2;} public void doubler() {diametre*=2;} }

7 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Utiliser des classes: C o=new C()


La dclaration dune instance dclarer le type de la variable (sa classe) utiliser un constructeur (la variable) dclaration de type
Disque d1,d2;

par un mot cl new qui indique lon va cre une instance (cration des variables de linstance)
d1=new Disque(2); d2=new Disque(4);

contractes en une seule instruction


Rectangle r1=new Rectangle(2,4); Rectangle r2=new Rectangle(3,4);

8 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Utiliser les mthodes: o.m()


instance.mthode(paramtres, ...) Pour obtenir la diagonale de r1
r1.diagonale()

crire un petit programme qui utilise les classes Rectangle et Disque. noms commencant par une majuscule sont rservs aux identifiants des classes

9 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

TestRectDisk1
class TestRectDisk1{ public static void main (String args[]) { Rectangle r1=new Rectangle(2,4); Rectangle r2=new Rectangle(3,4); System.out.println("diagonale de r1: "+r1.diagonale()); System.out.println("primtre de r2: "+r2.perimetre()); r2.doubler(); System.out.println("primtre de r2: "+r2.perimetre()); Disque d1,d2; d1=new Disque(2); d2=new Disque(4); System.out.println("rayon de d1: "+d1.rayon()); System.out.println("primtre de d2: "+d2.perimetre()); d2.doubler(); System.out.println("primtre de d2: "+d2.perimetre()); } } diagonale de primtre de primtre de rayon de d1: primtre de primtre de r1: r2: r2: 1 d2: d2: 4.47214 14 28 12.5664 25.1327

10 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Une classe avec plusieurs constructeurs


offrir plusieurs constructeurs, pour une mme classe travailler dans plusieurs formes de reprsentation crer un nouveau constructeur qui doit se distinguer par le nombre et/ou le type des paramtres. un constructeur la classe Rectangle coin suprieur gauche (csgx,csgy) coin infrieur droite (cidx,cidy)
class Rectangle extends Object{ ... public Rectangle(double initL, double initH){ largeur=initL; hauteur=initH; } public Rectangle(double csgx, double csgy, double cidx, double cidy){ largeur=Math.abs(csgx-cidx); hauteur=Math.abs(csgy-cidy); } ... }

11 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

TestRectDisk2
choisir comment dclarer les instances de Rectangle:class TestRectDisk2{ public static void main (String args[]) { Rectangle r1=new Rectangle(1,1,3,5); Rectangle r2=new Rectangle(3,4); ... }

12 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

La surcharge des mthodes


offrir plusieurs mthodes effectuant une action similaire sans devoir leurs donner des noms diffrents doit se distinguer par le nombre et/ou le type des paramtres. ajouter une mthode doubler() la classe Rectangle
class Rectangle extends Object{ ... public void doubler() { largeur*=2; hauteur*=2;} public void doubler(boolean l, boolean h) { if (l) largeur*=2; if (h) hauteur*=2; } ... }

choisir comment doubler les instances de Rectangle


class TestRectDisk2{ public static void main (String args[]) { r2.doubler(); r2.doubler(false,true); ... }

13 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Surcharge
surcharge des identificateurs de mthodes Le compilateur dcide de la bonne mthode en examinant les types paramtres leur nombre la hirarchie. autre exemple de surcharge:
r2.doubler(); d2.doubler();

class B {} class SB {} extends B{ void f(B x, SB y){ } void f(SB x, B y){ } } class X{ SB s; f(s,s); ??? f(s,(B)s); ??? }

14 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Variables de classe
la classe peut possder des variables propres permet de conditionner le comportement de lensemble de ses instances dclares statiques (static). initialises au chargement de la classe. classe disque, la constante pi est dclare static. accessibles lintrieur de la classe sans tre prfixes lextrieur de la classe en tant prfixe par lobjet.

15 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Variables dinstance
Linstruction suivante imprimera les dimensions de r2:
System.out.println("dimension:"+r2.largeur+ "/"+r2.hauteur); r2.hauteur=45;

Il est possible de cacher les variables dinstance pour viter quon les modifie de lextrieur avec deux modificateurs: private et protected

16 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Les mthodes de la classe


Les mthodes de la classe permette de travailler sur la classe ajouter une mthode modifierEchelle() static. prfixant par le nom de la classe. initialisations complexes des variables de la classe associ un bloc dinstruction excut au chargement de la classe. static { instruction; ...}
class Rectangle extends Object{ public static double echelle=1.0; public double largeur, hauteur; ...

17 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Exemple avec static


public static void modifierEchelle(double e){ echelle=e; } static { //initialisation complex echelle=0.5; } } class TestRectDisk3{ public static void main (String args[]) { Rectangle r1=new Rectangle(2,4); Rectangle r2=new Rectangle(3,4); System.out.println("dim. r2:"+r2.largeur+"/ "+r2.hauteur); Rectangle.modifierEchelle(4); System.out.println("echelle "+Rectangle.echelle); } }

Rsultat de lexcution de TestRectDisk3:


dim. r2: 3/4 echelle 4

18 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Et si lon parlait dhritage


la relation dhritage qui existe entre classes. conserver certain acquis dune autre classe faire une classe Carre, sans lhritage, redfinir, les mthodes perimetre(), surface(), diagonale(), ... Alors quun carr cest presquun rectangle. classe Carre tend le comportement de Rectangle hrite de lui aussi ces variables dinstance et de ces mthodes. un constructeur pour la classe Carre, demande tre construit par la classe Rectangle dsignateur super qui permet de faire rfrence la classe dont un objet hrite. mthode cote() la classe Carre. dsignateur this qui permet de faire rfrence lobjet qui la mthode est adresse

19 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

TestRectDisk4
dans notre cas un carr particulier qui hrite du comportement dun rectangle et donc qui possde aussi des variables dinstance largeur et hauteur.
class Carre extends Rectangle{ public Carre(double initC){ super(initC,initC); } public double cote() {return this.hauteur;} } class TestRectDisk4{ public static void main (String args[]) { Carre c1=new Carre(4); System.out.println("dim. c1: "+c1.largeur+"/ "+c1.hauteur); System.out.println("surf. c1: "+c1.surface()); System.out.println("cot de c1 "+c1.cote()); } }

Rsultat de lexcution de TestRectDisk4:


dim. c1: 4/4 surf. c1: 16 cot de c1 4

20 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

de la surface au volume
tendre le comportement des rectangles celui des paralllpipdes. une variable dinstance pour mmoriser la profondeur le constructeur les mthodes propres cette classe.
class Parallelepipede extends Rectangle{ public double profondeur; public Parallelepipede(double x, double y, double z){ super(x,y); profondeur=z; } public double volume(){return surface()*profondeur;} } class TestRectDisk5{ public static void main (String args[]) { Parallelepipede p1=new Parallelepipede(2,3,4); System.out.println("prof. p1:"+p1.profondeur); System.out.println("surf. p1:"+p1.surface()); System.out.println("vol. p1:"+p1.volume()); } }

Rsultat de lexcution de TestRectDisk4:


prof. p1:4 surf. p1:6

21 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Hritage
larbre des liens dhritage.

Object

Rectangle

Disque

lang.Math

Carre

Parallelepipede

toutes les classes ont pour origines la classe Object. Les classes ne peuvent tendre quune seule classe donc une hirarchie stricte.

22 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Classe et mthodes abstraites


mthodes en commun entre les classes constante servir de modle pour ses sous-classes les mthodes sont aussi abstraites, seule est donn la dfinition de la classe son implmentation doit tre dfinie dans la sous-classe. Une classe abstraite ne peut pas avoir dinstance Le modifier abstract pour spcifier que la classe ou la mthode est abstraite.

23 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

classe abstraite GeometriePlane


avec les deux mthodes abstraites perimetre() surface() une constante pi. Les classes Rectangle et Disque tendent cette nouvelle classe et donne une implmentation pour les mthodes abstraites (en plus de leurs propres mthodes )
abstract public public public } class GeometriePlane{ static final double pi=3.14159; abstract double perimetre(); abstract double surface();

24 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

tendre la classe abstraite


class Rectangle extends GeometriePlane{ ... public double perimetre() { return 2*(largeur+hauteur); } public double surface(){ return largeur*hauteur; } ... } class Disque extends Object{ ... public double perimetre() { return GeometriePlane.pi*diametre; } public double surface() { return (GeometriePlane.pi*diametre*diametre)/4; } }

en regardant la structure, nous savons que toutes les sous-classes dune classe abstraite implmente ses mthodes. Si:
class Triangle extends GeometriePlane{...}

nous savons que des mthodes primtre() et surface() sont disponibles sur les instances de triangles. permet donc de bien structurer le dvellopement.

25 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

lhritage multiple vs interface.


lhritage simple; un objet ne peut tre considrer que dune seule manire. considrer un objet comme appartenant deux classes simultanment. pas directement possible en Java, un autre concept interface. un ensemble de mthodes (seulement la dfinition) et de constantes. Une classe implmente une interface (ou plusieurs) elle sengage alors donner une implmentation pour toutes les mthodes dfinies dans linterface. En retour, on peut considrer des instances de cette classe comme des instances de cette interface (bien quil ny a pas de cration proprement parler) Les interfaces peuvent: implmenter des interfaces constituent une autre hirarchie (fort). permet de briser lappartenance une seule classe.

26 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

interface Geometrie , ...


interface Geometrie{ public static final double pi=3.14159; } interface Courbe extends Geometrie{ public double longueur(); public void doubler(); } interface Surface extends Geometrie{ public double surface(); }

Gomtrie

Object Courbe Surface Rectangle Disque

27 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

les classes implmentent des interfaces.


class Rectangle extends Object implements Courbe, Surface{ public double largeur, hauteur; public Rectangle(double initL, double initH){ largeur=initL; hauteur=initH; } public double longueur(){2*(largeur+hauteur);} public void doubler() {largeur*=2; hauteur*=2;} public double surface(){return largeur*hauteur;} public double diagonale(){ return Math.sqrt(largeur*largeur+hauteur*hauteur);} } class Disque extends Object implements Courbe, Surface{ public double diametre; public Disque(double initD){ diametre=initD; } public double longueur() {return Geometrie.pi*diametre;} public void doubler() {diametre*=2;} public double surface(){ return (Geometrie.pi*diametre*diametre)/4;} public double rayon() {return diametre/2;} }

28 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

On parle de polymorphisme
rectangles et disques comme des courbes ou des surfaces.
class TestRectDisk7{ public static void main (String args[]) { Courbe c[]=new Courbe[10]; Surface s[]=new Surface[10]; Rectangle r[]=new Rectangle[5]; Disque d[]=new Disque[5]; // crer des rectangles for (int i=0;i<5;i++){ r[i]=new Rectangle(i+1,i+1); c[i]=r[i]; s[i]=r[i]; } // crer des disques for (int i=0;i<5;i++){ d[i]=new Disque(i+1); c[i+5]=d[i]; s[i+5]=d[i]; } // manipuler comme objets System.out.println("surf. System.out.println("surf. System.out.println("long. System.out.println("long. de plusieurs classes r[2]: "+r[2].surface()); s[2]: "+s[2].surface()); r[2]: "+r[2].longueur()); c[2]: "+c[2].longueur());

29 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

// considerer comme un tout


//surface de tous les objets double surfTotal=0; for (int i=0;i<10;i++)surfTotal+=s[i].surface(); System.out.println("surfTotal: "+surfTotal); // doubler tous les primtres for (int i=0;i<10;i++)c[i].doubler(); //surface de tous les objets surfTotal=0; for (int i=0;i<10;i++)surfTotal+=s[i].surface(); System.out.println("surfTotal: "+surfTotal); } }

Excution de TestRectDisk7:
surf. r[2]: 9 surf. s[2]: 9 long. r[2]: 12 long. c[2]: 12 surfTotal: 98.1969 surfTotal: 392.787

30 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

regrouper des classes dans un package


regroupement phyisique (dans le mme directoire) schma de nommage host....directoire...class

G omt r i e

Obj ect Cour be Surf ace Re ct ang l e Di sque

dans un fichier ... package geo; public interface Geometrie{ public static final double pi=3.14159; } dans un autre fichier; import geo.*; class TestRectDisk7{ ... }

31 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

typer un objet (casting)


changer le type de lobjet (respecter la hirarchie, implmentation) (Class) objet
(Object) o exemple: class B {} class SB {} extends B{ void f(B x, SB y){ } void f(SB x, B y){ } } class X{ SB s; f(s,s); ??? f(s,(B)s); ??? } toujours possible!

32 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

copier des objets


Rectangle r1=new Rectangle(3,4); Rectangle r2=new Rectangle(6,8); r1=r2 r2.doubler() que vaut r1.hauteur() ?

r1=r2.clone() r2.doubler() que vaut r1.hauteur() ?

Travaille par rfrence r1 hauteur=... largeur=... r2

33 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

comparer des objets


Rectangle r1=new Rectangle(1,2); Rectangle r2=new Rectangle(1,2); if r1==r2 ; // oui else ; // non; r1=r2 if r1==r2 ; // oui else ; // non;

if (r1.equals(r2)) ; // oui else ; // non;

r1 == r2 hauteur=... largeur=... equals()

34 J. Guyot/Universit de Genve-1996JAVA/SYNTAXE-

Les Applets
ou Java rencontre le Web Principes: partie dynamique d'un document Web excution dans la machine locale chargement de code via le rseau code minimal ncessaire la ralisation de la tche protection anti-virale forte

1996 - G. Falquet - Universit de Genve

Documents WWW
Un document = un noeud hypertexte Document structur => langage de marquage (HTML) titre: <TITLE> C'et le titre </TITLE> en-tte niveau 1: <H1> La thorie du Tout </H1> liste: <UL>
<LI> anim <LI> inanim <LI> autre </UL> paragraphe:Il est ncessaire de tout comprendre avant de ...

Liens entre documents = ancre + dsignation <A HREF=document-rfrenc> texte de l'ancre </A>
La recherche en <A HREF="/db-research/index.html"> bases de donn&eacute;es</A> &agrave; l'universit&eacute;

Le document rfrenc peut tre obtenu par calcul


tout sur la <A HREF= "/cgi-bin/get-index?x=botanique> botanique </A>

1996 - G. Falquet - Universit de Genve

Inclusion d'autres documents (IMG)


Dans le standard HTML seule l'inclusion d'images (en gnral en format GIF) est prvue: <IMG SRC=localisation de l'image>
Si vous voyez le panneau <IMG SRC="/images/stop.gif"> vous devez vous arrter.

Ces images peuvent tre calcules:


Vous etes le visiteur no. <IMG SRC="/cgi-bin/compteur?cpt=c1"> sur ce serveur.

Impossible d'inclure un autre document HTML!

1996 - G. Falquet - Universit de Genve

Document dynamique sur serveur


Un document statique HTML apparat tel qu'crit par l'auteur. Un serveur HTTP peut grer des documents dynamiques : Tout le contenu est calcul (gnr) par le serveur, formatt en HTML, transmis au client. Exemple: serveurs de recherche (Alta Vista, etc.)
http://altavista.digital.com/cgi-bin/ query?pg=q&what=web&fmt=.&q=argumentation+fluide

Le client/navigateur WWW reste passif Le serveur doit tre trs puissant (p.ex. Alta Vista = 4Gb RAM)

1996 - G. Falquet - Universit de Genve

Document dynamique avec Java


Une partie du document est gre par l'excution d'un programme Java. Cette partie est dlimite par une fentre (au dpart) La partie dynamique peut interagir avec le lecteur

Cours d'astronomie Texte thorique sur la dynamique des corps ...

<excution d'une simulation> ... encore du texte ... <simulation interactive> start stop V0 = 67.89 g = 8.81

1996 - G. Falquet - Universit de Genve

Le tag APPLET
But: inclure dans un document HTML un espace pour l'excution d'une petite application. <APPLET [CODEBASE = localisation_programme] CODE=nom_fichier_programme WIDTH=largeur_fentre HEIGHT=hauteur_fentre autres> <PARAM NAME=nom1 VALUE=valeur1> <PARAM NAME=nom2 VALUE=valeur2> ... </APPLET> Le tag PARAM permet d'envoyer des paramtres (strings) l'applet.

1996 - G. Falquet - Universit de Genve

Cycle de vie d'une applet


Les applets sont sous le contrle du navigateur WWW (Netscape, Hot Java, etc.) L'interface dcide quand charger les applets d'une page HTML (=> tat inactif) L'interface (re)dmarre une applet quand sa fentre est visible sur l'cran (=> tat actif) L'interface arrte l'applet qand elle disparat de l'cran (=> tat inactif) L'interface efface l'applet quand elle n'en a plus besoin

1996 - G. Falquet - Universit de Genve

La classe Applet
Object | +----- Component { paint(); resize(); } | +----- Container | +----- Panel | +--- Applet

Une applet est donc un objet graphique. Mais c'est aussi un objet actif cr et contrl par le navigateur Web La classe Applet possde deux catgories de mthodes: les mthodes d'interface graphique (hrites):
public void paint(Graphics g); public boolean mouseDown(Event evt, int int y); public boolean action(Event evt, Object what); etc. etc. x,

les mthodes de contrle d'excution


public public public public etc. void void void void init(); start(); stop(); destroy();

1996 - G. Falquet - Universit de Genve

Interaction d'une applet


vnements

navigateur WWW start() stop() applette mouseUp() paint()

vnements pour applette

gestionnaire awt

1996 - G. Falquet - Universit de Genve

Ecrire une applet


import java.applet.*; import java.awt.*; public class <NomApplet> extends Applet { public void init() { <Initialisations> <Dmarrage de processus> } public void start() { <Dmarrer l'applet, la page Web est visite> } public void paint(Graphics g) { <Dessiner le contenu actuel de l'applet> } public void stop() { <Arreter l'applet, la page Web est quitte> } public void destroy() { <Relcher les ressources, l'applet va quitter la mmoire> }

Cycle de vie d'une applet


init() ( start() paint()* stop() )* destroy()

1996 - G. Falquet - Universit de Genve

10

Applet : exemples
Ecrire une applet == crer une sous-classe de Applet pour redfinir certaines mthodes Applet minimale: ne redfinit que paint()
import java.applet.*; import java.awt.*; public class MonApplet extends Applet { // redfinit la mthode paint() public void paint(Graphics g) { int px[] = {5, 10, 0, 20, 40, 20}; int py[] = {5, 20, 40, 60, 40, 5}; g.drawPolygon(px, py, 6); g.drawString("Une applet !", 50, 50); } }

1996 - G. Falquet - Universit de Genve

11

Paramtres
Lapplet peut lire les paramtres avec la mthode public String getParameter(String name) (null si le paramtre nexiste pas) Comme les paramtres sont des Strings il faut les convertir selon ce quils reprsentent (int, float, etc.)
public void init() { String s; s = getParameter("level"); if (s != null) fractLevel =Integer.parseInt(s); s = getParameter("incremental"); if (s != null) incrementalUpdates = s.equals("true"); s = getParameter("delay"); if (s != null) repaintDelay = Integer.parseInt(s); s = getParameter("startAngle"); if (s != null) startAngle=Float.valueOf(s).floatValue(); s = getParameter("rotAngle"); if (s != null) rotAngle = Float.valueOf(s).floatValue();

1996 - G. Falquet - Universit de Genve

12

Extension de HTML par les applets


HTML permet essentiellement de structurer du texte Rien nest prvu pour les graphiques, formules (math., chimiques, etc.), circuits lectroniques, Une applet peut prendre en charge laffichage dune catgorie de donnes et son animation p.ex.
Dans le graphe ci-dessous <APPLET CODE=Graphe.class ...> <PARAM NAME=noeuds VALUE=s1 s2 s5 s12 s44> <PARAM NAME=arcs VALUE=s1-s12 s44-s1 s44-s2 s2-s12> </APPLET> etc. etc. etc. La molcule <APPLET CODE=FChimique.class ...> <PARAM NAME=formule VALUE=C6H12O6> </APPLET> prsente une forme qui ...

1996 - G. Falquet - Universit de Genve

13

Interactions applet - environnement

1996 - G. Falquet - Universit de Genve

14

Dessiner
Utiliser la classe java.awt.Graphics qui contient les mthodes de dessin. La classe Graphics doit tre import pour tre connue. Dans une applette il suffit de redfinir la mthode paint()
import java.awt.Graphics; public class Figure extends java.applet.Applet { public void paint(Graphics g) { ... } }

1996 - G. Falquet - Universit de Genve 1

Feuille de dessin
Applet hrite de java.awt.Component un contexte graphique de type Graphics qui est la feuille de dessin. Systme de coordonnes entires

0,0 60, 20

+X

20, 60

+Y
size() donne la dimension de la feuille, de type Dimension (0,0) le coin gauche suprieur. (0,Size().width) le coin droite suprieur (0,Size().hight) le coin gauche infrieur (Size().hight,Size().width) le coin droite infrieur

1996 - G. Falquet - Universit de Genve 2

Dessiner une ligne


Par dfaut la feuille est remplie avec une couleur de fond (background) On dessine avec la couleur slectionne (par dfaut le noir). Pour dessiner une ligne, il faut spcifier le point de dpart de la ligne et son point darrive.
public void paint(Graphics g) { g.drawLine(50,25,100,25);

import java.awt.Graphics; public class Figure extends java.applet.Applet { double f(double x) { return (Math.cos(x/10)+1) * size().height / 2; } public void paint(Graphics g) { for (int x = 0 ; x < size().width ; x++) { g.drawLine(x, (int)f(x), x + 1, (int)f(x + 1)); } } }

1996 - G. Falquet - Universit de Genve 3

Dessiner des rectangles


public void paint(Graphics g) { g.drawRect(50,30,20,30); g.fillRect(80,30,20,30); }

Rectangles aux coins arrondis; il faut alors ajouter deux paramtres: (int) arrondiX: largeur de larrondi en x (int) arrondiY: hauteur de larrondi en y
public void paint(Graphics g) { g.drawRoundRect(50,70,20,30,15,15); g.fillRoundRect(80,70,20,30,15,20); }

Rectangles en relief Un paramtre supplmentaire boolen indique: false: le rectangle est en relief true: le rectangle est en creux
public void paint(Graphics g) { g.draw3DRect(50,110,20,30,true); g.fill3DRect(80,110,20,30,false); }

1996 - G. Falquet - Universit de Genve 4

Polygones
Spcifis par deux tableaux: coordonnes en x et coordonnes en y. Le polygone nest pas automatiquement ferm. Spcifier le nombre de points dessiner. Dessine deux polygones.
public void paint(Graphics g) { int listeX[]={50,40,80,100,55}; int listeY[]={150,170,200,170,160}; int nbrXY=listeX.length; g.drawPolygon(listeX, listeY, nbrXY); int listeY2[]={200,220,250,220,210}; g.fillPolygon(listeX, listeY2, nbrXY); }

1996 - G. Falquet - Universit de Genve 5

Cercles, ovales, arcs


Les formes ovales sont inscrites dans un rectangle => paramtres : x, y, largeur et hauteur. Cercles => la hauteur doit galer la largeur. Dessine deux ovales.
public void paint(Graphics g) { g.drawOval(120,30,20,30); g.fillOval(150,30,30,30); }

Pour dessiner des arcs Deux paramtres: o doit commencer larc (en degr), sur combien de degrs on doit le dessiner.
public void paint(Graphics g) { g.drawArc(120,70,20,30,45,180); g.fillArc(150,70,30,30,45,-150); }

1996 - G. Falquet - Universit de Genve 6

Gommer, copier
Effacer une zone rectangulaire
g.clearRect (x, y, largeur, hauteur);

Copier une zone rectangulaire nouvelle coordonne (nx, ny)


g.copyArea(x, y, largeur, hauteur, nx, ny);

1996 - G. Falquet - Universit de Genve 7

Couleurs
classe Color pour dfinir et manipuler les couleurs. modle de couleur sur 24 bits, 8 pour chaque couleur fondamentale (rouge, vert, bleu), => 256 x 256 x 256 = environ 16 millions de possiblits. le nombre de couleurs effectivement affiches dpend des possibilits du butineur et de lcran. couleurs prdfinies: white, lightGray, gray, darkGray, red, black, green, blue, yellow, magenta, cyan, pink, orange. dfinir des nouvelles couleurs et tendre la palette avec la mthode Color(R, V, B) valeurs de R, V et G comprises entre 0 et 255 (ou ventuellement entre 0.0 et 1.0), par exemple:
Color bleuPale= new Color(0,0,80);

1996 - G. Falquet - Universit de Genve 8

Colorier
Mthodes hrites par Applet de la classe Component dfinir la couleur de larrire plan setBackground(Color)
setBackground(Color.white)

rcuprer la couleur du fond. getBackground() imposer une couleur tous les points dj dessins setForeground(Color)
setForeground(Color.pink)// redessine tout // en rose

Mthode de Graphics redfinir la couleur courante avec laquelle on dessine setColor(Color) obtenir la couleur courante getColor()

1996 - G. Falquet - Universit de Genve 9

crire
La mthode drawString(String, int, int) permet de dessiner une chane de caractres partir dune coordonne x,y. La couleur courante est aussi celle qui est utilise pour crire les caractres.
import java.awt.Graphics; import java.awt.Color; public class ApplettePolitique extends java.applet.Applet { public void paint(Graphics g) { g.setColor(Color.black); g.drawString("Mon premier applet politis!", 50, 30); g.setColor(Color.blue); g.drawString("Libert", 50, 60); g.setColor(Color.white); g.drawString("Egalit", 50, 90); g.setColor(Color.red); g.drawString("Fraternit", 50, 120); } }

1996 - G. Falquet - Universit de Genve 10

Les polices de caractres


Pour construire une police, il faut instancier un objet de la classe Font et linitiliaser avec les paramtres suivant: - le nom de la police: Helvetica, TimesRoman, Courier sont des types de caractres existant pour tous les butineurs. - le style de caractres: trois constantes sont disposition: Font.PLAIN (normal), Font.BOLD (gras), Font.ITALIC (italique). Il est possible de spcifier plusieurs styles simultanment en les additionnant. - la taille des caractres: La taille est donne en points. Pour dfinir la police courante de caractres utilies: Graphics.setFont() Pour interroger un objet Font: getName(), getSize(), getStyle(), isPlain(), isBold(), isItalic()

1996 - G. Falquet - Universit de Genve 11

Exemple multi-polices
import java.awt.Graphics; import java.awt.Color; import java.awt.Font; public class InterPol extends java.applet.Applet { public void paint(Graphics g) { Font helvetica14Normal = new Font("Helvetica",Font.PLAIN,14); Font courier12Gras = new Font("Courier",Font.BOLD,12); Font timesRoman18Italic = new Font("TimesRoman",Font.ITALIC,18); Font timesRoman18ItalicGras = new Font ("TimesRoman",Font.ITALIC+Font.BOLD,18); g.setColor(Color.black); g.setFont(helvetica14Normal); g.drawString("Le mme avec emphase!", 50, 30); g.setColor(Color.blue); g.setFont(courier12Gras); g.drawString("Libert", 50, 60); g.setColor(Color.white); g.setFont(timesRoman18Italic); g.drawString("Egalit", 50, 90); g.setColor(Color.red); g.setFont(timesRoman18ItalicGras); g.drawString("Fraternit", 50, 120); } }

1996 - G. Falquet - Universit de Genve 12

Mesures des fontes


Pour effectuer du travail plus prcis et plus simple sur la justification des caractres, la classe java.awt.FontMetrics donne des informations sur la taille occupe par une chaine de caractres. Un objet de FontMetrics est cr partir dun objet Font p.ex.
FontMetrics m = getFontMetrics(g.getFont());

Quelques mthodes stringWidth() largeur dune chane de caractres donne charWidth() largeur dun caractre donn getAscent() hauteur de la police au dessus de la ligne de base getDescent() hauteur de la police en dessous de la ligne de base getLeading() espace entre les lignes getHeight() hauteur total de la police Toutes ces mthodes travaillent en points.

1996 - G. Falquet - Universit de Genve 13

Exemple: centrage
import java.awt.*; public class Centrage extends java.applet.Applet { Font helvetica18Normal = new Font("Helvetica",Font.PLAIN,18); public void writeCenter(Graphics g, String s, int y){ FontMetrics metriqueCourante = getFontMetrics(g.getFont()); g.drawString(s, (size().width - metriqueCourante.stringWidth(s)) /2, y); } public void paint(Graphics g) { g.setColor(Color.blue); g.setFont(helvetica18Normal); writeCenter(g, "Le mme avec emphase au centre!", 30); writeCenter(g, "Libert", 60); writeCenter(g, "Egalit", 90); writeCenter(g, "Fraternit", 120); } }

1996 - G. Falquet - Universit de Genve 14

Interagir
Modles dvnement - souris - clavier Composants - boutons - textes - champs - menus Conteneurs et mise en pages - protocoles de mise en page - rcursivit de la mise en page

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Modle dvnements de Java 1.1


Bas sur le principe gnral de la dlgation. Chaque vnement est reprsent par un objet Contenu de lobjet vnement : la source de lvnement le moment auquel il a eu lieu des informations spciques (coordonnes souris, touche enfonce, etc.).

Pour recevoir des vnements un objet doit : sinscrire comme couteur auprs dun objet source dvnement ; possder les mthodes requises pour traiter ce type dvnement.

Pour tre source dvnements un objet doit : possder une mthode dinscription et de dsincription dcouteurs ; transmettre les vnements en appelant les mthodes requises des couteurs.
M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Gestion de la souris (1)


Pour recevoir des vnements de type MouseEvent Il faut implmenter linterface MouseMotionListener. c--d les mthodes mouseMoved() et mouseDragged(). appeler la mthode addMouseMotionListener() de la source dvnements pour sinscrire. Cas des applets : une applet est sa propre source dvnements souris On crira donc lappel dinscription :

this.addMouseMotionListener(this);

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Afficher en permanence les coordonnes de la souris :


import java.awt.Graphics; import java.awt.Event; import java.awt.event.*; public class Interaction extends java.applet.Applet implements MouseMotionListener { int sourisX, sourisY; long quand; public void init() { this.addMouseMotionListener(this); } public void mouseMoved(MouseEvent e){ // extrait les informations de lvnement quand=e.getWhen(); sourisX=e.getX(); sourisY=e.getY(); repaint(); } public void mouseDragged(MouseEvent e) {} public void paint(Graphics g){ g.drawString(quand+ "=("+sourisX+","+sourisY+")",10,20); } }
M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

laide dun adaptateur (2)


Classes toutes faites, appeles adaptateurs, qui ralisent chacune un couteur inactif. On dnit un couteur par extension dun adaptateur.
import java.awt.Graphics; import java.awt.Event; import java.awt.event.*; public class InteractionI extends java.applet.Applet{ int sourisX, sourisY; long quand; class EcouteSouris extends MouseMotionAdapter { public void mouseMoved(MouseEvent e){ quand=e.getWhen(); sourisX=e.getX(); sourisY=e.getY(); repaint(); } } public void init() { this.addMouseMotionListener(new EcouteSouris()); } public void paint(Graphics g) { g.drawString(quand+"=("+sourisX+ ","+sourisY+")",10,20); } }
M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Avec des classes anonymes (3)


pour viter de dnir explicitement une classe couteur :
public class InteractionA extends java.applet.Applet { int sourisX, sourisY; long quand; public void init() { this.addMouseMotionListener( new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ quand=e.getWhen(); sourisX=e.getX(); sourisY=e.getY(); repaint(); } }); }

public void paint(Graphics g) { g.drawString(quand+"=("+sourisX+","+sourisY+")",10,20); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Dfinition dune classe anonyme


new MouseMotionAdapter() { } = dnit une classe qui tend MouseMotionAdapter cre un objet de cette classe (lcouteur). Ecriture compacte mais plus trs lisible

On mlange des dclarations de mthodes lintrieur dexpressions.

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Interface MouseListener
Clics: mousePressed(), mouseReleased(), mouseClicked(), Entrs/sortie du composant: mouseEntered(), mouseExited(). Extraire les information de lvnement de type MouseEvent reu : getWhen() : le temps auquel sest produit lvnement ; getX(), getY() : la position du pointeur ; getClickCount() : le nombre de clicks sur ce mme point ; isAltDown(), isAltGraphDown(), isControlDown(), isMetaDown(), isShiftDown() : vrai si la touche (modicateur) Alt, AltGr, Ctrl, Meta ou Shift tait enfonce lors de lvnement ;

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Souris plusieurs boutons


getModiers() : un codage sous forme dun int des touches enfonces. On peut tester quel bouton a dclench lvnement avec lexpression.
(getModifiers() & BUTTONi_MASK) // i = 1, 2 ou 3

Le rsultat est diffrent de 0 si le bouton i a t press, relch ou cliqu (cest--dire press puis relch).

Cependant, pour tre vraiment portable, une application ne devrait pas faire dhypothses sur le nombre de boutons dont est munie la souris.

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Gestion du clavier
Les vnements clavier sont reprsents par des objet de la classe KeyEvent qui tend InputEvent . keyPressed () invoque lorsquune touche est enfonce. classe keyEvent getKeyCode() fournit le code de la touche. pour un clavier virtuel indpendant de la machine utilise. Codes dnis par une liste de constantes KeyEvent.VK_xxx. getKeyChar() fournit un caractre lorsque la ou les touches presses correspondent un caractre. keyTyped() nest invoque que lorsquun caractre est gnr par la ou les touches presses. isAltDown(), isAltGraphDown(), isControlDown(), isMetaDown() et isShiftDown() pour savoir quelle(s) touche(s) taient enfonce(s) au moment du clic.

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Applet
import java.awt.Font; import java.awt.event.*; public class KB extends java.applet.Applet { int taille=12; char toucheCourante='?'; boolean shiftPresse; class Clavier extends KeyAdapter { public void keyPressed(KeyEvent e){ int touche = e.getKeyCode(); shiftPresse = e.isShiftDown(); switch(touche){ case KeyEvent.VK_DOWN: --taille; break; case KeyEvent.VK_UP: ++taille; break; default: toucheCourante=e.getKeyChar(); } setFont(new Font("Helvetica", Font.BOLD, taille)); repaint(); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Applet -- suite
public void init() { this.addKeyListener(new Clavier()); } public void paint(Graphics g) { g.drawString("Taille="+taille+" majuscule="+ shiftPresse, 10, 25); g.drawString(String.valueOf(toucheCourante), 100,60); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

vnements et autres composants dinteraction.


Action qui cre lvnement Un utilisateur clique sur un bouton, choisit un article dans un menu, tape la touche Return dans un champ de texte Un utilisateur ferme une fentre Type dvnement ActionEvent

WindowEvent

Un utilisateur presse un bouton de la MouseEvent souris quand le curseur est sur un composant Un utilisateur bouge la souris sur un composant Un composant se cache ou devient visible Un composant reoit lattention du clavier Une table ou une liste de slection est modifie MouseMotionEve nt ComponentEvent FocusEvent ListSelectionE vent

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Composants dinteraction graphique


Button

Canvas

CheckBox

Choice

Container Abstraite Object Component Abstraite Label

List

ScrollBar

TextArea TextComponent TextField

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Les libells
import java.awt.*; public class Composant extends java.applet.Applet { public void init() { add(new Label ("A gauche par defaut")); add(new Label ("-Au centre-",Label.CENTER)); add(new Label ("A droite---------->", Label.RIGHT)); } public void paint(Graphics g) { g.drawString("Texte dessine", 100, 150); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Effet

Les paramtres dalignement sont des variables de classe constantes : Label.CENTER, Label.LEFT, Label.RIGHT.

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Les boutons
import java.applet.*; import java.awt.*; import java.awt.event.*; public class Composant extends Applet implements ActionListener { String commande = "Normal"; Button bn, bg, bi; Font fgras, fnormal, fitalic, fdef; public void init() { add(bn = new Button ("Normal")); add(bg = new Button("Gras")); add(bi = new Button("Italique")); bn.addActionListener(this); bg.addActionListener(this); bi.addActionListener(this); fgras = new Font("Helvetica",Font.BOLD,40); fnormal = new Font("Helvetica", Font.PLAIN,40); fitalic = new Font("Helvetica", Font.ITALIC,40); fdef = new Font("Helvetica", Font.PLAIN,12); }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

(suite)
public void actionPerformed(ActionEvent e) { commande = e.getActionCommand(); repaint(); } public void paint(Graphics g) { if (commande.equals("Normal")) g.setFont(fnormal); if (commande.equals("Gras")) g.setFont(fgras); if (commande.equals("Italique"))g.setFont(fitalic); g.drawString("Exemple", 20, 80); g.setFont(fdef); }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Les listes de choix


import java.applet.*; import java.awt.*; import java.awt.event.*; public class Composant extends Applet implements ItemListener List parfum; public void init() { parfum = new List(5,true); parfum.add("Vanille"); parfum.add("Chocolat"); parfum.add("Fraise"); parfum.add("Pistache"); parfum.add("Noisette"); parfum.add("Citron"); parfum.add("Orange"); parfum.add("Abricot"); parfum.setMultipleMode(true); add(new Label("Parfums de la glace")); add(parfum); parfum.select(3); // prselectionne Pistache parfum.addItemListener(this); // l'applet coute le menu } public void itemStateChanged(ItemEvent e) { repaint(); }
M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

suite
public void paint(Graphics g) { int[] parfumNos = parfum.getSelectedIndexes(); String message = "Code glace: "; for (int i=0; i<parfumNos.length; i++) message = message + parfumNos[i]; g.drawString(message, 20, 100); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Les fonds
Les fonds sont des objets de la classe Canvas. Ils permettent de crer une surface de travail pour dessiner, afcher des images, etc. En tendant cette classe, il est possible de rednir le comportement dun fond en surchargeant la mthode paint(). Un Canvas est sensible aux vnements gnrs par la souris et par le clavier.

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Conteneurs
Un conteneur est un espace graphique destin recevoir plusieurs composants (boutons, fonds, listes, botes cocher, etc.)

Panel Container Abstraite Window Frame Dialog FileDialog

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Ouvrir une autre fentre


import java.applet.*; import java.awt.*; import java.awt.event.*; class Fenetre extends Frame { TextArea t; Fenetre(String titre) { super(titre); // constructeur de Frame t = new TextArea("(x, y)", 5, 20); add("Center", t); pack(); show(); } public void afficher(String s) { t.append(s); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Utilisation
class MonApplet ... { public void dessiner() { ... Graphics g = getGraphics(); g.drawLine(x0, y0, e.getX(), e.getY()); f1.afficher(" XXXXXX "); ... } public void init() { f1 = new Fenetre("f1"); ... } public void stop() { f1.dispose(); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Un fentre plus active


class Fenetre extends Frame implements ActionListener { String commande; TextArea t; Button bn, bg, bi; Fenetre(String titre) { super(titre); setLayout (new FlowLayout(FlowLayout.LEFT,8,10)); t = new TextArea("(x, y)", 5, 20); add(t); add(bn = new Button ("test")); add(bg = new Button("fermer")); add(bi = new Button("rien")); bn.addActionListener(this); bg.addActionListener(this); bi.addActionListener(this); pack(); show(); } public void afficher(String s) { t.append(s); } public void actionPerformed(ActionEvent e) { commande = e.getActionCommand(); afficher("\n --> "+commande+"\n"); repaint(); } }
M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Applet
public class Interaction extends Applet { int x0 = 0, y0 = 0; Fenetre f1;

class MSouris extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); g.drawLine(x0, y0, e.getX(), e.getY()); f1.afficher ("\n("+x0+","+y0+")>("+ e.getX()+","+e.getY()+")"); x0 = e.getX(); y0 = e.getY(); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

suite
class CSouris extends MouseAdapter { public void mousePressed(MouseEvent e) { x0 = e.getX(); y0 = e.getY(); } } public void init() { f1 = new Fenetre("f1"); addMouseListener(new CSouris()); addMouseMotionListener(new MSouris()); } public void stop() { f1.dispose(); } }

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Apparence

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Protocoles de mise en pages


Un protocole dnit la mthode de placement des composants dun conteneur les uns par rapport aux autres.
GridLayout

BorderLayout

FlowLayout Object CardLayout

GridBagLayout

GridBagConstraints

Chaque conteneur est associ un seul protocole de mise en pages. Les sous-composants qui sont des conteneurs peuvent avoir dautres protocoles.

Permet de rester indpendant de la plate-forme physique. On spcie les contraintes de la mise en pages plutt que des pixels sur la surface de travail.
M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Mise en pages glissante


Les composants graphiques sont ajouts lun aprs lautre de gauche droite, avec un saut la ligne ds quil ne reste plus despace sufsant droite.
import java.awt.*; public class Composant extends java.applet.Applet { public void init() { setLayout (new FlowLayout(FlowLayout.LEFT,8,10)); add(new Button ("b1")); add(new Button ("b2")); add(new Button ("b3")); add(new Button ("b10")); add(new Button ("b20")); add(new Button ("b30")); add(new Button ("b100")); add(new Button ("b200")); add(new Button ("b300")); add(new Button ("b1000")); add(new Button ("b2000")); add(new Button ("b3000")); add(new Label ("ici le centre")); add(new TextArea ("entrez vos ...",4,30)); } }
M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Aspect
Lutilisation de protocoles de mise en pages permet dadapter celle-ci dynamiquement lors du changement de la taille du conteneur.

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Autres protocoles
Mise en pages par spcication des bords (5 zones North, South, East, West, Center) Mise en pages avec une grille (n lignes m colonnes) Mise en pages sous forme de cartes Mise en pages avec un quadrillage et des contraintes

Rcursivit de la mise en pages

M. Bonjour, G. Falquet, J. Guyot, A. Le Grand

Exceptions
Un moyen de structurer le traitement des cas exceptionnels. Principe: 1. une instruction gnre une exception une exception est un objet 2. l'exception se propage a.vers les blocs englobants b.vers les mthodes appelantes 3. lexception est capte

Nouvelle structure de bloc:


try <instruction> catch (<type-exception1 ex1) <instruction> catch (<type-exception2 ex2) <instruction>

finally <instruction>

1 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Exemples
Conversion String -> Entier
String parStr; int parInt; parStr = getParameter(LONGUEUR); // essaye de lire le paramtre comme un entier try parInt = Integer.parseInt(parStr); // en cas derreur met -1 catch (NumberFormatException nfe) parInt = -1;

Accs contrl un tableau


try z = tab[i]; catch (ArrayIndexOutOfBounds b) { System.out.println(b.getMessage()); z = 0; }

2 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Captage des exceptions


catch (TypeException obj) <instruction>

Au cas ou une exception de type TypeException (ou dun de ses sous-types) a t gnre on excute <instruction> et lexception est rfrence par obj (comme un paramtre de mthode) Devoir de captage Si la mthode m() peut produire une exception de type E alors il faut soit Appeler m() dans un bloc try
try obj.m(); catch (E e) recuperation;

Dclarer que la mthode courante peut gnrer une

exception E
void maMethode() throws E { ... obj.m(); ... }

Lexception non capte est propage la mthode appelante.

3 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Crer des types dexceptions


Hirarchie des classes dexceptions Object Throwable Exception RuntimeException InterruptedException IOException

EOFException Cration dune nouvelle classe dexceptions


class TotoException extends Exception { public TotoException() {super();} }

Gnrer une exception


... throw new TotoException()

4 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Le bon usage des exceptions


Les exceptions doivent rester exceptionnelles Ce nest pas une nouvelle structure de contrle en plus des

if, while, for, switch Pour claircir les traitements derreur du genre
if (erreur) <trait-erreur> else {... if (erreur) <trait-erreur> else {... if (erreur) <trait-erreur> else {... (suite) } } }

Eviter de capter les erreurs graves non rcuprables

(NullPointerException, )

5 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Processus
La machine virtuelle Java permet lexcution concurrent de plusieurs processus dans une programme. Un processus (thread) est un l dexcution et un objet, il possde une instruction courante un environnement
un tat (actif, inactif, en attente, etc.) un nom (pas forcment unique)

Il faut le crer ET le dmarrer


AnimatorThread a = new AnimatorThread(); a.start();

La classe Thread fournit un type de processus minimal qui ne fait rien =>
la sous-classer ou utiliser un objet Runnable.

6 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Processus comme sous-classe de Thread


class Producteur extends Thread { public void run() { ... } Producteur p = new Producteur(); p.start(); Producteur q = new Producteur(); q.start();

La mthode start() initialise le processus et lance lexcution de la mthode run().

7 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Processus utilisant une autre classe


class Consommateur implements Runnable { public void run() { ... } Consommateur conso = new Consommateur(); Thread t1 = new Thread(conso); t1.start(); Thread t2 = new Thread(conso); t2.start();

Dans ce cas le processus utilise un objet qui possde une mthode run() (qui implante Runnable). start() initialise le processus et lance lexcution

8 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Synchronisation
But: assurer la cohrence des traitements Technique des moniteurs = garantir laccs exclusif une ressource (donnes ou instructions). Chaque objet possde un moniteur daccs On obtient laccs exclusif un objet o de la classe C en excutant une mthode synchronise
class C { synchronized void m() { ... instructions ... } ... } C o = new C(); o.m()

en excutant une instruction synchronise sur o


synchronized (o) {... instructions ...}

Le moniteur bloque tout autre processus qui essaye dobtenir laccs o.

9 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Attente et notication
Lorsquun processus possde laccs un objet il peut appeler la mthode wait() pour attendre quun autre processus lui notie quil peut continuer. obj.wait()
relche laccs lobjet attend une notication (ou un certain temps) aprs notication le processus redmarre ds quil peut

robtenir laccs exclusif lobjet obj.notify()


notie aux processus qui ont fait un wait() sur cet objet

quils peuvent continuer ne peut se faire quen ayant obtenu laccs lobjet ne relche pas laccs

10 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Exemple Producteur-Consommateur
Un producteur produit des objets (int) et les place dans une le dattente Un consommateur prend ce quil trouve dans la le Laccs la le doit tre atomique La le est de taille limite

La le dattente
on produit et consomme des entiers (int) la le est limite un entier
class Produit { int contenu; boolean vide; Produit() {vide = true;} void ajoute(int x) {contenu = x; vide = false;} int retire() {vide = true; return contenu;} boolean estVide() {return vide;} }

11 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Prod-cons - Producteur
class Producteur extends Thread { Produit produit; Producteur(Produit p) {this.produit = p;} public void run() { int ip; while (true) { // dort un moment try {sleep((int)(Math.random() * 1000));} catch (InterruptedException e) {}; synchronized (produit) { if (!produit.estVide()) { try produit.wait(); catch (InterruptedException e); } ip = (int)(Math.random() * 1000); produit.ajoute(ip); // signale quil y a qqch prendre produit.notify(); } } } }

12 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Prod-cons - Consommateur
class Consommateur extends Thread { Produit produit; Consommateur (Produit p) {this.produit = p;} public void run() { int jp; while (true) { try {sleep((int)(Math.random() * 1000));} catch (InterruptedException e) {}; synchronized (produit) { if (produit.estVide()) { try produit.wait(); catch (InterruptedException e); } jp = produit.retire(); produit.notify(); } } } }

13 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Prod-cons (suite)
Programme principal
public class ProdCons { public static void main(String[] argv) { Produit pp = new Produit(); Producteur pr = new Producteur(pp); Consommateur co = new Consommateur(pp); co.start(); pr.start(); } }

14 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Prod-cons Excution
PR PR PR PR PR PR PR -------CO -dort un moment avant synchro. synchronis ajoute 321 notify() sort de la synchro dort un moment CO -CO -CO -CO -CO -CO -CO -CO -CO -avant synchro. synchronis ajoute 995 notify() sort de la synchro dort un moment CO -CO -CO -CO -CO -dort un moment

avant synchro. synchronis retire 321 notify() sort de la synchro dort un moment avant synchro. synchronis wait()

PR PR PR PR PR PR

-------

reprend aprs notification retire 995 notify() sort de la synchro dort un moment

15 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Excution (suite)
PR PR PR PR PR PR ------avant synchro. synchronis ajoute 788 notify() sort de la synchro dort un moment CO -CO -CO -CO -CO -CO -avant synchro. synchronis ajoute 794 notify() sort de la synchro dort un moment avant synchro. synchronis wait() CO -CO -CO -CO -CO -CO --

avant synchro. synchronis retire 788 notify() sort de la synchro dort un moment

PR PR PR PR PR PR PR PR PR

----------

avant synchro. synchronis retire 794 notify() sort de la synchro dort un moment

16 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Animer une applette


Principe: (modle - vue)
Crer un processus qui appelle rgulirement la mthode

paint() de lapplette pour dessiner le modle.


Crer un ou des processus qui font bouger le modle

Exemple:
Le modle est un ensemble de rectangles. Un processus soccupe de chaque rectangle. Le processus dessine les rectangles (en appelant la mthode

paint() de chaque rectangle)

17 of 20

1996, G. Falquet, Universit de Genve

Cours Java

class RectVivant extends Thread {


Color cc; int rx = 0; int ry = 0; int deltaT; int dx, dy; public RectVivant(String str, Color c, int dx, int dy, int dt) { super(str); cc = c; deltaT = dt; this.dx = dx; this.dy = dy; } // ** le processus ** public void run() { for (int i = 0; i < 100; i++) { try {sleep(deltaT); } catch (InterruptedException e) {} if ((rx+dx < 0) || (rx+dx > 170)) dx = -dx; if ((ry+dy < 0) || (ry+dy > 170)) dy = -dy; rx += dx; ry += dy; }} // ** appel par le processus de dessin ** public void paint(Graphics g) { if (this.isAlive()) { g.setColor(cc); g.fillRect(rx, ry, 30, 30);} else g.drawRect(rx, ry, 30, 30); }}

18 of 20

1996, G. Falquet, Universit de Genve

Cours Java

public class Anima extends Applet implements Runnable{


RectVivant a1, a2, a3, af; Thread dessinateur; // ** le processus de dessin ** public void run() { for (int i = 0; i < 300; i++) { try {Thread.sleep(50); } catch (InterruptedException e) {} this.paint(this.getGraphics()); } } public void paint(Graphics g) { g.clearRect(0,0,200,200); a1.paint(g); a2.paint(g); a3.paint(g); } // ** dmarrage de lapplette, cration des procs public void start() { a1 = new RectVivant("Jamaica", Color.pink, 2, 3, 50); a2 = new RectVivant("Fiji", Color.white, 2, 3, 200); a3 = new RectVivant("Bermuda", Color.blue, 3, 3, 150); a1.start(); a2.start(); a3.start(); dessinateur = new Thread(this); dessinateur.start(); } }

19 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Schema des processus


Thread dessinateur start()

Anima <lapplette> start() paint() run() RectVivant a1 run() paint() rx ry Thread Le Systeme runtime

20 of 20

1996, G. Falquet, Universit de Genve

Cours Java

Java et son API


API = Application Programming Interface Tout ce qui relie un programme avec son environnement + tout ce qui n'est pas dfini directement dans le langage. Dvelopper avec Java => connatre le langage connatre l'API JDK 1.0 : 117 classes et 40 interfaces JDK 1.1 : 272 classes, 87 interfaces JDK 1.2 : 1525 classes et interfaces (env. 10 000 mthodes)

L'API est strictement le mme sur toutes les plateformes: interface graphique, accs aux fichiers et au rseau, gestion des processus, etc. Des API de second niveau sont en cours de dfinition: p.ex. API pour bases de donnes relationnelles. Il existe des paquets destins des tches particulires, non standardiss (p.ex. Collections, Finance, Dessin 3D, etc.) Le dveloppeur doit constituer sa bote outils

1997 - G. Falquet, Th. Estier - Universit de Genve

Environnement Java: les diffrents paquets (JDK 1.0.2)


java.lang (21 classes, 2 interfaces) java.io (23, 3) java.util (10, 2) java.net (11, 3) java.awt (42, 2) java.awt.image (9, 3) java.awt.peer (0, 22) java.applet (1, 3) Total: 117 classes, 40 interfaces

1997 - G. Falquet, Th. Estier - Universit de Genve

Evolution de lenvironnement: les diffrents packages (JDK 1.1)


java.applet (1, 3) java.awt (51, 7) + java.awt.datatransfer (3, 2) + java.awt.event (19, 11) java.awt.image (11, 3) + java.beans (15, 6) java.io (44, 8) java.lang (24, 2) + java.lang.reflect (5, 1) + java.math (2) java.net (14, 3) + java.rmi (2, 3) + java.rmi.dgc (2, 1) + java.rmi.registry (1, 2) + java.rmi.server (10, 7) java.security (12, 5) + java.security.acl (0, 5) + java.security.interfaces (0, 5) + java.sql (6, 8) + java.text (17, 1) java.util (19, 3) java.util.zip (14, 1) Total: 272 classes, 87 interfaces

1997 - G. Falquet, Th. Estier - Universit de Genve

JDK 1.2 (Java 2)


java.applet (1, 3) java.awt (64, 14) + java.awt.color (5, 0) java.awt.datatransfer (4, 3) + java.awt.dnd (4, 15) java.awt.event (19, 11) + java.awt.font (15, 2) + java.awt.geom(30, 1) + java.awt.im (3, 1) java.awt.image (11, 3) + java.awt.image.renderable + java.awt.print package java.beans (15, 6) + java.beans.beancontext java.io (44, 8) java.lang (24, 2) + java.lang.ref java.lang.reflect (5, 1) java.math (2) java.net (14, 3) java.rmi (2, 3) + java.rmi.activation java.rmi.dgc (2, 1) java.rmi.registry (1, 2) java.rmi.server (10, 7) java.security (12, 5) java.security.acl (0, 5) + java.security.cert java.security.interfaces (0, 5) + java.security.spec java.sql (6, 8) java.text (17, 1) java.util (19, 3) + java.util.jar java.util.zip (14, 1) 1997 - G. Falquet, Th. Estier - Universit de Genve 4

Packages essentiels

Package java.applet java.awt java.beans java.io

Description crer une applet et la faire communiquer dans son contexte dexcution crer des interfaces avec lutilisateur pour peindre et afficher des images pour le dveloppement de composants logiciels JavaBeans gestion des entres/sorties travers des canaux de donnes, srialisation et systmes de gestion de fichiers classes fondamentales pour le langage fonctions habituelles (sin, cos, ), oprations en entier et dcimal dune prcision arbitraire gestion du rseau et communications invocation distance des mthodes (Remote Method Invocation) scurit connexion aux bases de donnes) manipulation des textes, des dates, des nombres et des messages dune manire indpendante des langues

java.lang java.math

java.net java.rmi java.security java.sql java.text

1997 - G. Falquet, Th. Estier - Universit de Genve

Package java.util

Description structures de donnes des utilitaires pour la manipulation des dates, un modle dvnement, etc.

javax.acces- Dfinit un contrat entre les composants sibility interface-utilisateur et des technologies dassistance lutilisateur (loupe, vocaliseur, ) javax.swing composants lgers (entirement crits en Java, pour la gestion des interfaces, indpendants de la plate-forme. org.omg.C ORBA correspondance entre lAPI CORBA de lOMG et le langage de programmation Java.

1997 - G. Falquet, Th. Estier - Universit de Genve

Matriser l'environnement
Approche par thmes: comment crer une applette ? comment dessiner, crire ? comment animer une applette ? comment interagir avec la souris, le clavier ? comment grer une fentre et son contenu ? comment grer des fichiers ? comment communiquer sur un rseau ? Approche par concepts quels sont les concepts sous-jacents ? quelles sont leurs relations comment interagissent-ils Outils de butinage tous les paquets sont dcrits sous forme hypertexte documentation interactive

1997 - G. Falquet, Th. Estier - Universit de Genve

Classe java.awt.Rectangle
public class java.awt.Rectangle extends java.lang.Object { // Fields public int height; public int width; public int x; public int y;

On considre des rectangles dont les cts sont // aux axes x et y et dont les coordonnes et dimensions sont entires
// Constructors public Rectangle(); public Rectangle(Dimension d); public Rectangle(int width, int height); public Rectangle(int x, int y, int width, int height); public Rectangle(Point p); public Rectangle(Point p, Dimension d);

La dfinition d'un rectangle peut utiliser les notions de Point et de Dimension. On trouvera dans la documentation l'effet exact de chaque constructeur

1997 - G. Falquet, Th. Estier - Universit de Genve

Rectangle (suite)
// Methods

On peut changer la taille d'une rectangle de diffrentes manires


public public public public public void void void void void resize(int width, int height); add(int newx, int newy); add(Point pt); add(Rectangle r); grow(int h, int v);

le dplacer
public void move(int x, int y); public void translate(int dx, int dy);

changer sa forme = dplacer et changer sa taille


public void reshape(int x, int y, int width, int height);

Il y a une notion d'tre l'intrieur


public boolean inside(int x, int y);

Il y a des notions de comparaison, d'intersection et d'union de 2 rectangles


public public public public boolean equals(Object obj); Rectangle intersection(Rectangle r); boolean intersects(Rectangle r); Rectangle union(Rectangle r);

Un rect. peut tre vide (?)


public boolean isEmpty();

et comme tout objet:


public int hashCode(); public String toString();

1997 - G. Falquet, Th. Estier - Universit de Genve

Classe Rectangle - concepts


Ce quil faut retenir: On considre des rectangles dont les cts sont // aux axes x et y et dont les coordonnes et dimensions sont entires La dfinition d'un rectangle peut utiliser les notions de Point et de Dimension. On peut changer la taille d'une rectangle de diffrentes manires, on peut aussi le dplacer. Un point peut tre l'intrieur dun rectangle On peut comparer deux rectangles, tester sils sintersectent, calculer leur intersection et leur union Un rectangle peut tre vide Ce quil ne faut pas retenir: Les noms et paramtres de chaque mthode, on les retrouvera toujours dans la documentation interactive.

1997 - G. Falquet, Th. Estier - Universit de Genve

10

librairie java.net

Package java.net

Classes class ContentHandler class DatagramPacket class DatagramSocket class InetAddress nal class ServerSocket nal class Socket class SocketImpl nal class URL abstract class URLConnection class URLEncoder class URLStreamHandler

Interfaces Interface ContentHandlerFactory Interface SocketImplFactory Interface URLStreamHandlerFactory

Exceptions class MalformedURLException class ProtocolException class SocketException class UnknownHostException class UnknownServiceException

A. Le Grand

Universit de Genve

librairie java.net

Identier le contenu dun URL


import java.io.IOException; import java.net.*; public class ContenuURL { public static void afficheInfos(URLConnection u) {// affiche l'URL et les infos s'y rattachant System.out.println(u.getURL().toExternalForm() + ":"); System.out.println("Contenu :"+ u.getContentType()); System.out.println("Longueur :"+ u.getContentLength()); } static public void main(String[] args) throws MalformedURLException, IOException {if (args.length==0) return; URL url=new URL(args[0]); URLConnection connection=url.openConnection(); afficheInfos(connection); } }

exemple dexcution >java affURL http://cuiwww.unige.ch/db-research/Research/ http://cuiwww.unige.ch/db-research/Research/: Contenu :text/html Longueur :3495

A. Le Grand

Universit de Genve

librairie java.net

vrier des URL


import java.io.*; import java.net.*; public class VerifieURL { public static void verifie(URLConnection u) throws IOException {if (!u.getContentType().equals("text/html")) {System.out.println( "seuls les text/html sont verifies."); System.exit(0);}; DataInputStream dis =new DataInputStream(u.getInputStream()); String s=dis.readLine(); String motif1="<A HREF="; String motif2=">"; String ref; int i,j; while (s!=null) {i=s.indexOf(motif1); if (i!=-1) {j=s.indexOf(motif2); ref=s.substring(i+motif1.length()+1,j-1); try {ValiditeURLConnexion.test(ref);} catch (IOException e) {System.out.println("Wrong URL : "+ref);} } s=dis.readLine();} dis.close(); }

A. Le Grand

Universit de Genve

librairie java.net

vrier des URL


(suite) public static void main(String args[]) throws MalformedURLException, IOException {if (args.length!=1) {System.out.println("Usage : java verifieURL "); System.exit(0);} URLConnection c=null; try {URL url =new URL(args[0]); ValiditeURLConnexion.test(url); c= url.openConnection();} catch (IOException e) {System.out.println("Wrong URL : "+args[0]); System.exit(0);} verifie(c); } } classe ValiditeURLConnexion import java.io.*; import java.net.*; public class ValiditeURLConnexion { public static void test(URL url) throws IOException {URLConnection c=url.openConnection(); DataInputStream dis =new DataInputStream(c.getInputStream()); dis.close(); } public static void test(String s) throws MalformedURLException,IOException {test(new URL(s)); } }

A. Le Grand

Universit de Genve

librairie java.net

un exemple client-serveur

processus serveur

cration processus connexion

demande de connexion

message MESSAGE

application client

machine hte processus sexcutant sur la machine du client

processus connexion

application client

in out

socket

socket

canalLecture canalEcriture

>java Client cuisuna Connexion : cuisuna/129.194.12.27 port : 45678 ?toto !TOTO ?lulu !LULU ?FIN Connexion terminee

A. Le Grand

Universit de Genve

librairie java.net

Serveur
import java.io.*; import java.net.*; public class Serveur extends Thread { protected static final int PORT=45678; protected ServerSocket ecoute; public Serveur () { try {ecoute=new ServerSocket(PORT);} catch (IOException e) {System.err.println(e.getMessage()); System.exit(1);} System.out.println( "Serveur en ecoute sur le port:"+PORT); this.start(); } public void run() {try {while (true) {Socket client=ecoute.accept(); Connexion c= new Connexion(client);}} catch (IOException e) {System.err.println(e.getMessage()); System.exit(1);} } public static void main(String[] args) {new Serveur();} }

A. Le Grand

Universit de Genve

librairie java.net

Services du serveur
import java.io.*; import java.net.*; class Connexion extends Thread{ protected Socket client; protected DataInputStream in; protected PrintStream out; public Connexion(Socket client_soc) {client=client_soc; try {in =new DataInputStream(client.getInputStream()); out =new PrintStream(client.getOutputStream());} catch (IOException e) {try {client.close();} catch (IOException e1) {} System.err.println(e.getMessage()); return;} this.start(); } public void run() { String ligne; try {while(true) {ligne=in.readLine(); if (ligne.toUpperCase().compareTo("FIN")==0) break; out.println(ligne.toUpperCase());} } catch (IOException e) {System.out.println("connexion:"+e.toString());} finally {try {client.close();} catch (IOException e){};} } }
A. Le Grand

Universit de Genve

librairie java.net

client du serveur
import java.io.*; import java.net.*; public class Client { protected static final int PORT=45678; public static void main(String[] args) {Socket s=null; if (args.length!=1) {System.err.println("Usage: java Client <hote>"); System.exit(1);} try {s=new Socket(args[0],PORT); DataInputStream canalLecture = new DataInputStream(s.getInputStream()); DataInputStream console=new DataInputStream(System.in); PrintStream canalEcriture= new PrintStream(s.getOutputStream()); System.out.println("Connexion etablie: "+ s.getInetAddress()+" port: "+s.getPort()); String ligne; while (true) {System.out.print("?");System.out.flush(); ligne=console.readLine(); canalEcriture.println(ligne); ligne=canalLecture.readLine(); if (ligne==null) {System.out.println("Connexion terminee");break;} System.out.println("!"+ ligne); } // while } // try catch (IOException e) {System.err.println(e);} finally {try {if (s!=null) s.close();} catch (IOException e2){}} } // main } // class
A. Le Grand

Universit de Genve

librairie java.net

processus de la tl-discussion.
Un serveur en attente de connexions : attend une demande cre une connexion et linsre dans la liste

Une connexion pour chaque client : attend un message de son client demande un accs la liste des connexions an de leur envoyer le message pour quelles le transmettent leur client correspondant. en n de connexion, avertit le processus nettoyeur charg de la retirer de la liste des connexions.

Le processus nettoyeur : se rveille priodiquement ou est rveill par une connexion. testee lactivit dune connexion.

Lapplication client : saisit des messages de lutilisateur, les envoie la connexion afche des messages provenant dautres clients. lcoute et la rception sont donc asynchrones.

Le processus couteur : afche tous les messages quil reoit de la connexion.

A. Le Grand

Universit de Genve

librairie java.net

tl-discussion : le serveur
import java.io.*; import java.net.*; import java.util.*; // pour utiliser la classe Vector public class Serveur2 extends Thread { protected static final int PORT=45678; protected ServerSocket ecoute; protected Vector connexions; protected Nettoyeur nettoyeur; public Serveur2 () {try {ecoute=new ServerSocket(PORT);} catch (IOException e) {System.err.println(e.getMessage());System.exit(1);} System.out.println("Serveur en ecoute sur le port:"+PORT); connexions=new Vector(); nettoyeur=new Nettoyeur(this); this.start(); } public void run() {try {while (true) {// attente dune demande Socket client=ecoute.accept(); System.out.println("Demande de connexion..."); Connexion2 c= new Connexion2(client,nettoyeur,this); synchronized (connexions) {connexions.addElement(c);} }} catch (IOException e) {System.err.println(e.getMessage());System.exit(1);} } // run public static void main(String[] args) {new Serveur2(); }}
A. Le Grand

Universit de Genve

10

librairie java.net

tl-discussion: la connexion
import java.util.*; class Connexion2 extends Thread{ protected Socket client; protected Serveur2 serveur; protected DataInputStream in; protected PrintStream out; protected Nettoyeur nettoyeur; public Connexion2(Socket client_soc, Nettoyeur n, Serveur2 s) {client=client_soc; nettoyeur=n; serveur=s; try {in =new DataInputStream(client.getInputStream()); out =new PrintStream(client.getOutputStream());} catch (IOException e) {try {client.close();} catch (IOException e1){}; System.err.println(e.getMessage()); return;} this.start(); } // constructeur ....

A. Le Grand

Universit de Genve

11

librairie java.net

tl-discussion: la connexion (suite du listing)


public void run() {String ligne; Connexion2 c; try {while(true) {ligne=in.readLine(); synchronized(serveur.connexions) {for (int i=0;i<serveur.connexions.size();i++) {c=(connexion2) serveur.connexions.elementAt(i); c.out.println(ligne);} if (ligne.endsWith("FIN")) break; } } catch (IOException e){} finally {try {client.close();} catch (IOException e){}; System.out.println("Fin de connexion..."); synchronized(nettoyeur) nettoyeur.notify(); } } // run } // class

A. Le Grand

Universit de Genve

12

librairie java.net

tl-discussion : le nettoyeur
import java.io.*; import java.net.*; import java.util.*; class Nettoyeur extends Thread{ protected Serveur2 serveur; protected Nettoyeur(Serveur2 serveur) {this.serveur=serveur; this.start(); } public synchronized void run() {while(true) {try { // attention different de sleep this.wait(5000);} catch (InterruptedException e){} synchronized(serveur.connexions) {for (int i=serveur.connexions.size()-1;i>=0;i--) {Connexion2 c= (Connexion2) serveur.connexions.elementAt(i); if (!c.isAlive()) {serveur.connexions.removeElementAt(i); System.out.println("Fin de connexion: OK");} } // for } // synchro } // while } }

A. Le Grand

Universit de Genve

13

librairie java.net

tl-discussion : AppliClient
import java.io.*; import java.net.*; import java.awt.*; public class AppliClient extends Frame{ public static final int PORT=45678; Socket s; PrintStream canalEcriture; TextField entree; TextArea visu; Button envoi,stop; Panel boutons; String Nom;

public boolean action(Event e,Object obj) {if ((e.target==entree) || (e.target==envoi)) {canalEcriture.println(Nom+">"+entree.getText()); entree.setText(""); //efface le texte return true; } if (e.target==stop) {canalEcriture.println(Nom+">FIN"); System.exit(0);} return false; } // action public static void main(String[] args) { Frame f= new AppliClient(args[0]); }

A. Le Grand

Universit de Genve

14

librairie java.net

tl-discussion : AppliClient (suite du listing)


public AppliClient(String n) {super("client"+ " "+n); try {Nom=n; // demande de connexion sur le serveur // le socket est renvoye lorsquelle est etablie s=new Socket("mycpu.bigco.ch",PORT); canalEcriture=new PrintStream(s.getOutputStream()); // construction de l'interface graphique entree=new TextField(); visu=new TextArea(); visu.setEditable(false); this.setLayout(new BorderLayout()); this.add("North",visu); this.add("Center",entree); boutons=new Panel(); envoi=new Button("envoi"); stop =new Button("stop"); boutons.add(envoi); boutons.add(stop); this.add("South",boutons); this.pack(); this.show(); visu.setText("Connexion: "+ s.getInetAddress()+ " port: "+s.getPort()); Ecouteur ecoute=new Ecouteur(s,visu); } catch (IOException e) {visu.setText(e.toString());} } //init } //class
A. Le Grand

Universit de Genve

15

librairie java.net

tl-discussion : lcouteur
import java.io.*; import java.net.*; import java.awt.*; class Ecouteur extends Thread{ DataInputStream entree; TextArea visu; public Ecouteur(Socket s,TextArea out) { entree= new DataInputStream(s.getInputStream()); visu=out; this.start(); } public void run() { String ligne; try {while (true) {ligne=entree.readLine(); if (ligne==null) break; visu.appendText("\n"+ligne); }} catch (IOException e) {visu.setText(e.toString());} finally {visu.setText("connexion interrompue par le serveur");} } }

A. Le Grand

Universit de Genve

16

Java et les bases de donnes


Michel Bonjour http://cuiwww.unige.ch/~bonjour

CENTRE UNIVERSITAIRE DINFORMATIQUE

UNIVERSITE DE GENEVE

Java et les bases de donnes

Plan
Introduction JDBC: API SQL pour Java - JDBC, Java, ODBC, SQL - Architecture, interfaces, exemples Java et le client-serveur - Architecture classique - Architecture revisite: Java ct client, Java ct serveur Persistence dobjets Java - Principes - Exemple de produit: JRB
M. Bonjour, CUI-Universit de Genve 2

Java et les bases de donnes

Java et les BD: Quel intrt ?


Idem que pour les applications Internet (1) - Portabilit, distribution, accs au rseau, GUI Evolution: statique/dynamique (2) - Problmes: transactions, pr-traitements, etc. Le client-serveur revisit (3) - Client n, code mobile Bases de donnes 2 WWW
M. Bonjour, CUI-Universit de Genve

3 1 Java
source: J. Guyot
3

Java et les bases de donnes

JDBC: Introduction
Quoi ? - API Java pour interagir avec des BD relationnelles * excuter des requtes SQL * rcuprer les rsultats - Tentative de standardiser laccs aux BD (futur: ODMG) - Spcication base sur X/Open SQL CLI (comme ODBC) Pourquoi ? - Rponse de SUN la pression des dveloppeurs - Java est idal pour les applications BD - Alternative aux solutions propritaires
M. Bonjour, CUI-Universit de Genve 4

Java et les bases de donnes

JDBC et ...
Java: JDBC cest du Java ! - Interfaces, classes, multi-threading - Applets, applications, utilise le Security Manager ODBC: JDBC est au-dessus de ODBC - Arguments pour ODBC: * existe, implant, fonctionne * accept, diffus - Arguments contre ODBC * trs li au langage C (void *, pointeurs) * compliqu, bas sur des paramtres locaux
M. Bonjour, CUI-Universit de Genve 5

Java et les bases de donnes

JDBC et SQL
Support de SQL-2 Entry Level - SQL dynamique, principaux types SQL - Transactions, curseurs simples - Mta-donnes Mcanismes dextension - Syntaxe inspire dODBC: { mot-cl ... paramtres ... - Fonctions ODBC de conversion, mathmatiques, etc. Long terme - Support de SQL-2 complet
}

M. Bonjour, CUI-Universit de Genve

Java et les bases de donnes

Architecture de JDBC
Application Java JDBC API JDBC Manager JDBC Driver API JDBC-Net Driver Driver X JDBC-ODBC Bridge Driver ODBC protocole ouvert protocole X protocole Y

JavaSoft Inc.
M. Bonjour, CUI-Universit de Genve 7

Java et les bases de donnes

Interfaces de JDBC (1)

JavaSoft Inc.

M. Bonjour, CUI-Universit de Genve

Java et les bases de donnes

Interfaces de JDBC (2)


DriverManager - Gre la liste des Drivers chargs - Cre les connexions TCP (Connection) - Mappe des URLs vers des connexions Connection Canal de communication TCP vers une BD Format dURL: jdbc:odbc:cuibd.unige.ch:9876/mabd Proprits de la Connection: username, password Cre les Statements (requtes SQL) Gre les transactions (au sens de SQL)
9

M. Bonjour, CUI-Universit de Genve

Java et les bases de donnes

Interfaces de JDBC (3)


Statement - Gre les requtes SQL simples - Sous-types: * PreparedStatement: requtes paramtres (IN) * CallableStatement: procdures stockes (OUT) - Passage de paramtres: * mthodes set... * accs par lindex - Cre les ResultSet

M. Bonjour, CUI-Universit de Genve

10

Java et les bases de donnes

Interfaces de JDBC (4)


ResultSet - Gre laccs aux tuples dun rsultat (SELECT) - Accs aux colonnes: par nom, par index - Conversions de types entre SQL et Java - Possibilit dutiliser un stream pour rcuprer les donnes brutes (bytes, ASCII, Unicode) - Gre des curseurs simples

M. Bonjour, CUI-Universit de Genve

11

Java et les bases de donnes

Exemple de SELECT
java.sql.Statement st = conn.createStatement(); ResultSet r=st.executeQuery(SELECT nom, age FROM T1); while (r.next()) { // imprime les lments du tuple String s = r.getString(nom); int i = r.getInt (age); // ou bien r.getInt (2) System.out.println (nom: + s + age: + i); }

M. Bonjour, CUI-Universit de Genve

12

Java et les bases de donnes

Exemple de UPDATE
java.sql.PreparedStatement ps = conn.createStatement(UPDATE T1 SET cat=? WHERE age=?); ps.setString(1, Ado); for (int i = 14; i < 19; i++) { ps.setInt (2, i); int nbTuples = ps.executeUpdate(); System.out.println (age: + i + nb: + nbTuples); }

M. Bonjour, CUI-Universit de Genve

13

Java et les bases de donnes

Client-serveur: Architecture classique


client pais GUI xy Net xy serveur Serveur xy

Net xy code xy

TCP/IP

TCP/IP

xy: Oracle, Sybase, etc.

M. Bonjour, CUI-Universit de Genve

14

Java et les bases de donnes

Limites du client-serveur classique


Ct client: - GUI: moche, non-standard, runtime - Net: protocole ferm, mais: scurit, performances - Epaisseur: installation, conguration cble - Dveloppement: langage client, peu portable Ct serveur - Net: protocole ferm, mais: rpartition, homognit - Dveloppement: langage serveur, pas portable

M. Bonjour, CUI-Universit de Genve

15

Java et les bases de donnes

Client-serveur: Architecture avec Java


client n Browser Java VM serveur Serveur xy

Request Broker code Java

TCP/IP

TCP/IP

xy: Oracle, Sybase, etc.

M. Bonjour, CUI-Universit de Genve

16

Java et les bases de donnes

Avantages du client-serveur avec Java


Ct client: - Browser: interface uniforme, bookmarks, plug-ins - Java VM: scurit - Finesse: TOUT se tlcharge, pas de cong locale - Dveloppement: Java, HTML (gare JavaScript !) Ct serveur - Request Broker: centralise les appels aux services - Dveloppement: Java * local: code excut par le serveur * mobile: code stock dans la BD et envoy au client
M. Bonjour, CUI-Universit de Genve 17

Java et les bases de donnes

Persistence dobjets Java: Principes


Stocker des objets Java dans un SGBD - Performance, scurit, concurrence, etc. Dveloppement - Cration des classes Java - Gnration +/- automatique: * Java: mthodes (binding) * SGBD: tables Diffrence de paradigme: OO vs Relationnel - Java: classes, types simples1, rfrences, arrays - Relationnel: tables, types simples2, jointures
M. Bonjour, CUI-Universit de Genve 18

Java et les bases de donnes

JRB: Java Relational Binding


O2 Technology, Oct. 1996

Stockage dobjets Java dans un SGBD relationnel API + outils Code Java - Voit un systme persistant - Fait appel lAPI JRB Runtime - Gre un cache dobjets Communication avec le SGBD - Interface compatible JDBC
M. Bonjour, CUI-Universit de Genve 19

Java et les bases de donnes

Etapes du dveloppement
Programmation + conguration - Ecriture des classes Java, compilation - Choix des classes/variables stocker Importation des classes - Gnration de mthodes Java (access, update) - Cration de la BD (tables, cls, index) Mise jour du code source - Inclusion des mthodes gnres - Ecriture des mthodes daccs profond Compilation, etc.
M. Bonjour, CUI-Universit de Genve 20

Java et les bases de donnes

Cycle de dveloppement
Car.class config
O2 Technology

jrb_import

Car.import
write read

ajouter

Car.java

JRB runtime cache


update access

javac

Appl... Java

Car.class

M. Bonjour, CUI-Universit de Genve

21

Java et les bases de donnes

Gestion des objets


Cration dun objet - Mthode new() habituelle Ecriture dun objet - Invocation de update() ou de VOTRE deepUdate() Lecture dun objet Invocation de access() ou de VOTRE deepAccess() A partir de lextension de la classe (~ curseur SQL) A laide dun prdicat de recherche En suivant un lien depuis un autre objet stock

M. Bonjour, CUI-Universit de Genve

22

Java et les bases de donnes

Exemple de cration/criture
Person john = new Person("John", 36); Person mary = new Person("Mary", 32); Person bob = new Person ("Bob", 6); john.spouse = mary; // references mary.spouse = john; john.children[0] = bob; // 1 child mary.children[0] = bob; Database database = new Database(Database.SYBASE,"java_store", "mb","mb_password"); database.connect(); // open a connection to the database server database.open("base1"); // open the database base1 Transaction transaction = new Transaction(); transaction.begin() ; // start a new transaction john.update(); // indicates to the system that these objects must be written in mary.update(); // the database at commit time bob.update(); transaction.commit(); // commit the transaction database.close(); // close the database database.disconnect();

M. Bonjour, CUI-Universit de Genve

23

Java et les bases de donnes

Exemple daccs
Database database = new Database(Databse.SYBASE, "java_store", "mb", "mb_password"); database.connect(); // open a connection to the database server database.open("base1"); // find John in the database Person john = (Person) Extent.all("Person").where("name = 'John'").element(); Person mary = (Person) john.spouse.access(); // load his spouse in memory Transaction transaction = new Transaction(); transaction.begin() ; // start a new transaction Person bob = (Person) Database.access(john.children,0); // load the 1st child in memory bob.age = 7; // change his age bob.update(); // mark it to be written to the database at commit time transaction.commit(); // commit the transaction database.close(); // close the database database.disconnect();

M. Bonjour, CUI-Universit de Genve

24

Java et les bases de donnes

Conclusion
Avantages - Optimisation: utilisation des possibilits du SGBD - Transparence: choix des classes stocker, appel lAPI - Notion de transaction Inconvnients, limites - Processus batch - Ecriture des mthodes deep...() - Support limit de lvolution des classes (ajout variable) Avenir - Stockage dans O2, support de lvolution
M. Bonjour, CUI-Universit de Genve 25

Java et les bases de donnes: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java
Michel Bonjour http://cuiwww.unige.ch/~bonjour

Java et les bases de donnes

Plan
JDBC: API bas niveau pour laccs aux BD (SQL) Introduction JDBC et : Java, ODBC, SQL Interfaces, exemples Types de drivers JDBC, architectures

SQLJ: code SQL embarqu dans Java Introduction Dveloppement en SQLJ Concepts, exemples Traduction SQLJ - JDBC
2

M. Bonjour, 1997

Java et les bases de donnes

JDBC: Introduction
Quoi ? - API Java pour interagir avec des BD relationnelles * excuter des requtes SQL (statiques ou dynamiques) * rcuprer les rsultats - Tentative de standardiser laccs aux BD (futur: ODMG) - Spcication base sur X/Open SQL CLI (comme ODBC) Pourquoi ? - Rponse de SUN la pression des dveloppeurs - Java est idal pour les applications BD - Alternative aux solutions propritaires
M. Bonjour, 1997 3

Java et les bases de donnes

JDBC et ...
Java: JDBC cest du Java ! - Interfaces, classes, multi-threading - Applets, applications, utilise le Security Manager ODBC: JDBC est au-dessus de ODBC - Arguments pour ODBC: * existe, implant, fonctionne * accept, diffus - Arguments contre ODBC * trs li au langage C (void *, pointeurs) * compliqu, bas sur des paramtres locaux
M. Bonjour, 1997 4

Java et les bases de donnes

JDBC et SQL
Support de SQL-2 Entry Level - SQL dynamique, principaux types SQL - Transactions, curseurs simples - Mta-donnes (accs au dictionnaire de la BD) Mcanismes dextension - Syntaxe inspire dODBC: { mot-cl ... paramtres ... - Fonctions ODBC de conversion, mathmatiques, etc. Long terme - Support de SQL-2 complet
}

M. Bonjour, 1997

Java et les bases de donnes

Architecture de JDBC
Code Java JDBC API JDBC Manager JDBC Driver API Driver X Driver Y JDBC-ODBC Bridge Driver ODBC protocole X protocole Y protocole Z : core Java : JavaSoft (gratuit) : vendeur SGBD BD X
M. Bonjour, 1997

BD Y

BD Z

JavaSoft Inc.
6

Java et les bases de donnes

Interfaces de JDBC (1)

JavaSoft Inc.

M. Bonjour, 1997

Java et les bases de donnes

Interfaces de JDBC (2)


DriverManager - Gre la liste des Drivers chargs - Cre les connexions TCP (Connection) - Mappe des URLs vers des connexions Connection Canal de communication TCP vers une BD Format dURL: jdbc:odbc:cuibd.unige.ch:9876/mabd Proprits de la Connection: username, password Cre les Statements (requtes SQL) Gre les transactions (au sens de SQL)
8

M. Bonjour, 1997

Java et les bases de donnes

Interfaces de JDBC (3)


Statement - Gre les requtes SQL simples - Sous-types: * PreparedStatement: requtes paramtres (IN) * CallableStatement: procdures stockes (OUT) - Passage de paramtres: * mthodes set... * accs par lindex - Cre les ResultSet

M. Bonjour, 1997

Java et les bases de donnes

Interfaces de JDBC (4)


ResultSet Gre laccs aux tuples dun rsultat (SELECT) Accs aux colonnes: par nom, par index Conversions de types entre SQL et Java Possibilit dutiliser un stream pour rcuprer les donnes brutes (bytes, ASCII, Unicode) - Gre des curseurs simples

M. Bonjour, 1997

10

Java et les bases de donnes

Exemple de SELECT
Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@host:port:sid","user","passwd"); java.sql.Statement st = conn.createStatement(); ResultSet r=st.executeQuery(SELECT nom, age FROM T1); while (r.next()) { // imprime les lments du tuple String lenom = r.getString(nom); int lage = r.getInt (age); // ou bien r.getInt (2) System.out.println (nom: + lenom + age: + lage); }

M. Bonjour, 1997

11

Java et les bases de donnes

Exemple de UPDATE
afcher le nb de personnes ayant 14,15..18 ans et modier leur catgorie (Ado)

java.sql.PreparedStatement ps = conn.createStatement(UPDATE T1 SET cat=? WHERE age=?); ps.setString(1, Ado); for (int i = 14; i < 19; i++) { ps.setInt (2, i); int nbTuples = ps.executeUpdate(); System.out.println (age: + i + nb: + nbTuples); }

M. Bonjour, 1997

12

Java et les bases de donnes

Driver JDBC Type 1


JDBC-ODBC Bridge
Java binaire binaire JDBC-ODBC Bridge Driver ODBC BD X Code client BD X

Client pais - ODBC + Driver ODBC du SGBD - Librairies client du SGBD Application Java, mais pas applet - Fichiers de cong de ODBC - Binaire non portable Utilisation - Test, 1re implantation de JDBC - Middle-tier (Accs pls. BD)
13

protocole BD X

BD X
M. Bonjour, 1997

Java et les bases de donnes

Driver JDBC Type 2


Native-API Partly-Java Driver
Java binaire Driver JDBC BD X Code client BD X

Client pais - Driver traduit les appels JDBC en appels lAPI du SGBD - Librairies client du SGBD Avantage - Protocole BD X optimis Utilisation - Applications Java 2-tier - Middle-tier (Accs efcace)
14

protocole BD X

BD X

M. Bonjour, 1997

Java et les bases de donnes

Driver JDBC Type 3


Net Protocol All-Java Driver
Driver Java protocole M

Client n - Driver traduit les appels JDBC en appels au middleware Applets ou applications Java - Driver charg avec le code Java Utilisation - Ncessite un middle-tier (accs BD) - Solution tout Java pour architecture 3-tier
BD Y
15

protocole M

Serveur M
API X API Y

BD X
M. Bonjour, 1997

Java et les bases de donnes

Driver JDBC Type 4


Native Protocol All-Java Driver
Java Driver JDBC BD X

Client n - Driver traduit les appels JDBC en appels lAPI du SGBD - Driver cre des sockets pour muler le protocole BD X light Avantage / Dsavantage - Tout Java = portable - Tout Java = charger Driver (~300K)

sockets Java protocole BD X light

BD X

Utilisation - Applets en architecture 2-tier


16

M. Bonjour, 1997

Java et les bases de donnes

Applet et Driver Type 4: exemple


Client HTTP Browser Web Applet Java Driver JDBC Thin Oracle TCP/IP, SQL*Net Oracle
HTML Java

Serveur Serveur Web

Source: M.P. Mesaros, Oracle

M. Bonjour, 1997

17

Java et les bases de donnes

JDBC: avantages - dsavantages


Avantages Fait partie de core Java API complet pour SQL dynamique Nombreuses fonctions de conversions Support des types BLOB: streams Java Multiples drivers: congurations 2-tier, 3-tier, etc.

Dsavantages - Pas de vrication de type vis vis de la BD - Ecriture fastidieuse, code peu lisible - Rsultats ne sont pas des objets Java
M. Bonjour, 1997 18

Java et les bases de donnes

SQLJ: Introduction
SQL embarqu dans Java (embedded SQL) Proposition de norme par IBM, Oracle, Sybase, Tandem Principe - Clauses #sql dans le code source Java - Etape de pr-compilation avec accs au schma de la BD * vrication, optimisation du SQL * gnration de classes Java (connexions, rsultats) * gnration du code JDBC dtaill Pr-processeur est crit en Java Complmentaire JDBC
M. Bonjour, 1997 19

Java et les bases de donnes

Dveloppement en SQLJ
Code source Java + SQLJ
.sqlj

Code source Java + JDBC Pr-compilateur SQLJ


.java

Compilateur Java

Executable Java BD
.class

M. Bonjour, 1997

20

Java et les bases de donnes

Buts de SQLJ
Faciliter laccs aux BDs depuis Java - SQL statique (requtes formes avant lexcution) - Code simpli, plus concis Vrier le code SQL avant lexcution - Syntaxe des ordres SQL - Compatibilit des types Java et SQL - Conformit avec le schma de la BD (option) Crer du code mobile: excution sur chaque tier Supporter la composition (rsultats sont des objets)

M. Bonjour, 1997

21

Java et les bases de donnes

Principaux concepts de SQLJ


Clauses SQLJ: expressions SQL
#sql { UPDATE EMP SET SAL = 9999 WHERE DEPT = :d } ;

Variables htes: variables Java utilises dans des clauses


String d = "ventes" ;

Connection Context: paramtres de connexion une BD (ex: utilisateur, session, transaction)


int maxi; #sql context bdParis ; #sql [bdparis] (SELECT MAX(SAL) INTO :maxi FROM EMP);

Itrateurs: encapsulation des rsultats de requtes

M. Bonjour, 1997

22

Java et les bases de donnes

Itrateurs en SQLJ
transformer les rsultats de requtes en objets Java A chaque format de rsultat on associe un itrateur
#sql iterator NomSalaire (String nom, int salaire);

A chaque requte on associe une instance ditrateur


NomSalaire salventes; // salaires du dpt. ventes #sql salventes = { SELECT ENAME, SAL FROM EMP WHERE ... };

Une fois la requte excute, on accde aux mthodes de cet objet itrateur
while (salventes.next()) { System.out.println("Nom: " + salventes.nom() + "Salaire: " + salventes.salaire()); }

M. Bonjour, 1997

23

Java et les bases de donnes

Traduction SQLJ-JDBC
Clauses SQLJ: traduites en JDBC - Accs aux variables htes - Conversion entre types SQL et Java Connection Context: traduites en Connections JDBC Itrateurs: traduits en classes Java - Gnration des mthodes daccs aux colonnes - Gnration de la mthode next() - Code Java dinstanciation de litrateur Vrications de types

M. Bonjour, 1997

24

Java et les bases de donnes

Avantages de SQLJ
Clauses de haut niveau, code lisible SQLJ cest du Java: portabilit, etc. Qualit du code: gnration correcte, optimisation Vrications avant lexcution (y compris avec la BD) Rsultats (itrateurs) sont des objets, ils peuvent tre changs entre composants Java

M. Bonjour, 1997

25

Java et les bases de donnes

SQLJ: prsent et futur


Promoteurs leaders du march Proposition de norme soumise ANSI / ISO Implmentation de rfrence disponible (cf. Oracle) Langage daccs aux BD depuis chaque tier - Ct client: gnration depuis IDE - Ct serveur: procdures stockes compiles pour la BD ex: futur langage natif dOracle (comme PL/SQL) Versions visual de SQLJ dans les futurs IDE

M. Bonjour, 1997

26