Vous êtes sur la page 1sur 98

Rappels : Quelques principes

de
programmation

Un programme est crit une fois


Sil est utile,
il sera modifi
corrig
on lui ajoutera des fonctionnalits
des dizaines de fois
peut-tre plusieurs annes aprs son
criture

Ce quil faut rechercher

Une plus grande facilit de


programmation
Mais surtout
une maintenance plus aise
et une extensibilit accrue

Comment ?
Modularit : dcomposer en lments plus
simples
Encapsulation : cacher ce quil nest pas
indispensable de voir
Lisibilit : faciliter la comprhension des
programmes
Rutilisabilit : crire des modules
rutilisables dans les futurs dveloppements
(difficile)

Modularit
Un programme est modulaire sil est dcoup
en modules (plus ou moins) indpendants
Un bon dcoupage doit satisfaire les 2 critres :
fort couplage des lments dun module
faible couplage entre deux modules diffrents
Ces 2 principes favorisent l'utilisation, la
rutilisation et la maintenance des modules :
plus de souplesse : un module - une
fonctionnalit
les modifications d'un module ont le moins
dimpacts possible sur les autres modules

Encapsulation
Lencapsulation est le fait de ne montrer et de
ne permettre de modifier que ce qui est
ncessaire une bonne utilisation
on montre linterface (services offerts) dun
module
on cache limplmentation (comment sont rendus
les services)
Les avantages en sont :
simplification de lutilisation (la complexit
dutilisation ne dpend que de linterface publique)
meilleure robustesse du programme
simplification de la maintenance de lapplication

Vers une programmation


par composants

Sur le modle des circuits lectroniques :


chaque composant remplit des fonctionnalits
bien
dtermines et offre des possibilits de connexion
avec d'autres composants
pas besoin d'aller lire le code pour les utiliser (on
ne sait rien de l'implmentation)
En mieux
on peut configurer le composant
et sauvegarder cette configuration, ou un
assemblage de composants, pour la rutiliser

Structure lexicale du
langage Java
Pour les identificateurs, les commentaires, les
valeurs de type caractre ou chane de
caractres, Java utilise les caractres du code
Unicode
Le reste dun programme Java est form de
caractres ASCII (qui sont les 128 premiers
caractres du code Unicode)
Dans un programme, le caractre Unicode dont le
code est la valeur hexadcimale xxxx peut tre
reprsent par \uxxxx

Identificateurs
Un identificateur Java
est de longueur quelconque
commence par une lettre Unicode
(caractres
ASCII recommands)
peut ensuite contenir des lettres ou des
chiffres ou le caractre soulign _
ne doit pas tre un mot-cl ou les constantes
true, false ou null

Mots-cls Java
abstract, boolean, break, byte, case, catch, char,
class, const, continue, default, do, double,
enum**, else, extends, final, finally, float, for,
goto, if, implements, import, instanceof, int,
interface, long, native, new, null, package,
private, protected, public, return, short, static,
strictfp, super, switch, synchronized, this, throw,
throws, transient, try, void, volatile, while
** : depuis JDK 5.0

Commentaires
// Voici un commentaire
int prime = 1500; // prime fin de mois
Sur plusieurs lignes :
/* Premire ligne du commentaire
suite du commentaire */

Documentation automatique par javadoc


/**
* Cette mthode calcule ...
* Elle utilise ...
*/

Oprateurs
Voici les plus utiliss :
= + - * / % ++ -- += -= *= /= ++
-- = = != > < >= <=
&& || ! (et, ou, ngation)
Cration dune instance: new

Exemples dutilisation
des oprateurs

int x = 9, y = 2;
int z = x/y; // division entire (z = 4)
z = x++ / y; // z = 4 puis x = 10
z = ++x / y; // x = 11 puis z = 5
if (z == y) // et pas un seul "=" !
x += y; // raccourci
if (y != 0 && x/y > 8)

Oprateur instanceof
La syntaxe est :
objet instanceof nomClasse
Exemple : if (x instanceof Livre)
Le rsultat est un boolen :

true si lobjet est du type de la classe


false sinon

On verra des complments sur


instanceof dans le cours sur lhritage

Ordre de priorit des


oprateurs

Utilisation des oprateurs


sur les bits
final byte BIT2 = 2; // = 0000 0010
byte drapeaux = 5; // bits 1 et 3 positionns
// 2me bit 1 (sans toucher aux autres bits) :
drapeaux |= BIT2; // | = ou logique
// 2me bit 0 (sans toucher aux autres bits) :
drapeaux &= ~BIT2; // ~ = inverse les bits ; & = et
logique
// Inverse la valeur du 2me bit (sans toucher aux
// autres bits) :
drapeaux ^= BIT2; // ^ = xor (1 ssi un seul des 2 1)
// Teste la valeur du 2me bit :
if (drapeaux == (drapeaux | BIT2))
System.out.println("Bit 2 positionn");

Dcalages de bits

<< n : dcalage gauche ; idem multiplication


par 2n

>> n : dcalage droite avec extension de


signe (les bits gauche sont remplis avec le bit
de signe) ; comme tous les entiers sont signs
en Java, le signe (le bit le plus gauche) est
conserv ; idem division par 2n

>>> n : dcalage droite en considrant que le


nombre nest pas sign

Exemples de dcalages de
bits
Plus rapide que n / 2 : n >> 1
13 << 2 : 52
-13 << 2 = -52
13 >> 2 = 3
-13 >> 2 = -4 (cest bien -13 / 4 car -4 est bien
le
plus grand entier tel que -4 x 4 < -13)
13 >>> 2 = 3
-13 >>> 2 = 1073741820 (pas dextension de
signe)

Types de donnes en
Java

Types primitifs
Types objets
Casts
Tableaux

Types de donnes en Java

Toutes les donnes manipules par


Java ne sont pas des objets

2 grands groupes de types de


donnes :
types primitifs
objets (instances de classe)

Types primitifs
boolean (true/false)
Nombres entiers : byte (1 octet), short (2
octets), int (4 octets), long (8 octets)
Nombres non entiers, virgule flottante :
float (4 octets), double (8 octets)
Caractre : char (2 octets) ; cod par
le codage Unicode (et pas ASCII)

Caractristiques des
types numriques entiers
byte : compris entre 128 et 127
short : compris entre 32.768 et
32.767
int : compris entre 2.147.483.648 et
2.147.483.647
long : valeur absolue maximum
(arrondie) 9,2 x 1018

Caractristiques des
types numriques non
entiers
float : environ 7 chiffres significatifs ; valeur

absolue (arrondie) infrieure 3,4 x 10 38 et


prcision maximum (arrondie) de 1,4 x 10 -45
double : environ 17 chiffres significatifs ;
valeur absolue (arrondie) infrieure 1,8 x
10308 et prcision maximum (arrondie) de 4,9 x
10-324

Erreurs de calculs
Les types numriques flottants (non
entiers) respectent la norme IEEE 754
Malgr toutes les prcautions prises, on
ne peut empcher les erreurs de calculs :
16.8 + 20.1 donne 36.900000000000006
Pour les traitements de comptabilit on
utilisera la classe java.math.BigDecimal

Constantes nombres
Une constante entire est de type long si
elle est suffixe par L et de type int sinon
Une constante flottante est de type float si
elle est suffixe par F et de type double

Exemples:
35
2589L // constante de type long
4.567e2 // 456,7 de type double
.123587E-25F // de type float
012 // 12 en octal = 10 en dcimal
0xA7 // A7 en hexa = 167 en dcimal

Constantes de type
caractre

Un caractre Unicode entour par

CR et LF interdits (caractres de fin


de ligne) A
\t \n \r \\ \ \"
\u03a9 (\u suivi du code
hexadcimal dun caractre
Unicode)

Autres constantes

Type boolen
false
true

Rfrence inexistante (indique


quune variable de type non primitif
ne rfrence rien) ; convient pour
tous les types non primitifs
null

Valeurs par dfaut


Si elles ne sont pas initialises, les variables
dinstance ou de classe (pas les variables
locales
dune mthode) reoivent par dfaut les
valeurs suivantes :
boolean
false
char
\u0000
Entier (byte short int long)
0 0L
Flottant (float double)
0.0F 0.0D
Rfrence dobjet null

Traitement diffrent pour


les objets et les types
primitifs

Java manipule diffremment les


types primitifs et les objets
Les variables contiennent
des valeurs de types primitifs
des rfrences aux objets

La pile et le tas
Lespace mmoire allou une variable locale
est situ dans la pile
Si la variable est dun type primitif, sa valeur est
place dans la pile
Sinon la variable contient une rfrence un
objet ; la valeur de la rfrence est place dans la
pile mais lobjet rfrenc est plac dans le tas
Lorsque lobjet nest plus rfrenc, un
ramasse-miettes (garbage collector, GC)
libre la mmoire qui lui a t alloue

Exemple dutilisation des


rfrences

int m() {
A a1, a2;
a1 = new A();
a2 = a1;
...
}

Que se passe-t-il lorsque la mthode m()


est
appele ?

int m() {
A a1 = new A();
A a2 = a1;

Rfrences

a1
a2

Pile

Tas

int m() {
A a1 = new A();
A a2 = a1;

a1

Rfrences

Instance de A

a2

Pile

Tas

int m() {
A a1 = new A();
A a2 = a1;

a1

Rfrences

Instance de A

a2

Pile

Tas

int m() {
A a1 = new A();
A a2 = a1;

a1

Rfrences

Instance de A

a2

Pile

Tas

int m() {
A a1 = new A();
A a2 = a1;

Aprs lexcution de la mthode m(),


linstance de A nest plus rfrence ma
reste dans le tas

Instance de A

Pile

Tas

...le ramasse-miette interviendra


un moment alatoire...

Pile

Tas

Ramasse-miettes
Le ramasse-miettes (garbage collector) est une
tche qui
travaille en arrire-plan
libre la place occupe par les instances non
rfrences
compacte la mmoire occupe
Il intervient
quand le systme a besoin de mmoire
ou, de temps en temps, avec une priorit faible

Modificateur final

Le modificateur final indique que


la valeur de la variable ne peut
tre modifie : on
pourra lui donner une valeur une
seule fois dans le programme

Variable de classe final


Une variable de classe static final est
constante dans tout le programme ; exemple :
static final double PI = 3.14;
Une variable de classe static final peut
ne pas tre initialise sa dclaration mais
elle doit alors recevoir sa valeur dans un bloc
d'initialisation static

Variable dinstance final


Une variable dinstance (pas static) final
est constante pour chaque instance ; mais elle
peut avoir 2 valeurs diffrentes pour 2
instances
Une variable d'instance final peut ne pas
tre initialise sa dclaration mais elle doit
avoir une valeur la sortie de tous les
constructeurs

Variable final
Si la variable est dun type primitif, sa valeur
ne peut changer
Si la variable rfrence un objet, elle ne pourra
rfrencer un autre objet mais ltat de lobjet
pourra tre modifi
final Employe e = new Employe("Bibi");
...
e.nom = "Toto"; // Autoris !
e.setSalaire(12000); // Autoris !
e = new Employe("Bob"); // Interdit

Forcer un type en Java


Java est un langage fortement typ
Dans certains cas, il est ncessaire de forcer le
programme considrer une expression comme
tant dun type qui nest pas son type rel ou
dclar
On utilise pour cela le cast (transtypage) :
(type-forc) expression

int x = 10, y = 3;
// on veut 3.3333.. et pas 3.0
double z = (double)x / y; // cast de x suffit

Casts autoriss
En Java, 2 seuls cas sont autoriss
pour les casts :
entre types primitifs,
entre classes mre/anctre et
classes filles (on verra ce cas lors
du cours sur lhritage)

Casts entre types primitifs


Un cast entre types primitifs peut
occasionner
une perte de donnes :
conversion d'un int vers un short
Un cast peut provoquer une simple perte de
prcision :
la conversion d'un long vers un float peut
faire perdre des chiffres significatifs mais pas
l'ordre de grandeur

Une affectation entre types primitifs peut


utiliser un cast implicite si elle ne provoque
aucune perte
De mme, on peut affecter un entier
une
variable de type nombre virgule flottante
Sinon, elle doivent comporter un cast
explicite
Loubli de ce cast explicite provoque une
erreur la compilation

Exemples de Casts
short s = 1000000; // erreur !
Cas particulier dune affectation statique
(reprable par le compilateur) dun int petit :
short s = 65; // pas derreur
Pour une affectation non statique, le cast est
obligatoire :
int i = 60;
short b = (short)(i + 5);
Les casts de types flottants vers les types
entiers tronquent les nombres :
int i = (int)1.99; // i = 1, et pas 2

Problmes de Casts (1)


Une simple perte de prcision ne ncessite pas
de cast explicite, mais peut conduire des
rsultats comportant une erreur importante :
long l1 = 123456789;
long l2 = 123456788;
float f1 = l1;
float f2 = l2;
System.out.println(f1); // 1.23456792E8
System.out.println(f2); // 1.23456784E8
System.out.println(l1 - l2); // 1
System.out.println(f1 - f2); // 8 !

Problmes de Casts (2)


Attention, dans le cas d'un cast explicite, la
traduction peut donner un rsultat totalement
aberrant sans aucun avertissement ni message
d'erreur :
int i = 130;
b = (byte)i; // b = -126 !
int c = (int)1e+30; // c = 2147483647 !

Dpassement de capacit

Casts entre entiers et


caractres
Ils font correspondre un entier et un caractre
qui a comme code Unicode la valeur de lentier
La correspondance char int, long sobtient
par cast implicite
Le code dun char peut aller de 0 65.535
donc char short, byte ncessite un cast
explicite (short ne va que jusqu 32.767)
Les entiers sont signs et pas les char donc
long, int, short ou byte char ncessite un
cast explicite

Les tableaux sont des


objets
En Java les tableaux sont considrs comme
des
objets (dont la classe hrite de Object) :
les variables de type tableau contiennent des
rfrences aux tableaux
les tableaux sont crs par loprateur new
ils ont une variable dinstance (final) :
final int length
ils hritent des mthodes dinstance de
Object

Mais des objets


particuliers

Cependant, Java a une syntaxe


particulire pour
la dclaration des tableaux
leur initialisation

Dclaration et cration des


tableaux
Dclaration : la taille nest pas fixe
int[] tabEntiers;
Dclaration la C possible, mais pas
recommand :
int tabEntiers[];
Cration : on doit donner la taille
tabEntiers = new int[5];
Chaque lment du tableau reoit la valeur par
dfaut du type de base du tableau
La taille ne pourra plus tre modifie par la suite

Initialisation des tableaux

On peut lier la dclaration, la cration et


linitialisation dun tableau ; sa longueur est
alors calcule automatiquement daprs le
nombre de valeurs donnes (attention, cette
syntaxe n'est autorise que dans la
dclaration) :
int[] tabEntiers = {8, 2*8, 3, 5, 9};
Employe[] employes = {
new Employe("Dupond", "Sylvie"),
new Employe("Durand", "Patrick")
}

Affectation en bloc

On peut affecter en bloc tous


les lments d'un tableau :

int[] t;
...
t = new int[] {1, 2, 3};

Tableaux - utilisation

Affectation des lments ; lindice


commence 0 et se termine
tabEntiers.length - 1
tabEntiers[0] = 12;
Taille du tableau
int l = tabEntiers.length; // l = 5
int e = tabEntiers[5]; /* Lve une
ArrayIndexOutOfBoundsException */

Dclarations dans une mthode


int[] m(String[] t)

Paramtres de la ligne de
commande :
exemple de tableau de
class Arguments {
chanes
public static void main(String[] args) {
for (int i=0; i < args.length; i++)
System.out.println(args[i]);
}
}

java Arguments toto bibi


Affichera
toto
bibi

Afficher les lments dun


tableau
La mthode toString() hrite de Object
sans modification, naffiche pas les lments
du tableau
Une simple boucle, comme dans le transparent
prcdent suffit les afficher
Pour des besoins de mise au point il est encore
plus simple dutiliser les mthodes static
toString de la classe Arrays (depuis JDK 5)
static String toString(double[] t),
par exemple, affiche les lments dun tableau
de double, sous la forme [12.5, 134.76]

Utilisation dun tableau


dobjets

Faute frquente : utiliser les objets


du tableau avant de les avoir crs

Employe[] personnel = new Employe[100];


personnel[0].setNom("Dupond");

Employe[] personnel = new Employe[100];


personnel[0] = new Employe();
Cration du
personnel[0].setNom("Dupond"); Premier employ

Comparer 2 tableaux
On peut comparer l'galit de 2 tableaux (au sens
o ils contiennent les mmes valeurs) en
comparant
les lments un un
On peut aussi utiliser les mthodes 2 arguments
de type tableau de la classe Arrays
java.util.Arrays.equals()
par exemple,
java.util.Arrays.equals(double[] a, double[]
a2)

Tableaux plusieurs
dimensions
Dclaration
int[][] notes;
Chaque lment du tableau contient
une
des 30 tudiants
rfrence vers un tableau Chacun
a au plus 3 notes
Cration
notes = new int[30][3];
notes = new int[30][];

Il faut donner au moins


les premires dimensions

Chacun des 30 tudiants


a un nombre de notes
variable

Tableaux plusieurs
dimensions

Dclaration, cration et initialisation


int[][] notes = { {10, 11, 9} // 3
notes
{15, 8} // 2 notes
...
};
Affectation
notes[10][2] = 12;

Exemple
int[][] t;
t = new int[2][];
int[] t0 = {0, 1};
t[0] = t0;
t[1] = new int[] {2, 3, 4, 5};
for (int i = 0; i < t.length; i++) {
for (int j = 0; j < t[i].length; j++) {
System.out.print(t[i][j] + "; ");
}
System.out.println();
}

TD 3
Crer une classe TableauDeRectangles avec les mthodes suivantes
:

TableauDeRectangles() constructeur sans paramtre qui cre un


TableauDeRectangles en dclarant un tableau de 10 rectangles,

TableauDeRectangles(int n) constructeur qui cre un


TableauDeRectangles en dclarant un tableau de n rectangles,

void set (int i, Rectangle r) mthode qui met (en crasant le


rectangle se trouvant l auparavant) le rectangle r l'indice i,

void inserer(int i, Rectangle r) mthode qui insre le rectangle r


l'indice i (en dplacant des rectangles vers la droite si
ncessaire),

boolean rechercher(Rectangle r) mthode qui retourne vrai si le


tableau contient un Rectangle s tel que r.compareTo(s) est 0.

void toutesLesSurfaces() qui affiche la surface de chaque


rectangle,

toString() qui retourne une reprsentation en chaines de


caractres de chaque rectangle contenu dans le tableau.
Tester l'utilisation.

Programmation structure
Les mthodes sont structures en blocs par les
structures de la programmation structure
suites de blocs
alternatives
rptitions
Un bloc est un ensemble dinstructions dlimit
par { et }
Les blocs peuvent tre embots les uns dans les
autres

Porte des identificateurs

Les blocs dfinissent la porte des


identificateurs
La porte dun identificateur
commence lendroit o il est
dclar et va jusqu la fin du bloc
dans lequel il est dfini, y compris
dans les blocs embots

Dclaration des variables


locales complments

Les variables locales peuvent tre dclares


n'importe o dans un bloc (pas seulement au
dbut)
On peut aussi dclarer la variable qui contrle
une boucle for dans linstruction for (la
porte est la boucle) :
for (int i = 0; i < 8; i++) {
s += valeur[i];
}

Porte des identificateurs


Attention ! Java nautorise pas la dclaration
dune variable dans un bloc avec le mme nom
quune variable dun bloc embotant, ou quun
paramtre de la mthode
int somme(int init) {
int i = init;
int j = 0;
for (int i=0; i<10; i++) {
j += i;
}
int init = 3;

Instructions de contrle
Alternative if else
if (expressionBoolenne)
bloc-instructions ou instruction
else
bloc-instructions ou instruction
int x = y + 5;
if (x % 2 == 0) {
type = 0;
x++;
}
else
type = 1;

Expression conditionnelle
expressionBoolenne ? expression1 :
expression2
int y = (x % 2 == 0) ? x + 1 : x;
est quivalent
int y;
if (x % 2 == 0)
y=x+1
else
y = x;

Distinction de cas suivant


une valeur
switch(expression) {
case val1: instructions;
break;
...
case valn: instructions;
break;
default: instructions;
}

Sans break les instructions du cas suivant sont


excutes !

expression est de type char, byte, short, ou int, ou de


type numration

Sil ny a pas de clause default, rien nest excut si


expression ne correspond aucun case

Exemple de switch
int nbVoyelles = 0, nbA = 0,
nbT = 0, nbAutre = 0;
...
switch (lettre) {
case 'a' : nbA++;
case 'e' : // pas dinstruction !
case 'i' : nbVoyelles++;
break;
case 't' : nbT++;
break;
default : nbAutre++;
}

Rptitions tant que


while(expressionBoolenne)
bloc-instructions ou instruction

do
bloc-instructions ou instruction
while(expressionBoolenne)

Rptition for
for(init; test; incrment){
instructions;
}
est quivalent
init;
while (test) {
instructions;
incrment
}

Exemple de for
int somme = 0;
for (int i=0; i < tab.length; i++)
{
somme += tab[i];
}
System.out.println(somme);

for each
Une nouvelle syntaxe introduite par la
version
5 du JDK simplifie le parcours dun tableau
La syntaxe est plus simple/lisible quune
boucle for ordinaire
Attention, on ne dispose pas de la position
dans le tableau (pas de variable de boucle
)
On verra par la suite que cette syntaxe est
encore plus utile pour le parcours dune
collection

Parcours dun tableau


String[] noms = new String[50];
...
// Lire pour chaque nom dans noms
// : se lit dans
for (String nom : noms) {
System.out.println(nom);
}
Voir Exemple PremiereAppli

Instructions lies aux


boucles
break sort de la boucle et continue aprs la
boucle
continue passe litration suivante
break et continue peuvent tre suivis dun
nom dtiquette qui dsigne une boucle
englobant la boucle o elles se trouvent (une
tiquette ne peut se trouver que devant une
boucle)

Exemple de continue et
break
int somme = 0;
for (int i=0; i < tab.length; i++) {
if (tab[i] == 0) break;
if (tab[i] < 0) continue;
somme += tab[i];
}
System.out.println(somme);
Quaffiche ce code avec le tableau
1 ; 2 ; 5 ; -1 ; 0 ; 8 ; -3 ; 10 ?

tiquette de boucles
boucleWhile: while (pasFini) {
...
for (int i=0; i < t.length; i++) {
...
if (t[i] < 0)
continue boucleWhile;
...
}
...
}

Passage des arguments


des mthodes
Le passage se fait par valeur (les valeurs
des
arguments sont recopies dans lespace
mmoire de la mthode)
Attention, pour les objets, la valeur passe
est une rfrence ; donc,

si la mthode modifie lobjet rfrenc par un


paramtre, lobjet pass en argument sera
modifi en dehors de la mthode
si la mthode change la valeur dun paramtre
(type primitif ou rfrence), a na pas
dincidence en dehors de la mthode

Exemple de passage de
paramtres

public static void m(int ip, Employe e1p, Employe e2p) {


ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);

}
public static void main(String[] args) {
Employe e1 = new Employe("Patrick", 1000);
Employe e2 = new Employe("Bernard", 1200);
int i = 10;
m(i, e1, e2);
System.out.println(i + '\n' + e1.salaire+ '\n' + e2.nom);
}

Que sera-t-il affich ?

Rep: 10 800.0 Bernard

main()
Employe e1 = new Employe("Patrick", 1000);
Employe e2 = new Employe("Bernard", 1200);
int i = 10;

i
10

e1

Patrick
1000

e2

Bernard
1200

Pile

Tas

main():
m(i,e1,e2)

ip
m

e1p

10
e2p
Pas de variables locales
i
10

e1

Patrick
1000
Bernard
1200

e2

Pile

Tas

m():
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);

ip
m

e1p

100
e2p
Pas de variables locales
i
10

e1

Patrick
1000
Bernard
1200

e2

Pile

Tas

m():
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);

ip
m

e1p

100
e2p
Pas de variables locales
i
10

e1

Patrick
800
Bernard
1200

e2

Pile

Tas

m():
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);

ip
m

e1p

100
e2p
Pas de variables locales
i
10

e1

Patrick
800
Bernard
1200

e2

Pile

Tas

m():
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);

ip
m

e1p

100
e2p
Pas de variables locales
i
10

e1

Patrick
800
Bernard
1200

e2

Pile

Tas

m():
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);

ip
m

e1p

Pierre

e2p

Patrick
800

100
Pas de variables locales
i
10

e1

Bernard
1200

e2

Pile

Tas

Main():
System.out.println(i + '\n' + e1.salaire+ '\n' + e2.nom);

Pierre
m

Pas de variables locales


i
10

e1

Patrick
800
Bernard
1200

e2

Pile

Tas

Paramtre final

final indique que le paramtre ne


pourra tre modifi dans la mthode
Si le paramtre est dun type primitif, la
valeur du paramtre ne pourra tre
modifie :
int m(final int x)
Attention ! si le paramtre nest pas
dun type primitif, la rfrence lobjet
ne pourra tre modifie mais l'objet luimme pourra l'tre : int m(final
Le salaire de lemploy
e1 pourra tre modifi
Employe e1)

Nombre variable
darguments
Quelquefois il peut tre commode dcrire
une mthode avec un nombre variable
darguments
Lexemple typique est la mthode printf du
langage C qui affiche des arguments selon
un
format daffichage donn en premier
argument
Depuis le JDK 5.0, cest possible en Java

Syntaxe pour arguments


variables

A la suite du type du dernier


paramtre on peut mettre ... :
Exemple

String...
Object...
int...

Traduction du compilateur
Le compilateur traduit ce type spcial par un
type tableau ie m(int p1, String... params)
est traduit par
m(int p1, String[] params)

Le code de la mthode peut utiliser params


comme si ctait un tableau (boucle for,
affectation, etc.)

Exemple
public static int max(int... valeurs) {
if (valeurs.length == 0)
throw new IllegalArgumentException(
"Au moins 1 valeur requise");
int max = Integer.MIN_VALUE;
for (int i : valeurs) {
if (i > max)
max = i;
}
return max;
}
Voir exemple Max.java

Retour de la valeur dune


mthode
return sert sortir d une mthode en
renvoyant une valeur (du type dclar pour le
type retour dans la dfinition de la mthode) :
return i * j;
return new Cercle(p, x+y);
return sert aussi sortir dune mthode sans
renvoyer de valeur (mthode ayant void comme
type retour) :
if (x == 0)
return;

Rcursivit des mthodes


Les mthodes sont rcursives ; elles peuvent
sappeler elles-mmes :
static long factorielle(int n) {
if (n == 0)
return 1;
else
return n * factorielle(n - 1);
}

Que fait le programme suivant:


public class ListeNoeud {
private Integer element;
private ListeNoeud suivant;
public ListeNoeud(Integer i,
ListeNoeud l) {
element = i;
suivant = l;
}
public ListeNoeud(Integer i) {
this(i,null);
}
public ListeNoeud getSuivant() {
return suivant;
}
public String toString() {
return element.toString();
}
}
public class Liste {
private ListeNoeud premier;
public Liste() {
premier = null;
}
public boolean estVide() {
return (premier == null);
}

public void inserer(Integer i) {


if (estVide())
premier = new ListeNoeud(i);
else
premier = new ListeNoeud(i,premier);
}
public String toString() {
String s = "";
if (estVide())
return "Vide";
ListeNoeud p = premier;
while (p != null) {
s = s + " " + p.toString();
p = p.getSuivant();
}
return s;

}
public static void main (String [] args) {
Liste l = new Liste();
l.inserer(new Integer(1));
l.inserer(new Integer(2));
l.inserer(new Integer(3));
System.out.println(l);
}
}

TD

Crer une classe ListeDeRectangles avec une


mthode qui affiche la surface de chaque rectangle.

Tester l'utilisation.

ListeDeRectangles() constructeur sans paramtre,


boolean estVide() qui indique si la liste est vide,
void inserer(Rectangle r) qui ajoute un rectangle au
dbut de la liste,
String toString() qui donne des informations sur la
liste de Rectangles sous forme de chane de
caractres.

Testez l'utilisation.

Vous aimerez peut-être aussi