Académique Documents
Professionnel Documents
Culture Documents
Cours Java3
Cours Java3
de
programmation
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
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 */
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 :
Dcalages de bits
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 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
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
Autres constantes
Type boolen
false
true
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
int m() {
A a1, a2;
a1 = new A();
a2 = a1;
...
}
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;
Instance de A
Pile
Tas
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
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
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)
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
Dpassement de capacit
Affectation en bloc
int[] t;
...
t = new int[] {1, 2, 3};
Tableaux - utilisation
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]);
}
}
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][];
Tableaux plusieurs
dimensions
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
:
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
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;
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++;
}
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
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;
...
}
...
}
Exemple de passage de
paramtres
}
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);
}
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
e1
Patrick
800
Bernard
1200
e2
Pile
Tas
Paramtre final
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
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)
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
}
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
Tester l'utilisation.
Testez l'utilisation.