Java Notions Fondamentales Open Classroom
Java Notions Fondamentales Open Classroom
Java Notions Fondamentales Open Classroom
de casablanca
Ecole supérieure de technologie
Programmation
orientée objet
Avec java
Préparé par :
Larbi Hassouni
Sources principales :
Sites :
1. www.oracle.com (le plus complet et le plus à jour : c'est la principale source)
2. http://deptinfo.unice.fr/~grin/
Livres :
1. Au cœur de Java 2 : Notions fondamentales (Cay S.Horstmann & Gary Cornell)
2. Au cœur de Java2 : Foctions avancées(Cay S.Horstmann & Gary Cornell)
3. BIG Java (Cay S.Horstmann)
4. Java How to program (Deitel)
5. Beginning Java 2 (Ivor Horton)
6. Practical Database Programming with Java (Ying Bai)
7. Data Structures & Algorithms in JAVA (MICHAEL T. GOODRICH, ROBERTO TAMASSIA)
8. Objetc-Oriented Data Structures Using Java (NELL DALE, DANIEL T.JOYCE, CHIP
WEEM)
9. Conception et programmation orientée objet (Bertrand Meyer)
10. Java En Concentré (David Flanagan)
1
Technologie JAVA
Exemple de programme en
Le code de la classe doit être
enregistré dans un fichier de JAVA Tout code java doit être défini à
même nom (casse comprise) l'intérieur d'une classe
que la classe
1
3
HelloWorld.java
public class HelloWorld {
2
Compilation d’un code source
3
La compilation fournit du bytecode
Compilateur
javac HelloWorld.java
javac SousRep/HelloWorld.java
4
Le langage Java
Un langage compilé & interprété
• Compilation d'un programme JAVA : génération de byte-code
Exécution du bytecode
5
Exécution avec java
Les JVM
6
Le bytecode peut être exécuté par
n'importe quelle JVM
Bytecode
UneClasse.class
WRITE ONCE
RUN EVERYWHERE
7
Une certaine lenteur...
8
Spécifications de Java
Plate-forme Java
9
3 éditions de Java
Votre environnement de
développement
♠ Éditeur de texte NotePad
♠ Compilateur (javac)
♠ Débogueur (jdb)
HASSOUNI Larbi Présentation de Java
20
10
Votre environnement de
développement
♠ Nombreux IDE (Integrated Development Environment)
JDeveloper
Oracle
Java Studio WebSphere Studio JBuilder
Creator Application Developper Borland
Sunsoft (VisualAge) IBM
Variables d’environnement
11
Une classe Point
/** Modélise un point de coordonnées x, y */
public class Point {
private int x, y;
public Point(int x, int y) { // un constructeur
this.x = x;
this.y = y;
}
12
Compilation et exécution de la
classe Point
13
Architecture d’un
programme source Java
14
Types de programmes Java
Application indépendante
♠ Application doit posséder une classe principale
– classe possédant une méthode de signature
Tableau de chaînes de caractères
(équivalent à argc, argv du C)
public static void main(String[] args)
java TestPoint
15
Applet
♠ Classe ne possédant pas de méthode main()
• Elle est véhiculée vers un client http (navigateur Web) via une
page HTML qui contient son url
import java.awt.*;
Exemple d’applet
import java.applet.*;
public class Checkerboard extends Applet {
/* This applet draws a red-and-black checkerboard.
It is assumed that the size of the applet is 160 by 160 pixels.
*/
public void paint(Graphics g) {
int row; // Row number, from 0 to 7
int col; // Column number, from 0 to 7
int x,y; // Top-left corner of square
for ( row = 0; row < 8; row++ ) {
for ( col = 0; col < 8; col++) {
x = col * 80; y = row * 80;
if ( (row % 2) == (col % 2) )
g.setColor(Color.red);
else
g.setColor(Color.black);
g.fillRect(x, y, 80, 80);
}
} // end for row
} // end paint()
} // end class Checkerboard
HASSOUNI Larbi Présentation de Java
32
16
Exemple de page Web qui contient
une applet
<html>
<head>
<title>Utilsation des applets</title>
</head>
<body>
<h1 align = "center">Utilisation des applets</h1>
<p align=center>
<applet code="Checkerboard.class"
height=640 width=640>
</applet>
</p>
</body>
<html>
HASSOUNI Larbi Présentation de Java
33
17
Étapes pour l’exécution d’une applet
html
Client 2. Chargement de la page Web Serveur
http html
3. Demande chargement de l’applet
Navigateur HTTP
intégrant une référencée dans la page
machine .class
virtuelle Java 4. Chargement du bytecode de
La classe .class
3. Exécution de l’applet
dans la JVM du client
Présentation de Java
HASSOUNI Larbi
35
Exécution de l'applet
18
Utilité des applets
♠ Les applets permettent de faire des pages Web plus
riches (grâce aux possibilités offertes par Java)
19
ELEMENTS DE BASE
DU LANGAGE JAVA
1
Identificateurs Java
● Identificateurs
– Sont des tokens qui représentent les noms des variables, méthodes,
classes, etc.
Les noms des classes commencent par une majuscule . Si le nom est
formé de plusieurs mots, la première lettre de chaque mot doit être en
majuscule.
1
Mots clés Java
● Les mots clés sont des identificateurs prédéfinis qui ont une signification
spécifique en Java.
● Vous ne pouvez pas utiliser un mot clé comme nom de variable, classe,
methode ... etc.
● La liste des mots clés est fournie ci-dessous.
Commentaires Java
● Commentaires ?
2
Commentaires Java
– Commentaires pour l’outil Javadoc, qui sont utilisés pour générer une
documentation HTML sur le programme.
Exemple:
/**
Ceci est un exemple de commentaires javadoc\n qui génére une
documentation HTML. Il utilise les balises comme:
@author MOHA ayoub
*/
Variables
Définition: Une variable est une donnée représentée par un identificateur
Vous devez explicitement donner un nom et un type à chaque variable que vous
voulez utiliser dans le programme.
Le nom d’une variable est utilisé pour référencer la donnée que la variable
contient.
Le type d’une variable détermine quelles sont les valeurs que la variable peut
contenir et quelles opérations peuvent être effectuées sur la variable.
3
Variables
Pour donner à une variable un nom et un type, nous écrivons une
déclaration de variable de la manière suivante :
<type> <nomDeLaVariable>
Exemple : double tauxTva;
La partie du programme où le nom d’une variable peut être utilisé par son
simple nom (sans qualificatif) est appelé scope de la variable
Types de données
(Data Types)
Le type de donnée d’une variable détermine l’ensemble des valeurs que la variable
peut contenir.
Il détermine également le type d’opérations qui peuvent être effectuées sur elle.
Par exemple:
Une variable de type int ne peut contenir que des valeurs entières (négatives ou
positives).
Sur une variable entière nous pouvons effectuer des opérations arithmétiques
(addition, soustraction …etc)
4
Types de données
Types primitifs
Type référence
Types de données
Types primitifs
Exemple:
Une variable de type int mémorise sa valeur sur 32 bits et utilise
la représentation en complément à 2
5
Plus grandes valeurs des types primitifs
//real numbers
float largestFloat = Float.MAX_VALUE;
double largestDouble = Double.MAX_VALUE;
} //fin de main
} //HASSOUNI
fin de la Larbi
classe Eléments de base du langage 23
6
Types de données primitifs
MotClé Description-Taille/Format Intervalle
Entiers
byte Entier signé sur 1octet en Cà2 -27 (-128) à + 27-1(127)
short Entier signé sur 2 octets en Cà2 -215(-32768)à + 215-1
int Entier signé sur 4 octets en Cà2 -231 à + 231-1
long Entier signé sur 8 octets en Cà2 -263 à + 263-1
Réels
Réel en virgule flottante simple -3.4..e38 à -1.4..e-45 à
float
précision sur 4 octets (IEEE 754) 1.4..e-45 à 3.4..e38
Réel en virgule flottante double -1.7…e308 à -4.9…e-324
double 4.9…e-324 à 1.7…e308
précision sur 8 octets (IEEE 754)
Autres types
Un seul caractère sur 2 octets Code unicode de
char
(Unicode) 0 à 65535
boolean
HASSOUNI Larbi Valeur boolèene sur 1de
Eléments bitbase du langage
true or false 24
Types Références
La valeur d’une variable de type référence est une référence (adresse de) à la
valeur à ou à l’ensemble des valeurs représenté par la variable.
Objet
Nom d’objet Référence Ou
tableau
Une référence est appelé Pointeur ou adresse dans les autres langages(C, …)
Le Langage Java n’autorise pas l’utilisation explicite des pointeurs.
7
Constantes ou Valeurs Litterals
I = 20 ;
20 est une valeur littérale.
Le compilateur attribue a la valeur 20 le type int par défaut.
Le tableau de la page suivante présente différents type de
valeurs littérales.
Constantes numériques
Une constante «entière» est de type long si elle est suffixée par «L»
et de type int sinon
Une constante «flottante» est de type float si elle est suffixée par
«F» et de type double sinon
Exemples
8
Constantes de type caractère
Une constante de type char est un caractère Unicode entouré par 2 simples
quotes ‘’
Exemples :
'A' 'a' 'ç' '1' '2'
'α'
HASSOUNI Larbi Eléments de base du langage 28
Autres constantes
Constantes de Type booléen
false
true
Constante référence
String n’est pas un type primitif, c’est une classe, et donc un type référence
Une constante de type String est une suite de caractères délimités par deux
guillemets(" ")
9
Noms de variables
10
Scope d’une variable
Variable membre
(member variable)
Elle est déclarée à l’intérieur d’une classe mais en dehors de toute méthode ou
constructeur.
Nous étudierons en détail les variables membres dans une leçon ultérieure.
11
Variable locale
(local variable)
Le Scope d’une variable locale s’étend de l’endroit où elle est déclarée jusqu’à la
fin du bloc où elle est déclarée.
Toutes les variables déclarées dans la méthode main sont des variables locales.
Le Scope de ces variables s’étend de leur lieu de déclaration jusqu’à la fin de la
méthode main indiquée par l’accolade fermante }.
Paramètre de méthode
(method parameter)
Les paramètres sont utilisés pour passer des valeurs aux méthodes et aux
constructeurs.
12
Paramètres de gestionnaire d’exception
(exception-handler parameter)
if (...)
{
int i = 17; ...
}
System.out.println(« La valeur de i = " + i); // erreur
13
Initialisation de variable
Une variable locale ou variable membre peut être initialisée par une
instruction d’affectation lors de sa déclaration.
Le type de la variable doit être compatible avec le type de la valeur qui lui
est affectée.
L’exemple ci-dessous montre des exemples d’initialisation de variables:
//Entiers
byte largestByte = Byte.MAX_VALUE;
short largestShort = Short.MAX_VALUE;
int largestInteger = Integer.MAX_VALUE;
long largestLong = Long.MAX_VALUE;
//Nombres réels
float largestFloat = Float.MAX_VALUE;
double largestDouble = Double.MAX_VALUE;
//Autres types primitifs
char aChar = 'S';
boolean aBoolean = true;
Les paramètres des méthodes et des gestionnaires d’exception ne sont pas
initialisées selon cette méthode; Ils reçoivent leur valeur à partir du code
appelant Larbi
HASSOUNI Eléments de base du langage 38
Variables « Finales »
(Final Variables )
On peut déclarer une variable de n’importe quel Scope comme étant final.
La valeur d’une variable final ne peut pas être modifié après son initialisation.
Pour déclarer une variable final, utilisez le mot clé final dans la déclaration de la
variable juste avant le type.
Exemple:
Cette instruction déclare une variable final et l’initialise une fois pour toute.
14
Variables « Finales »
(Final Variables )
Une variable locale final qui a été déclarée sans être initialisée est appelé
variable « blank final ». Une fois cette variable est initialisée, toute tentative
future pour lui assigner une autre valeur engendrera une erreur lors de la
compilation.
Exemple:
int i = 64;
char c = (char)i;
15
Cast entre type primitifs
Par exemple, la conversion d'un long vers un float peut faire perdre des
chiffres significatifs mais pas l'ordre de grandeur
int i = 130;
double x = 20 * i;
Int i = 130;
b = (byte)i; // b = -126 !
HASSOUNI Larbi Eléments de base du langage 43
16
Cast entre entiers et caractères
La correspondance char → int, long s’obtient par cast implicite
Les correspondances
nécessitent un cast explicite (les entiers sont signés et pas les char)
int i = 80;
c = (char)i
i = c;
short s = (short)i;
Opérateurs
Un opérateur effectue une opération (ou fonction) sur un, deux ou trois
opérandes.
Un opérateur qui requiert un seul opérande est appelé opérateur unaire.
Par exemple, ++ est un opérateur unaire qui incrémente la valeur de son
opérande de 1.
17
Opérateurs
Les opérateurs unaires supportent les deux notations prefix et postfix.
La notation prefix signifie que l’opérateur apparaît avant son opérande.
Opérateur op // notation prefix (op signifie opérande).
Tous les opérateurs binaires utilisent la notation infix, qui signifie que l’opérateur
apparaît entre ses opérandes.
Op1 opérateur op2 //notation infix
Opérateurs
En plus d’effectuer une opération, un opérateur retourne une valeur.
Par exemple, les opérateurs arithmétiques tels que les opérateurs d’addition et
de soustraction retournent comme résultat un nombre dont le type dépend de
type de leurs opérandes.
18
Opérateurs
Opérateurs arithmétiques
Opérateurs d’affectation
Autres opérateurs
Opérateurs arithmétiques
Le lanagage Java fournit un ensemble d’opérateurs arithmétique qui opèrent sur
des nombres entiers et en virgules flottante.
Ces opérateurs sont : + (addition), -(soustraction), *(multiplication), /(division), et
%(modulo). Ils ont la même signification qu’en C.
Le tableau suivant présente ces opérateurs:
19
Types des résultats des Opérations Arithmétiques
Type du
Type des Opérandes
Resultat
Aucun opérande n’est de type float ou double (Arithmétique
int
entière); aucun opérande n’est de type long.
Aucun opérande n’est de type float ou double (Arithmétique
long
entière); au moins un opérande est de type long.
Au moins un opérande est de type float; aucun opérande n’est
float
de type double.
double Au moins un opérande est de type double.
20
Opérateurs Arithmétiques Unaires
Chacun de ces deux opérateurs peut apparaître avant (prefix) ou après (postfix)
son opérande.
21
Récapitulatif sur les opérateurs d’incrémentation(++)
et de décrémentation (--)
Operateurs Relationnels
22
Operateurs Logiques (ou conditionnels)
Les opérateurs relationnels sont souvent utilisés avec les opérateurs logiques
Le langage Java fournit six opérateurs logiques, 5 sont binaires et un est unaire
23
Opérateurs de décalage et bit à bit
Operateurs Logiques
Le tableau ci-dessous présente les quatre opérateurs logiques fourni par Java pour
Effectuer des opérations bit à bit sur leurs opérandes
Operateurs Logiques
Operateur Utilisation Operation
-Opération AND bit à bit si les deux opérandes sont
des nombres;
& op1 & op2
-Opération AND logique si les deux opérandes sont
booléen
-Opération OR bit à bit si les deux opérandes sont
des nombres;
| op1 | op2
-Opération OR logiques si les deux opérandes sont
booléens
^ op1 ^ op2 Opération OR exclusif(XOR)
~ ~op Complément à un des bits de l’opérande op
24
Opérateurs d’affectation
Le langage Java utilise l’opérateur = pour affecter une valeur à une variable.
l’opération d’affectation.
Supposez que vous voulez ajouter un nombre à une variable, et puis affecter le
i = i + 2;
Vous pouvez écrire de façon plus concise cette instruction en utilisant l’opérateur
+=.
Operateurs d’affectation
Le tableau suivant présente les différents opérateurs d’affectation fournis par Java.
25
Autres Opérateurs
Le langage Java fourni d’autres opérateurs qui sont fournis dans le tableau ci-dessous.
Operateur Utilisation Description
si op1 est true, retourne op2; sinon, reoturne
?: op1 ? op2 : op3
op3
Voir Création et Utilisé pour déclarer un tableau, pour créer un
[] utilisation des tableau, et pour accéder aux éléments d’un
tableaux tableau.
Voir Utilisation des Utilisé pour former des noms longs (ou nom
.
Objets qualifiés)
Voir Définition des Delimite une liste de paramètres séparés par
(params)
méthodes des virgules
Convertit op vers le type spécifié; une
(type) (type) op exception est relevée si le type de op n’est pas
compatible avec type
Voir Utilisation des
Objets et Création
new Crée un nouveau objet ou tableau.
et Utilisation des
tableaux
instanceof op1 instanceof op2
HASSOUNI Larbi Eléments de base du langage
Retourne true si op1 est une instance de op2.62
Operateurs Java
Le tableau ci-dessous donne la liste complète des opérateurs du langage Java.
26
> op1 > op2 Returns true if op1 is greater than op2
>= op1 >= op2 Returns true if op1 is greater than or equal to op2
< op1 < op2 Returns true if op1 is less than op2
<= op1 <= op2 Returns true if op1 is less than or equal to op2
== op1 == op2 Returns true if op1 and op2 are equal
!= op1 != op2 Returns true if op1 and op2 are not equal
&& op1 && op2 Returns true if op1 and op2 are both true; conditionally evaluates op2
|| op1 || op2 Returns true if either op1 or op2 is true; conditionally evaluates op2
27
= op1 = op2 Assigns the value of op2 to op1
+= op1 += op2 Equivalent to op1 = op1 + op2
-= op1 -= op2 Equivalent to op1 = op1 - op2
*= op1 *= op2 Equivalent to op1 = op1 * op2
%= op1 %= op2 Equivalent to op1 = op1 % op2
&= op1 &= op2 Equivalent to op1 = op1 & op2
|= op1 |= op2 Equivalent to op1 = op1 | op2
^= op1 ^= op2 Equivalent to op1 = op1 ^ op2
<<= op1 <<= op2 Equivalent to op1 = op1 << op2
>>= op1 >>= op2 Equivalent to op1 = op1 >> op2
>>>= op1 >>>= op2 Equivalent to op1 = op1 >>> op2
28
Expression, Instructions et Blocs
Expressions
Les expressions sont utilisées pour calculer et affecter des valeurs aux variables.
d’un programme
Soit l’expression:
4+7*2
Quel est le résultat de son évaluation? :
11 * 2 = 22 //évaluation du + en premier
ou
4 + 14 = 18 // évaluation de * en premier
Pour éviter cette ambiguité on peut utiliser les parenthèses: Par exemple :
(4 + 7) * 2 : donnera comme résultat 22 car l’expression entre parenthèse est
évaluée en premier
29
Ordre de Priorité des opérateurs dans l’ordre décroissant
Type d’opérateurs Priorité
postfix expr++ expr--
unaire ++expr --expr +expr -expr ~ !
multiplicatif * / %
additif + -
décalage << >> >>>
relationnel < > <= >= instanceof
egalité == !=
AND bit à bit &
XOR bit à bit ^
OR bit à bit |
AND logique &&
OR logique ||
Conditionnel ?:
Affectation
HASSOUNI Larbi = +=de-=
Eléments *= du
base /= langage
%= &= ^= |= <<= >>= >>>= 70
Les opérateurs qui ont une priorité plus élevée s’évaluent avant ceux qui ont
une priorité relativement plus faible.
Les opérateurs qui se trouvent sur la même ligne ont la même priorité.
Exemple : 14 / 2 * 3 = 7 * 3 = 21
par contre les opérateurs d’affectation sont évalués de la droite vers la gauche.
30
Fonctions Mathématiques
Les fonctions mathématiques classiques se trouvent dans la classe Math. Le
tableau ci-dessous fournit quelques fonctions:
Fonction Description
Les Instructions
31
Instructions
- Expressions d’affectation
- Appels de méthodes
Exemples d’instruction-expressions.
//instruction d’affectation
uneValeur = 14.5 ;
//instruction d’incrémentation
uneValeur++ ;
32
En plus des instruction-expressions, il ya deux autres types
d’instructions.
Bloc
Un bloc est un groupe d’instructions placées entre crochet {} et peut être
utilisé
n’importe où une instruction simple est autorisée.
Le code qui suit présente deux blocs qui contient chacun une seule
instruction
if (Character.isUpperCase(aChar)) {
System.out.println("The character " + aChar + " is uppercase.");
}
else {
System.out.println("The character " + aChar + " is lowercase.");
}
33
Instructions de contrôle d’exécution
Lorsque vous écrivez un programme, vous
écrivez une suite d’instructions que vous
stockez dans un fichier.
34
Par exemple, dans la partie du code ci-dessous, l’instruction if
exécute l’instruction
System.out.println uniquement dans le cas ou la valeur
retournée par Character.isUpperCase(aChar) est égale à
true.
char aChar;
...
if (Character.isUpperCase(aChar)) {
System.out.println("The character " + aChar + " is
uppercase.");
Gestion des
try-catch-finally, throw
exceptions
35
Format général d’une instruction de contrôle
if (expressionBooléenne)
bloc-instructions ou instruction
else
bloc-instructions ou instruction
if (x % 2 == 0) {
type = 0;
x++; Un bloc serait préférable, même
} s’il n’y a qu’une seule instruction
else
type = 1;
36
Expression conditionnelle
(Opérateur ternaire)
int y = (x % 2 == 0) ? x + 1 : x;
est équivalent à
Parenthèses pas
int y; indispensables
if (x % 2 == 0)
y=x+1
else
y = x;
HASSOUNI Larbi Eléments de base du langage 84
37
Exemple de switch
switch (year) {
case 7: annualInterestRate = 7.25;
break;
case 15: annualInterestRate = 8.50;
break;
case 30: annualInterestRate = 9.0;
break;
default: System.out.println(
"Wrong number of years, enter 7, 15, or 30");
}
Organigramme de switch
7 default
numOfYears
15 30
Next
Statement
38
Exemple de switch
char lettre;
int nbVoyelles = 0, nbA = 0,
nbT = 0, nbAutre = 0;
Lettre = 'b';
switch (lettre) {
case 'a' : nbA++;
case 'e' : // pas d’instruction !
case 'i' : nbVoyelles++;
break;
case 't' : nbT++;
break;
default : nbAutre++;
}
do
Le bloc
bloc-instructions ou instruction d’instructions est
while(expressionBooléenne) exécuté au moins
une fois
39
Organigramme de la boucle while
while (continuation-condition) {
loop-body;
}
Next statement false
Continuation
condition?
true
Statement(s)
Next
Statement
HASSOUNI Larbi Eléments de base du langage 90
int i = 0;
while (i < 100) { (i < 100)
false
System.out.println(
"Welcome to Java!");
i++; true
} System.out.println("Welcoem to Java!");
i++;
Next
Statement
40
Exemple : diviseur d’un nombre
public class Diviseur {
public static void main(String[ ] args) {
int i = Integer.parseInt(args[0]);
int j = 2;
while (i % j != 0) {
j++;
}
System.out.println("PPD de " + i + " : " + j);
}
}
do { Statement(s)
<Statements>
true
} while (continue-condition); Continue
condition?
<Next Statement>;
false
Next
Statement
41
Répétition for
true
Statement(s)
(loop-body)
Next
Statement
42
Exemple de la boucle for
i=0
false
i++ i<100?
true
int i;
System.out.println(
for (i = 0; i<100; i++) { “Welcom to Java!”);
System.out.println(
"Welcome to Java");
Next
} Statement
<Next Statement>
HASSOUNI Larbi Eléments de base du langage 96
43
Parcours d’un tableau
public class ForEach{
public static void main(String[] args){
String[ ] noms = {"Larbi", "Adil", "Tarik", "Mohammed"};
// Lire « pour chaque nom dans noms »
// « : » se lit « dans »
for (String nom : noms) {
System.out.println(nom);
}
}
}
44
Instruction break
false
Continuation
condition?
While(Continuation-condition){
Statements true
Statement(s)
break;
Statements break
} Statement(s)
Instruction continue
While(<Continuation-condition>){ false
Continue
condition?
<Statements>
continue; true
<Statements> Statement(s)
} continue
<Next statement>
Statement(s)
45
Exemple de continue et break
Étiquette de boucles
46
Java
Classes et Objets
1
JAVA : Classes et Objets
(1ère partie)
Classes
Objets
Références
Création d’objets
● constructeur par défaut
● gestion mémoire
Accès aux attributs d’un objet
Envoi de messages
this : l’objet “courant”
Objets et encapsulation
Classe
1
Classe : Notation UML
x : double;
attributs
y : double;
class Point {
} HASSOUNI Larbi 5
Classes et Objets
2
Classe : Syntaxe java
Visibilité des attributs
class Point {
Les attributs sont des
double x; Variables « globales »
double y; au module que
constitue la classe :
void translater(double dx, double dy) { ils sont accessibles dans
Toutes les méthodes de
x += dx; la classe soit par leur
simple nom soit en étant
y += dy; qualifiées par le mot this
}
double distance() {
double dist;
dist = Math.sqrt( x * x + y * y );
return dist;
}
Classes et Objets
} HASSOUNI Larbi 6
class Visibilité {
int x
void methodeA() {
float z, w; … x:int z:float w:float
z= …;
}
void methodeB(float y) {
int z; x:int y:float z:int
do { Variable peut être définie
…;float w n'importe où dans un bloc
3
Syntaxe java:Visibilité des variables
De manière générale
Variable visible à l'intérieur du bloc (ensembles des instructions entre { … }) où elle est définie
class Visibilité {
int x
void methodeA() {
float z, w; … x:int z:float w:float
i = …;
}
void methodeB(float y) {
int z; float x x : int y: float z:int
do {
float
…;float w
Objets
Un objet est instance d'une (seule) classe :
Tout objet admet une identité qui le distingue pleinement des autres objets :
4
Objets : Notation UML
représentation
explicite de
Point
la classe Relation
d’instanciation
« instance de »
Nom de classe
Nom d’objet
point1 : Point
x = 22 Valeurs des
y = 14 attributs
Objets
Chaque objet point instance de la classe Point possédera son propre x et
son propre y
Point
x = 10 x = 20 x = 30
y = 15 y = 25 y = 35
5
Objets : Structure des classes et objets en mémoire
objet constitué d'une partie "Statique" et d'une partie "Dynamique”
Partie statique :
• ne varie pas d'une instance de classe à une autre
• un seul exemplaire pour l'ensemble des instances d'une classe
• constituée des méthodes de la classe
• permet d'activer l'objet
Partie dynamique :
• varie d'une instance de classe à une autre
• varie durant la vie d'un objet
• constituée d'un exemplaire de chaque attribut de la classe.
mémoire double x , y
Partie statique
structure de la classe void translater(…)
double distance()
Référence
Pour désigner des objets d'une même classe (attributs ou variables dans le
corps d ’une méthode) on utilise des variables d’un type particulier : les
références
Une référence contient l’adresse d’un objet
pointeur vers la structure de données correspondant aux attributs
(variables d’instance) propres à l’objet.
mémoire
référence isa Référence null
x 57
y 6
6
Référence : Déclaration en java
Déclarations de références
Point p1;
Point p2, p3;
Point
mémoire p1; Point p1 = null;
Référence null
P1
Point p1;
…
Point p2;
p2 = p1;
if(p1==p2) ……
p1++;
…
p2 += p1 +3;
HASSOUNI Larbi Classes et Objets 15
7
Création d’objets
8
Création d’objets
Gestion de la mémoire
L’instanciation provoque une allocation dynamique de la mémoire
En Java le programmeur n’a pas à se soucier de la gestion mémoire
Si un objet n’est plus référencé (plus accessible au travers d’une référence),
la mémoire qui lui était allouée est automatiquement “ libérée ” (le
« garbage collector » la récupérera en temps voulu).
Attention : destruction asynchrone (car gérée par un thread)
Aucune garantie de la destruction (sauf en fin de programme! Ou "appel
explicite au garbage collector")
pour accéder aux attributs d'un objet on utilise une notation pointée :
nomDeObjet.nomDeVariableDinstance
Point p1;
p1 = new Point();
mémoire isa
Point p2 = new Point(); x 10
P1 y
Point p3 = p2; 0
P3 y 24
p3.y = p1.xLarbi
HASSOUNI + p2.x; Classes et Objets 19
9
Envoi de message
pour "demander" à un objet d'effectuer une opération (exécuter l'une de
ses méthodes) il faut lui envoyer un message
10
Envoi de message
Paramètres des méthodes
Une référence typée par n’importe quelle classe (connue dans le contexte
de compilation)
exemple : savoir si un Point est plus proche de l’origine qu’un autre Point.
Envoi de message
Paramètres des méthodes (suite)
Ajout d’une méthode à la classe Point
/**
* Test si le Point (qui reçoit le message) est plus proche de l’origine qu’un autre Point.
* @param p le Point avec lequel le Point recevant le message doit être comparé
* @return true si le point recevant le message est plus proche de l’origine que p, false
* sinon.
*/
boolean plusProcheOrigineQue(Point p) {
if (this.distance() < p.distance())
return true;
else
return false;
}
Utilisation
Point p1 = new Point();
Point p2 = new Point();
P1.translater(10,15);
p2.translater(20,5);
if (p1.plusProcheORigineQue(p2))
System.out.println("p1 est plus proche de l’origine que p2");
else
System.out.println("p2 est plus proche de l’origine que p1");
HASSOUNI Larbi Classes et Objets 23
11
Envoi de message
Paramètres des méthodes (suite)
} p1 y 0
}
x 25
HASSOUNI
Classes Larbi
et Objets p2 y 24
21
Dans un message l'accent est mis sur l'objet (et nom pas sur l'appel de fonction)
peut être utilisé pour rendre explicite l'accès aux propres attributs et
méthodes définies dans la classe
12
L’objet courant
This et envoi de message
Pour invoquer, dans le code d’une classe, l’une des méthodes qu’elle définit
(récursivité possible)
class Point {
double x;
double y; • L’objet qui reçoit le message se
// constructeurs renvoie à lui-même un autre
Point(double dx, double dy){ message
...
}
// méthodes
• this n’est pas indispensable
boolean plusProcheDeOrigineQue(Point p){
L’objet courant
This et variables d’instance
13
Encapsulation
Il est possible d'agir sur la visibilité (ou accessibilité) des membres (attributs
et méthodes) d’une classe vis à vis des autres classes, lors de leur définition.
Encapsulation
Visibilité des membres d’une classe
public private protected Pas de
modificateur
(package)
classe Peut être utilisée Peut être
dans n’importe utilisée
quelle autre classe uniquement
N/A N/A
de n’importe quel par les classes
package de son
package
attribut Accessible Accessible Accessible dans Accessible
directement uniquement dans les classes de dans les
depuis le code de le code de la même package et classes de
n’importe quelle classe qui le dans les sous même
autre classe définit classes package
méthode Peut être invoquée à Peut être Peut être Peut être
partir du code de invoquée invoquée dans les invoquée dans
n’importe quelle uniquement dans classes de même les classes de
autre classe la classe qui la package et dans même
HASSOUNI Larbi définit
Classes et Objets les sous classes package 29
14
Encapsulation
Méthodes d’accés aux attributs privés (accesseurs : accessors)
les attributs déclarés comme privées (private) sont totalement protégés
ne sont plus directement accessibles depuis le code d’une autre classe
15
Encapsulation : Intérêts = Robustesse du code
y
r θ
X
16
JAVA : Classes et Objets
2ème partie
Constructeurs
Surcharge des méthodes
Variables de classe
Méthodes de classe
Constantes
La fonction main()
Initialiseur statique
Initialiseur d'instance
Finalisation
HASSOUNI Larbi Classes et Objets 34
Constructeurs
Constructeurs d’une classe :
est invoqué. 35
HASSOUNI Larbi Classes et Objets
17
Constructeurs : Définition explicite
public class Point {
private double x;
private double y;
Constructeurs multiples
Possibilité de définir plusieurs constructeurs dans une même classe
possibilité d'initialiser un objet de plusieurs manières différentes
public class Point {
private double x; une classe peut définir un
private double y; nombre quelconque de
constructeurs
public Point(double x, double y){
this.x = x; •chaque constructeur possède le
this.y = y; même nom (le nom de la classe)
}
• le compilateur distingue les
constructeurs en fonction :
public Point(){ -du nombre
this.x = this.y = 0; -du type
} -de la position des arguments
HASSOUNI Larbi
Classes et Objets 37
18
Surcharge des méthodes
Il est possible de définir des méthodes possédant le même nom mais dont les
paramètres diffèrent
...
}HASSOUNI Larbi Classes et Objets 39
19
Constructeurs
Appel d’un constructeur par un autre constructeur
l'appel this(...)
- fait référence au constructeur de la classe dont les arguments
correspondent à ceux spécifié après le mot this
- ne peut être utilisé que comme première instruction dans le corps d’un
constructeur, il ne peut pas être invoqué après d'autres instructions
Constructeurs
Appel d’un constructeur par un autre constructeur
20
Variables de classe
public class Point {
private double x; // abscisse du point
private double y; // ordonnée du point
Variables de classe
public class Point {
private double x;
private double y;
21
Variables de classe
x 10 Point p1 = new Point(10,14);
Point p2 = new Point(10.001,14.001);
y 14
P1.setEps(1 E-5);
p1 eps 1.0e-5 p2.setEps(10E-2);
System.out.println(p1.egale(p2)); -=> false on utilise
la précision de p1 (=0.00001)
x 10.001
System.out.println(p2.egale(p1)); => true on utilise la
y 14.001 précision de p2(= 0.01)
p2 eps 1.0e-2
Chaque instance possède sa propre valeur de précision. egale n’est plus garantie comme étant symétrique
P1.egale(p2) ≠ p2.egale(p1)
x 10 x 10.001 x 34
y 14 y 14.001 …….. y 17
Variables de classe
x 10 x 10.001 x 34
y 14 y 14.001 …….. y 17
En Java, rien ne peut être défini en dehors d’un objet. pas de variables globales
HASSOUNI Larbi Classes et Objets
45
22
Variables de classe
Cet objet est instance de la classe Class
(package java.lang)
Objet-classe pour
Class Pour chaque classe
la classe Point utilisée, il existe un
objet-classe
Chaque instance name
possède une
Objet-classe pour
référence sur l’objet eps 1.0 e-5 la classe String
représentant sa
classe
name
x 10 x 10 … x 10
y 14 y 14 y 14 isa isa
Point String
Point String
HASSOUNI Larbi Classes et Objets 46
Les membres d’une classes sont eux-mêmes représentés par des objets dont
les classes sont définies dans java.lang.reflect. (Introspection des objets)
23
Exemple de programme utilisant la class Class
Extrait du livre :
Au cœur de Java 2
Notions fondamentales
import java.util.*; De Cay S.Horstmann & Gary Cornell
import java.lang.reflect.*; (Page : 225)
try
{
// print class name and superclass name (if != Object)
Class cl = Class.forName(name);
Class supercl = cl.getSuperclass();
System.out.print("class " + name);
if (supercl
HASSOUNI != null && supercl != Object.class)
Larbi 48
Classes et Objets
System.out.print(" extends " + supercl.getName());
System.out.print("\n{\n");
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.println("}");
}
catch(ClassNotFoundException e) { e.printStackTrace(); }
System.exit(0);
}
/**
Prints all constructors of a class
@param cl a class
*/
public static void printConstructors(Class cl)
{
Constructor[] constructors = cl.getDeclaredConstructors();
24
Exemple de programme utilisant la class Class (suite 2)
/**
Prints all methods of a class
@param cl a class
*/
public static void printMethods(Class cl)
{
Method[] methods = cl.getDeclaredMethods();
/**
Prints all fields of a class
@param cl a class
*/
public static void printFields(Class cl)
{
Field[] fields = cl.getDeclaredFields();
25
Variables de classe
Cet objet est instance de la classe Class
(package java.lang)
Objet-classe pour
Class
la classe Point
name
Chaque instance Comment sont décrites les
possède une eps 1.0 e-5
référence sur l’objet caractéristiques de l’objet
représentant sa représentant la classe
classe
Point?
isa isa isa
x 10 x 15 … x 30
Dans java ceci est fait au sein du code de
y 14 y 25 y 50 la classe Point.
26
Accès aux Variables de classe
public class Point {
private double x;
private double y;
27
Méthodes de classe
public class Point {
private double x;
private double y; Les méthodes setEps et getEps
ne doivent plus être associées aux
// imprécision pour tests d’égalité instances de la classe Point mais
private static double eps = 1.0e-5; à l’objet-classe Point
Public static void setEps(double eps) {
Point.eps = eps;
} Déclaration de méthodes de
classe (méthodes statiques)
public static double getEps() {
return eps;
}
Attention : à l’intérieur du corps
……
d’une méthode statique il n’est
// Compare 2 points cartésiens
possible d’accéder qu’aux
public boolean equals(Point p) {
membres statiques de la classe
double dx= x - p.abscisse();
double dy= y - p.ordonnee();
if(dx<0)
dx = -dx;
if(dy<0
dy= - dy; Appel d’une méthode de classe :
return (dx < eps && dy < eps); Envoi d’un message à l’objetcclasse
}
}HASSOUNI Larbi Classes et Objets Point.setEps(1.e-8); 56
28
Membres statiques
•NomDeLaClasse.nomDeLaVariable
• NomDeLaClasse.nomDeLaMéthode(liste de paramètres)
• n'est pas conditionné par l'existence d'instances de la classe,
Math.PI Math.cos(x) Math.toRadians(90) ...
Signification de System.out.println
Classe System
du package
java.lang
Variable de classe
(référence un objet de
type PrintStream)
Méthode d ’instance de
la classe PrintStream
du package java.io
HASSOUNI Larbi 59
Classes et Objets
29
public static void main(String[] args)
Le point d ’entrée pour l’exécution d ’une application Java est la
méthode statique main de la classe spécifiée à la machine virtuelle
String[] args
args : tableau d’objets String (chaînes de caractères) contenant les arguments
de la ligne de commande
nombre d ’arguments : 3
Java TestArgs arg1 20 35.0 argument 0 : arg1
argument 1 : 20
argument 2 : 35.0
HASSOUNI Larbi
Classes et Objets 60
30
Initialisation des variables : à la déclaration
si les initialisations nécessaires pour les variables de classe ne peuvent être faites
directement avec les initialiseurs (expression) JAVA permet d'écrire une méthode
(algorithme) d'initialisation pour celles-ci : l'initialiseur statique
xs un nombre tiré au hasard entre 0 et 10
ys somme de n nombres tirés au hasard, n étant la partie entière de xs
zs somme de xs et ys
Invocation
HASSOUNI Larbi •automatique et une seule fois lorsque la classe est chargée
Classes et Objets • dans l’ordre d’apparition dans le code de la classe 63
31
Exemple d’utilisation des blocs d’initialisation
statique et d’objets
/**@version 1.01 2004-02-19
@author Cay Horstmann
*/
import java.util.*;
public class ConstructorTest
{
public static void main(String[] args)
{
// fill the staff array with three Employee objects
Employee[] staff = new Employee[3];
staff[0] = new Employee("Harry", 40000);
staff[1] = new Employee(60000);
staff[2] = new Employee();
// print out information about all Employee objects
for (Employee e : staff)
System.out.println("name=" + e.getName()
+ ",id=" + e.getId()
+ ",salary=" + e.getSalary());
}
}HASSOUNI Larbi Classes et Objets 64
class Employee{
// three overloaded constructors
public Employee(String n, double s){
name = n;
salary = s;
System.out.println("Execution du 1er constructeur");
}
public Employee(double s) {
// calls the Employee(String, double) constructor
this("Employee #" + nextId, s);
System.out.println("Execution du 2eme constructeur");
}
// the default constructor
public Employee() {
// name initialized to ""--see below
// salary not explicitly set--initialized to 0
// id initialized in initialization block
System.out.println("Execution du constructeur par defaut");
}
public String getName() { return name; }
public double getSalary() { return salary; }
public int getId() { return id; }
HASSOUNI Larbi Classes et Objets 65
32
private static int nextId;
}
HASSOUNI Larbi Classes et Objets 66
}
s'exécute :
33
Destruction des objets : Finalisation
class Point {
private double x;
private double y; Point p1 = new Point(14,14);
public Point(double x, double y) { Point p2 = new Point(10,10);
this.x = x; System.out.println(p1);
this.y = y; System.out.println(p2);
} p1.translater(10,10); Appel explicite
public void translater(double dx, double dy) { p1 = null; du Garbage
x += dx; System.gc(); Collector
y += dy; System.out.println(p1);
} System.out.println(p2);
public String toString() {
return "Point[x:" + x + ", y:" + y + "]";
}
public void finalize() { Point[x:14.0, y:14.0]
System.out.println("finalisation de " + this); Point[x:10.0, y:10.0]
} finalisation de Point[x:24.0, y:24.0]
} null
Point[x:10.0, y:10.0]
HASSOUNI Larbi
Classes et Objets 69
34
Java
Les Tableaux
Tableaux En Java 1
Généralités sur les Tableaux
Les tableaux sont des objets en java et non seulement une suite
d'emplacements mémoire comme il est le cas en C/C++
HASSOUNI Larbi 2
Exemples
double[ ] tab1; //identique à double tab[]
Int[ ] entiersPremiers, nombresCubes; //déclare deux tableaux dont les éléments sont de type int
Etudiant[ ] classe; //déclare un tableau dont les élements sont des objets instances de la classe Etudiant
Compte[
HASSOUNI Larbi] clients; //déclare un tableau dont les élements sont des objets instances de la classe Compte
3
Tableaux En Java 1
Création d’un tableau à une dimension
la taille d'un tableau n'est pas spécifiée à la déclaration.
les tableaux sont des objets,
La déclaration : typeDesElements[] nomDuTableau;
Exemple
HASSOUNI Larbi 5
Tableaux En Java 2
Tableaux à une dimension
Exemples de Création
HASSOUNI Larbi 6
Tableaux En Java 3
Tableaux à une dimension
Précison sur length
Précision sur lenght
lenght est une constante d’instance publique
=>(non respect du principe d’encapsulation)
nom Moha
Public class Etudiant{
String nom, prenom; isa prenom Ali
classe1
double note;
} note 17
0 null
Public Etudiant(String n, String p,double score){
1
nom = n; prenom = p; note = score;
}} 2
3
Etudiant[ ] classe1 = new Etudiant[4];
HASSOUNI
Classe[0] LarbiEtudiant(« Moha », « Ali », 17);
= new 9
Tableaux En Java 4
Initialisation d’un tableau à une dimension
Exemples :
typeDesElements[ ][ ] nomduTableau;
Exemples
double[ ][ ] matrice;
Etudiant[ ][ ][ ] cubeEtud;
HASSOUNI Larbi 11
Tableaux En Java 5
Tableaux à plusieurs dimension
Création
dimensions du tableau
ne sont pas spécifiées à la déclaration (comme pour les tableaux à une
seule dimension).
ne sont indiquées que lors de la création
obligatoire que pour la première dimension.
autres dimensions peuvent n'être spécifiées que lors de la
création effective des tableaux correspondants.
Exemples :
double [ ][ ] matrice = new double[4][4]; Création d’une matrice 4x4
de réels
double [ ][ ] matrice = new double[4][ ];
for (int i=0; i < 4; i++)
matrice[i] = new double[4]; Les 3 écritures sont
équivalentes
double [ ][ ] matrice;
matrice = new double[4][ ];
for (int i=0; i < 4; i++)
matrice[i] = new double[4];
HASSOUNI Larbi 12
Exemple :
isa
int [ ][ ] tabsInt; 0 0
tabsInt = new int[3][ ]; 1 0 isa
tabsInt[0] = new int[5]; 2 0
tabsInt[1] = new int[4]; 3 0 0 0
4 0 1 0
tabsInt[2] = new int[6];
2 0
3 0
tabsInt isa
isa
0
1 0 0
2 1 0
2 0
3 0
4 0
HASSOUNI Larbi 5 0 13
Tableaux En Java 6
Accès aux éléments d’un tableau à plusieurs dimensions
tabChar[1][0] = ‘B’; tabChar[1][1] =‘R’; tabChar[1][2] = ‘A’; tabChar[1][3] =‘V’; tabChar[1][4] = ‘E’;
tabChar[1][5] =‘R’;
tabChar[2][0]
HASSOUNI =Larbi
‘C’; tabChar[2][1] =‘O’; tabChar[2][2] = ‘B’; tabChar[2][3] =‘O’; tabChar[2][4] = ‘L’; 14
exemples :
int[ ][ ] t1 = { int[ ][ ] t1 = new int[2][5];
t1[0][0]=1; t1[0][1]=2; t1[0][2]=3; t1[0][3]=4; t1[0][4]=5;
{ 1, 2, 3, 4, 5},
{ 6, 7, 8, 9, 10}
≡
t1[1][0]=6; t1[1][1]=7; t1[1][2]=8; t1[1][3]=9; t1[1][4]=10;
};
Point[ ][ ] pts = {
Point[ ][ ] pts = new Point[3][2];
{ new Point(10,15),new Point(20,25)},
{ new Point(30,35), new Point(40,45)} , ≡ Pts[0][0] = new Point(10,15); Pts[0][1] = new Point(20,25);
Pts[1][0] = new Point(30,35); pts[1][1] = new Point(40,45) ;
{ new Point(50,55),new Point(60,65)} , Pts[2][0] = new Point(50,55); ,pts[2][1] = new Point(60,65) ;
};
HASSOUNI Larbi 15
Tableaux En Java 7
Classe Arrays : Tri d’un tableau
package java.util définit une classe, Arrays, qui propose des méthodes
statiques (de classe) pour le tri et la recherche dans des tableaux.
// tri du tableau
Arrays.sort(tab);
// tri du tableau
Arrays.sort(tab);
// recherche de la valeur 45
int pos = Arrays.binarySearch(tab,45);
Tableaux En Java 8
Classe Arrays : Quelques méthodes extraites
de la documenetation de l’API
HASSOUNI Larbi 18
System.arraycopy()
For example, to make a copy of the array, A, using this subroutine, you would say:
HASSOUNI Larbi 19
Tableaux En Java 9
Arrays and for-each Loops
HASSOUNI Larbi 20
It’s important to note that a for-each loop processes the values in the array, not the
elements (where an element means the actual memory location that is part of the
array).
For example, consider the following incorrect attempt to fill an array of integers
with 17’s:
The assignment statement item = 17 assigns the value 17 to the loop control
variable, item.
However, this has nothing to do with the array. When the body of the loop is
executed, the value from one of the elements of the array is copied into item.
The statement item = 17 replaces that copied value but has no effect on the
array element from which it was copied; the value in the array is not
HASSOUNI Larbi
changed. 21
Tableaux En Java 10
Java
Packages
ou
NameSpaces
1
Qu’est ce qu’un package?
HASSOUNI 2
Exemples de packages
java.lang : rassemble les classes de base JAVA, Object, String,
System...Ce package est importé par défaut.
java.applet : fournit les classes nécessaires pour créer et utiliser les applets.
java.awt (Abstract Window Toolkit) : Contient les classes pour créer les
interfaces utilisateur et pour dessiner des graphiques.
1
Rôle d’un package
Le regroupement des classes dans des packages permet d'organiser les
librairies de classes Java et d'éviter d'éventuels conflits de noms.
Exemple : Dans les librairies standards deux classes Date…
Mais définies dans des packages différents
Chaque package
Date.class correspond à un Date.class
répertoire
Java.awt
Java.awt.DataTransfer
Chaque package peut contenir :
•Des classes Button.class
•Des interfaces
•D’autres package (sous
package) Paint Clipboard.class
HASSOUNI 5
La hiérarchie des packages correspond à une hiérarchie de répertoires
2
Packages et Système de fichiers
Date
ActionListener Au niveau des Au niveau du
sources (.java) bytecode (.class
HASSOUNI 6
3
Packages dans l’IDE NetBeans 5.0
src
La fenêtre Files
donne
l’organisation Myproject
physique des
fichiers de
l’application
mypackage
MaClase
matieres
etudiants
UneClasse
Pour pouvoir utiliser, dans une classe d’un package donné, une classe issue
d’un autre package il faut préciser son origine au compilateur.
4
Accès aux éléments d’un Package
import java.awt.image.*;
Classe Star utilise les classes Color
import java.awt.*; et Graphics du package java.awt
public class Star { et la classe Raster du package
double x, java.awt.image.
double y; Import java.awt.* n’importe pas les
Color c; classes du sous package
java.awt.image
public void draw(Graphics g) {
….
Pas besoin d’import
Raster r;
pour les classes du
….
package java.lang
}
Il est importé par défaut
…..
}
HASSOUNI 10
import java.awt.*;
import java.util.*;
HASSOUNI 11
5
Import des membres statiques d’une classe
Jusqu'à la version 1.4 de Java, pour utiliser un membre statique d'une classe, il faut
obligatoirement préfixer ce membre par le nom de la classe qui le contient.
public class version1_4 {
public static void main(String[] args) {
System.out.println(Math.PI);
System.out.println(Math.sqrt(20));
}
}
Java 1.5 propose une solution pour réduire le code à écrire concernant les
membres statiques en proposant une nouvelle fonctionnalité concernant
l'importation de package : l'import statique (static import).
répertoire-package/nom1/nom2
Exemple: javac –d classes MaClasse.java
HASSOUNI 13
6
Compiler les classes d’un paquetage
• Quand on compile les classes d’un paquetage avec l'option -d, on doit
le plus souvent indiquer où sont les classes déjà compilées du
paquetage avec l'option -classpath :
Exemple :
javac –classpath classes –d classes Maclasse.java
HASSOUNI 14
java p1.p2.C
• Le fichier C.class devra se situer dans un sous-répertoire p1/p2
d’un des répertoires du classpath (option -classpath ou variable
CLASSPATH)
• Exemples:
7
Utilisation pratique des paquetages
HASSOUNI 16
MyJavaProgs
p1
p1
Test.java
Test.class
p2
p2
C1.java
C1.class
p3 p3
C2.java C2.class
C3.java C3.class
HASSOUNI 17
8
HASSOUNI 18
import p1.*;
import p1.p2.*;
import p1.p2.p3.*;
public class Test{
public static void main(String[] args){
System.out.println("je suis la classe Test du src" );
new C1().affiche(); new C2().affiche(); new C3().affiche(); }}
HASSOUNI 19
9
package p1;
public class C1{
public void affiche(){
System.out.println("je suis la classe C1 du package p1");}}
HASSOUNI 20
package p1.p2;
public class C2{
public void affiche(){
System.out.println("je suis la classe C2 du package p1.p2");}}
HASSOUNI 21
10
package p1.p2.p3;
public class C3{
public void affiche(){
System.out.println("je suis la classe C3 du package p1.p2.p3"); }}
HASSOUNI 22
-pour exécuter :
java –classpath classes Test
11
Classes inter-dépendantes
ou
HASSOUNI 24
Option -sourcepath
HASSOUNI 25
12
Utilisation des fichiers source
HASSOUNI 26
HASSOUNI 27
13
Problème avec sourcepath
• Si C.java a besoin d’un paquetage pas encore compilé
et dont les sources sont indiquées par l’option
sourcepath
HASSOUNI 28
HASSOUNI 29
14
Chemin de recherche des classes
HASSOUNI 30
Classpath
• Le classpath contient par défaut le seul répertoire courant (il est égal
à « . »)
HASSOUNI 31
15
Exemples de Classpath
HASSOUNI 32
16
Java
Réutilisation des classes:
• Délégation
• Héritage
Délégation et Héritage 1
Classes : Rappels
Une classe représente une « famille » d’objets ayant en commun un
ensemble de propriétés et comportements.
Une classe sert à définir les propriétés et comportements des objets d’un type donné.
Elle décrit l ’ensemble des données (attributs,ou variables) et des
opérations sur données (méthodes)
Elle Sert de « modèle » pour la création d’objets (instances de la classe)
public class Point {
int x; // abscisse du point
int y; // ordonnée du point
Variables
d’instance
public void translate(int dx, int dy){
x = x + dx;
y = y + dy;
}
Méthodes
// calcule la distance du point à l'origine
public double distance() {
return Math.sqrt(x * x + y * y);
}
} 2
Comment utiliser une classe comme brique de base pour concevoir d’autres
classes ?
Dans une conception objet on définit des « associations (relations) entre » pour
exprimer la réutilisation entre classe.
Délégation et Héritage 1
Relation de classe moins forte Relation de classe plus forte
Association : Un objet d'une classe travaille avec des objets d'une autre
classe pendant une durée prolongée
Délégation
Mise en œuvre
Agrégation / Composition
Délégation et Héritage 2
Délégation : Définition
C1 C2
Délégation : Exemple
rayon
Exemple la classe Cercle
.centre rayon : double
centre : deux doubles (x et y) ou bien Point
Délégation et Héritage 3
Délégation : Exemple
public class Cercle { Point p1 = new Point(10,10);
//centre du cercle Cercle c1 = new Cercle(p1,10)
private Point centre; Cercle c2 = new Cercle(p1,20);
//rayon du cercle Le point représentant le centre a une
private double r; existence autonome (cycles de vie
indépendants)
public Cercle( Point centre, double r) { il peut être partagé (à un même moment
this.centre = centre; il peut être liée à plusieurs instances
this.r = r; d'autres classes) .
}
… p1 isa
} x 10
c1 y 10
Le point P1 peut être utilisé en c2
dehors du cercle dont il est le centre isa
(Attention aux effets de bord) isa
Centre
Centre
p1.rotation(90); r 10
c2.translater(10,10); r 20
Affecte le cercle c1 8
Après ces opérations le centre de c1 et c2 devient (0,20)
Délégation : Exemple
public class Cercle { Le Point représentant le centre n’est pas partagé
(à un même moment, une instance de Point ne
//centre du cercle
peut être liée qu'à un seul Cercle)
private Point centre;
Point p1 = new Point(10,10);
//rayon du cercle Cercle c1 = new Cercle(p1,10)
Cercle c2 = new Cercle(p1,20);
private double r;
p1
public Cercle(Point p, double r) { isa
this.centre = new Point(p); x 10
this.r = r; y 10
} isa isa
… x 10 x 10
} y 10 y 10
c2
Les cycles de vies du Point et du c1
isa
Cercle sont liés : si le cercle est isa
détruit (ou copié), le centre l’est Centre
Centre
aussi. 20
10 r 9
r
Délégation et Héritage 4
Agrégation / Composition
Voiture Cercle
Roue Point
Agrégation forte
L’élément agrégé (Roue) a une
existence autonome en dehors A un même moment, une instance de
de l’agrégat (Voiture) composant (Point) ne peut être liée qu'à un
seul agrégat (Cercle), et le composant a un
10
cycle de vie dépendant de l’agrégat.
Héritage
Terminologie
Généralisation/spécialisation
Héritage en Java
Réutilisation
Délégation et Héritage 5
Réutilisation du code avec modification
• Soit une classe A dont on a le code compilé
• On peut copier, puis modifier le code source de A dans des classes A1,
A2,...
• Problèmes :
Délégation et Héritage 6
Réutilisation par l'héritage
14
Délégation et Héritage 7
Héritage : classe fille
Exemple 1
public class RectangleColore extends Rectangle { RectangleColore
private Color couleur; // nouvelle variable hérite de (étend)
// Constructeurs Rectangle. Elle
. . . possède les variables
et méthodes définies
// Nouvelles Méthodes
dans la classe
public getCouleur() { Rectangle
return this.couleur;
} Définition d’un nouvel
public setCouleur(Color c) { attribut
this.couleur = c;
} RectangleColore définit
2 nouvelles méthodes
// Méthodes modifiées
public void dessineToi(Graphics g) {
g.setColor(couleur);
RectangleColore
g.fillRect(getX(), getY(), redéfinit une méthode
getLargeur(), getHauteur()); de la classe mère.
}
} 16
Héritage : Exemple 2
17
Délégation et Héritage 8
Héritage : Exemple 3
// ! c06:Detergent.java public class Detergent extends Cleanser {
// Syntaxe d'héritage & propriétés. // Change une méthode:
public void scrub() {
class Cleanser {
append(" Detergent.scrub()");
private String s = new String("Cleanser");
public void append(String a) { s += a; } super.scrub(); // Appel de la version de
public void dilute() { append(" dilute()"); } la classe de base
public void apply() { append(" apply()"); } }
public void scrub() { append(" scrub()"); } // Ajoute une méthode à l'interface:
public void print() { System.out.println(s); } public void foam() { append(" foam()"); }
public static void main(String[] args) { // Test de la nouvelle classe:
Cleanser x = new Cleanser(); public static void main(String[] args) {
x.dilute(); x.apply(); x.scrub();
Detergent x = new Detergent();
x.print();
} x.dilute();
} x.apply();
x.scrub();
x.foam();
x.print();
Exécution: System.out.println("Testing base
class:");
Cleanser dilute() apply() Detergent.scrub() scrub() foam()
Testing base class: Cleanser.main(args);
Cleanser dilute() apply() scrub() }
18
}
Terminologie
19
Délégation et Héritage 9
Héritages : Autres exemples
• La classe mère Vehicule peut avoir les classes filles Velo, Voiture et Camion
20
Un objet instance de PointGraphique possède les attributs définis dans PointGraphique
ainsi que les attributs définis dans Point (un PointGraphique est aussi un Point )
Un objet instance de PointGraphique répond aux messages définis par les méthodes
décrites dans la classe PointGraphique et aussi à ceux définis par les méthodes de la
classe Point
p.x = 20; y 10
p.y = 10;
// utilisation d’une variable d’instance spécifique coul
p.coul = new Color(200,200,0);
// utilisation d’une méthode héritée
double dist = p.distance(); isa
// utilisation d’une méthode spécifique r 200
p.dessine(graphicContext);
v 200
b 0
21
Délégation et Héritage 10
Héritage : Généralisation / Spécialisation
Particularisation ou Spécialisation:
– un rectangle coloré est un rectangle mais un rectangle particulier
– Un PointGraphique est un point mais un point particulier
Généralisation:
– la notion de figure géométrique est une généralisation de la notion de
polygone
– Un animal est une généralisation du cheval et du singe
Une classe fille offre de nouveaux services ou enrichit les services rendus
par une classe : la classe RectangleColore permet de dessiner avec des
couleurs et pas seulement en « noir et blanc »
22
La spécialisation exprime une relation “est-un” entre une classe et sa superclasse
(chaque instance de la classe est aussi décrite de façon plus générale
par la super-classe).
super-classe Animal
Singe est une
spécialisation d’Animal.
Spécialisation
Généralisation
Singe sous-classe
Délégation et Héritage 11
Héritage : Généralisation / Spécialisation
Utilisation de l’héritage :
dans le sens “spécialisation” pour réutiliser par modification
incrémentielle les descriptions existantes.
24
25
Délégation et Héritage 12
Héritage à plusieurs niveaux
Il n’y a pas de limitation dans le nombre de niveaux dans la hiérarchie d'héritage
Les méthodes et variables sont héritées au travers de tous les niveaux
Equipement
caractéristiques nom caractéristiques
communes à tous fabricant supplémentaires
les équipements poids pour les citernes
cout
Echangeur Citerne
Pompe
superficie volume
pression
diametre pression
debit
longueur
public class A {
public void hello() {
System.out.println(«Vous etes en classe A »); Pour résoudre un
} message, la hiérarchie
} des classes est
parcourue de manière
ascendante jusqu’à
public class B extends A {
trouver la méthode
public void bye() {
correspondante.
System.out.println(«Vous etes en classe B»);
}
} C unC = new C();
unC.hello();
unC.bye();
public class C extends B { unC.bof();
public void bof() {
System.out.println(«Vous etes en classe C»);
}
}
27
Délégation et Héritage 13
Que peut on mettre dans une classe fille?
• Mais
– elle ne peut retirer aucune variable ou méthode
Lorsqu’une méthode redéfinie par une classe est invoquée pour un objet de
cette classe, c’est la nouvelle définition et non pas celle de la super-classe
qui est invoquée.
28
public class A {
public void hello() {
System.out.println(«Hello»);
}
public void affiche() { A unA = new A();
System.out.println(«vous etes en A»); B unB1 = new B();
}
} unA.hello(); Hello
unA.affiche(); vous etes en A
unB1.hello(); Hello
public class B extends A {
unB1.affiche(); vous etes en B
public void affiche() {
System.out.println («vous etes en B»);
A unB2 = new B(); ?
}
unB2.hello(); Hello ?
}
unB2.affiche(); vous etes en B ?
Voir polymorphisme 29
Délégation et Héritage 14
Surcharge ou redéfinition de méthodes
public class A {
public void methodX(int i) {
...
}
}
Surcharge Redéfinition
Délégation et Héritage 15
Limite pour désigner
une méthode redéfinie
• On ne peut remonter plus haut que la classe mère pour récupérer une méthode
redéfinie :
– pas de « super.super.affiche() »
Remarque : Depuis le JDK 5 on peut accoler une annotation à une méthode qui
redéfinit une méthode d’une classe ancêtre : @Override
C’est très utile pour repérer des fautes de frappe dans le nom de la méthode :
le compilateur envoie un message d’erreur si la méthode ne redéfinit aucune
méthode d’une classe ancêtre. Il est donc fortement conseillé de le faire
32
La hiérarchie d’héritage est un arbre dont la racine est la classe Object
(package java.lang)
par défaut une classe qui ne définit pas de clause extends hérite de la
classe Object
33
Délégation et Héritage 16
Classe Object
La classe Object n’a pas de variables d’instance ni de variables de classe.
• La classe Object fournit plusieurs méthodes qui sont héritées par toutes les
classes sans exception
• Les plus couramment utilisées sont les méthodes toString() et equals().
• public String toString()
Renvoie une chaîne représentant la valeur de l’objet
return getClass().getName() + "@" + Integer.toHexString(hashCode());
Autres méthodes:
• public int hashCode()
Renvoie une clé de hashcode pour adressage dispersé (Voir collections)
• protected Object clone()
Crée un copie de l’objet
• public final Class getClass()
Renvoie la référence de l’objet Java représentant la classe de l’objet 34
≡ Opérateur de
<Expression de type String> + <reference>.toString() concaténation
du fait que la méthode toString est définie dans la classe Object , on est sûr que
quel que soit le type (la classe) de l’objet il saura répondre au message toString()
public class Object {
...
public String toString(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
…
}
public class Point {
private double x;
private double y;
}
35
Délégation et Héritage 17
méthode toString :Utilisation
public class Object {
...
public String toString(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
…
}
Délégation et Héritage 18
Exemple de toString, equals et hashCode
38
classe Class
• Class est une classe particulière (voir cours sur la reflection)
• Instanceof
Si x est une instance d'une sous-classe B de A,
« x instanceof A » renvoie true
Pour tester si un objet o est de la même classe que l'objet courant, il ne faut
donc pas utiliser instanceof mais le code suivant :
if (o != null && o.getClass() == this.getClass())
39
Délégation et Héritage 19
Constructeurs
Réutilisation des constructeurs
40
41
Délégation et Héritage 20
Réutilisation des constructeurs
Exemple 2
public class Rectangle { public class RectangleColore extends
private int x, y, largeur, hauteur; Rectangle {
private Color couleur;
public Rectangle(int x, int y, public RectangleColore(int x, int y,
int largeur, int hauteur) { int largeur, int hauteur
this.x = x; Color couleur) {
this.y = y; super(x, y, largeur, hauteur);
this.largeur = largeur; this.couleur = couleur;
this.longueur = longueur; }
} public RectangleColore(int x, int y,
... int largeur, int hauteur) {
} this(x, y, largeur, hauteur, Color.black);
}
Appel du constructeur de la super ...
classe : doit être la 1ere instruction }
Appel d’un autre constructeur de la même classe : doit être la 1ere instruction
42
Si la première instruction d'un constructeur n'est pas un appel explicite à l’un des
constructeur de la super classe, alors JAVA insère implicitement l'appel super()
Chaque fois qu'un objet est créé les constructeurs sont invoqués en remontant en
séquence de classe en classe dans la hiérarchie jusqu'à la classe Object
43
Délégation et Héritage 21
Appel implicite du constructeur
de la classe mère
Il est garanti qu'un constructeur d'une classe est toujours appelé lorsqu'une
instance de l'une de ses sous classes est créée.
un objet c instance d’une classe C sous classe de B elle même sous classe de
A est un objet de classe C mais est aussi un objet de classe B et de classe A.
Lorsqu’il est créé c doit l’être avec les caractéristiques d ’un objet de A, de B et
de C.
...
}
...
}
double x,y;
public Point(double x, double y){ 2
// Appel implicite du super()
this.x = x; this.y = y;
}
Ordre
...
}
Délégation et Héritage 22
Constructeur par défaut
Lorsqu'une classe ne définit pas explicitement de constructeur, elle possède un
constructeur par défaut. Ce constructeur a les caractéristiques suivantes:
Il n’a pas de paramètres
Son corps est vide, il contient par défaut l’appel au constructeur super();
Il est masqué dans le cas où un autre constructeur est défini.
public class Object {
public Object() {
...
}
...
} Constructeur par
défaut implicite
public class A {
// attributs
String nom;
public A() {
super();
// méthodes }
String getNom() {
return nom; Il garantit chaînage
} des constructeurs
...
46
}
Délégation et Héritage 23
Redéfinition des attributs
Lorsqu'une sous classe définit une variable d'instance dont le nom est
identique à l'une des variables dont elle hérite, la nouvelle définition
masque la définition héritée
l'accès à la variable héritée se fait en utilisant super. Mais il n’est pas
recommandé de masquer les variables.
public class A {
Dans le code de la classe C:
int x;
}
((A)this).x
public class B extends A {
double x; super.super.x
}
super.x
public class C extends B {
char x;
x ou this.x
}
48
Délégation et Héritage 24
Visibilité des variables et méthodes
principe d'encapsulation : les données propres à un objet ne sont
accessibles qu'au travers des méthodes de cet objet
Classes du même
Non Oui Oui Oui
package
Sous-classes d'un
Non Non Oui Oui
autre package
51
Délégation et Héritage 25
Visibilité des variables et méthodes
Package monPackage Définit le package auquel Package tonPackage
appartient la classe.
package monPAckage; Si pas d’instruction package
public class Classe2 { package par défaut : package tonPackage;
{ classes définies dans public class Classe4 {
le même répertoire }
Classe1 o1; Classe1 o1;
52
Les mêmes règles de visibilité s’appliquent aux méthodes
ClasseB b; package B;
public class ClasseC {
ClasseC c;
ClasseA a;
}
package A; ClasseB b;
class ClasseB
extends ClasseA { }
53
Délégation et Héritage 26
Méthodes finales
●Méthodes finales
♦ public final void méthodeX(….) {
…. }
♦ «verrouiller » la méthode pour interdire toute éventuelle redéfinition
dans les sous-classes
♦ efficacité
quand le compilateur rencontre un appel à une méthode finale il peut
remplacer l’appel habituel de méthode (empiler les arguments sur la
pile, saut vers le code de la méthode, retour au code appelant,
dépilement des arguments, récupération de la valeur de retour) par
une copie du code du corps de la méthode (inline call).
♦si le corps de la méthode est trop gros, le compilateur est censé ne pas
faire cette optimisation qui serait contrebalancée par l ’augmentation
importante de la taille du code.
♦Mieux vaut ne pas trop se reposer sur le compilateur :
– utiliser final que lorsque le code n ’est pas trop gros ou lorsque l ’on
veut explicitement éviter toute redéfinition
Classes finales
♦ Interdit tout héritage pour cette classe qui ne pourra être sous-classée
♦ toutes les méthodes à l’intérieur de la classe seront implicitiment finales
(elles ne peuvent être redéfinies)
♦ exemple : la classe String est finale
55
Délégation et Héritage 27
Exercice : Implémenter le diagramme des classes ci-dessous:
56
Délégation et Héritage 28
Java
Héritage
Et
Polymorphisme
Héritage et Polymorphisme 1
Upcasting ou Surclassement
♦ La réutilisation du code est un aspect important de l'héritage, mais ce n'est peut être
pas le plus important
♦ Le deuxième point fondamental est la relation qui relie une classe à sa superclasse:
HASSOUNI Larbi 2
Upcasting ou Surclassement
♦ tout objet instance de la sous-classe B peut être aussi vu comme une instance de
sa super-classe A.
♦ Cette relation est directement supportée par le langage JAVA :
● à une référence déclarée de type A il est possible d'affecter une valeur qui
est une référence vers un objet de type B (upcasting)
Etudiant
Etudiant e;
e = new EtudiantSportif(...);
EtudiantSportif
Héritage et Polymorphisme 1
Upcasting ou Surclassement
♦ Lorsqu'un objet est "sur-classé" il est vu comme un objet du type de la
référence utilisée pour le désigner :
● Ses fonctionnalités sont alors restreintes à celles proposées par la
classe du type de la référence
Etudiant
EtudiantSportif es; String nom;
es = new EtudiantSportif(« Toto", »Ali",25,..,« Foot",..); String prénom;
int age;
Etudiant e; es …
e = es; // upcasting public Etudiant(String n, String p,int a ...)
● isa public void affiche()
● public int nbInscriptions()
...
e.affiche(); e Toto
es.affiche();
●
Ali EtudiantSportif
e.nbInscriptions(); String sportPratiqué;
es.nbInscriptions(); 25 …
Lien dynamique
Résolution des messages
● Que va donner e.affiche() ? Etudiant
public void affiche(){
Etudiant e = new EtudiantSportif( System.out.println(
"Toto", "Ali",25,.., "Foot",..); "Nom : "+nom+"\n"
"Prénom : "+prénom+"\n"
"Age : "+age+ ...);
}
?
e e.affiche(); EtudiantSportif
isa ●
●
? public void affiche(){
Toto
super.affiche();
Ali System.out.println(
"Sport" : "+sport+"\n"
25 + ...);
…… }
Foot
……
HASSOUNI Larbi 5
Héritage et Polymorphisme 2
Lien dynamique : Résolution des messages
Lorsqu'une méthode d'un objet est accédée
au travers d'une référence "surclassée",
c'est la méthode telle qu'elle est définie
au niveau de la classe effective de Etudiant
l'objet qui est invoquée et exécutée public void affiche(){
System.out.println(
"Nom : "+nom+"\n"
Etudiant e = new EtudiantSportif( "Prénom : "+prénom+"\n"
"Toto", "Ali",25,.., "Age : "+age+ ...);
"Foot",..); }
e e.affiche();
isa ● EtudiantSportif
●
Toto Nom : Toto public void affiche(){
Ali Prénom : Ali super.affiche();
System.out.println(
25 Age : 25
"Sport" : "+sport+"\n"
… + ...);
……
Sport : Foot }
Foot
……
HASSOUNI Larbi 6
Lien dynamique
Mécanisme de résolution des messages
● Les messages sont résolus à l’exécution
♦ la méthode exécutée est déterminée à l'exécution (run-time) et non pas à la
compilation
♦ à cet instant le type exact de l'objet qui reçoit le message est connu
▲ la méthode définie pour le type réel de l’objet recevant le message est
appelée (et non pas celle définie pour son type déclaré).
public class A {
public void m() { A obj = new C();
System.out.println("m de A"); obj obj.m();
}}
●
m de B
public class B extends A {
public void m() {
System.out.println("m de B");
ce mécanisme est
}} isa ● désigné sous le terme de
lien-dynamique
(dynamic binding,
public class C extends B { latebinding
} ou run-time binding)
HASSOUNI Larbi 7
Héritage et Polymorphisme 3
Lien dynamique
Vérification statique
● A la compilation :seules des vérifications statiques qui se basent sur le type
déclaré de l’objet (de la référence) sont effectuées
Lien dynamique
Vérifications statiques
● A la compilation il n’est pas possible de déterminer le type exact de l'objet récepteur
d'un message
public class A {
public void m1() { A obj;
System.out.println("m1 de A"); for (int i = 0; i < 10; i++){
} obj
hasard = Math.random()
}
● if ( hasard < 0.5)
obj = new A();
public class B extends A { else
public void m1() {
System.out.println("m1 de B"); obj = new B();
} obj.m1();
public void m2() { }
System.out.println("m2 de B");
}}
● vérification statique : garantit dès la compilation que les messages pourront être
HASSOUNI Larbi résolus au moment de l’exécution 9
Héritage et Polymorphisme 4
Lien dynamique
Choix des méthodes, sélection du code
● La signature de la méthode à exécuter est
effectué statiquement à la compilation en
fonction du type des paramètres
public class A {
public void m1() {
System.out.println("m1 de A");} A refA = new A();
public void m1(int x) { invokevirtual … <Method m1()> refaA.m1();
System.out.println("m1(x) de A");} refA.m1(10);
}
invokevirtual … <Method m1(int)>
invokevirtual … <Method m1()> refA = new B();
refA.m1();
public class B extends A { Byte-code refA.m1(10);
public void m1() { compilation refA.m2();
System.out.println("m1 de B");}
public void m2() { La sélection du code de la méthode à exécuter est
System.out.println("m2 de B");}
} effectué dynamiquement à l’exécution en fonction
du type effectif de l'objet récepteur du message
HASSOUNI Larbi 10
Polymorphisme
A quoi servent l’upcasting et le lien dynamique ?
A la mise en oeuvre du polymorphisme
● Le terme polymorphisme décrit la caractéristique d'un élément qui peut prendre
plusieurs formes, comme l'eau qui se trouve à l'état solide, liquide ou gazeux.
Héritage et Polymorphisme 5
Polymorphisme
ClasseA
méthodeX()
ClasseB ClasseC
méthodeX()
Surclassement
la référence peut désigner des un cas particulier
ClasseA objA; objets de classe différente d'utilsation de
objA = ... (n’importe quelle sous Polymorphisme
objA.methodeX(); classe de ClasseA) est
+ manipulation uniforme des
Lien dynamique objets de plusieurs classes
Le comportement est différent par l'intermédiaire d'une
selon la classe effective de classe de base commune
l’objet
HASSOUNI Larbi 12
Polymorphisme
Etudiant EtudiantSportif
public void affiche(){
super.affiche();
public void affiche(){ System.out.println("Sport" : "+sport+"\n"
System.out.println("Nom : "+nom+"\n" + ...);
"Prénom : "+prénom+"\n" }
"Age : "+age+ ...);
}
Si un nouveau type d’étudiant est défini,
le code de GroupeTD reste inchangé EtudiantEtranger
public void affiche(){
public class GroupeTD{ super.affiche();
Etudiant[] liste = new Etudiant[30]; System.out.println("Nationalité" : "+pays+"\n"
+ ...);
int nbEtudiants = 0; }
...
public void ajouter(Etudiant e){
if (nbEtudiants < liste.lenght) GroupeTD td1 = new GroupeTD();
liste[nbEtudiants++] = e; td1.ajouter(new Etudiant(« MOHA", …));
} td1.ajouter(new EtudiantSportif(« TOTO",
public void afficherListe(){
« ALI", … , « FOOT");
for (int i=0;i<nbEtudiants; i++)
liste[i].affiche(); Td1.ajouter(new EtudiantEtranger("FOFO",
} "NAJIB", …, "Algérie")
} td1.afficherListe();
HASSOUNI Larbi 13
Héritage et Polymorphisme 6
Polymorphisme
HASSOUNI Larbi 14
Surcharge et Polymorphisme
public class ClasseC {
public static void methodeX(ClasseA a){
Surcharge
ClasseA
System.out.println("param typeA");
}
ClasseB public static void methodeX(ClasseB b){
System.out.println("param typeB");
}
ClasseA refA = new ClasseA(); }
ClasseC.methodeX(refA); param TypeA
ClasseB refB = new ClasseB();
ClasseC.methodeX(refB); param TypeB
refA = refB; // upCasting
Héritage et Polymorphisme 7
Redéfinition de equals
● Tester l’égalité de deux objets de la même classe
public class Object {
De manière générale, il vaut mieux
...
éviter de surcharger des méthodes
public boolean equals(Object o)
en spécialisant les arguments
return this == o
}
... public boolean equals(Point pt) {
} return this.x == pt.x && this.y == pt.y;
}
public class Point {
private double x;
private double y; surcharge (overloads) la méthode
... equals(Object o) héritée de Object
}
Point p1 = new Point(15,11);
invokevirtual … <Method equals(Object)> Point p2 = new Point(15,11);
p1.equals(p2); true
Le choix de la méthode à exécuter est effectué Object o = p2;
statiquement à la compilation p1.equals(o); false
en fonction du type déclaré de l’objet récepteur
o.equals(p1); false
du message et du type déclaré du (des)
HASSOUNI Larbi paramètre(s) 16
Redéfinition de equals
● Tester l’égalité de deux objets de la même classe
public class Object {
...
public boolean equals(Object o) public boolean equals(Object o) {
if (! (O instanceof Point))
return this == o
return false;
} Point pt = (Point) o; // Downcasting
... return (thix.x == pt.x && this.y == pt.y)
}
HASSOUNI Larbi 17
Héritage et Polymorphisme 8
Downcasting
ClasseX obj = …
ClasseA a = (ClasseA) obj;
● Pour que le transtypage soit valide, il faut qu’à l’exécution le type effectif de obj
soit « compatible » avec le type ClasseA
java.lang.ClassCastException: ClasseX
at Test.main(Test.java:52)
HASSOUNI Larbi 18
HERITAGE ET ABSTRACTION
Classes abstraites
HASSOUNI Larbi 19
Héritage et Polymorphisme 9
Classes abstraites : Exemple introductif
● Formes géométriques
▲ on veut définir une application permettant de manipuler des formes
géométriques (triangles, rectangles, cercles…).
▲ chaque forme est définie par sa position dans le plan
▲ chaque forme peut être déplacée (modification de sa position), peut
calculer son périmètre, sa surface
largeur v2
hauteur
●
x,y v1
x,y ●
x,y ●
Attributs : Attributs :
Attributs : double x,y; //1 des sommets
double x,y; //centre du cercle double x,y; //coin inférieur gauche
double r; // rayon double x1,y1; // v1
double largeur, hauteur; double x2,y2; // v2
Méthodes : Méthodes :
deplacer(double dx, double dy) Méthodes :
deplacer(double dx, double dy) deplacer(double dx, double dy)
double surface() double surface()
double périmètre() double surface()
double périmètre(); double périmètre();
●
x,y
x,y ● v1
x,y ●
class Forme {
protected double x,y; Forme
public void deplacer(double dx, double dy) {
x += dx; y += dy;}}
double x,y;
deplacer(double dx, double dy)
HASSOUNI Larbi 21
Héritage et Polymorphisme 10
Classes abstraites : Exemple introductif
public class ListeDeFormes { On veut pouvoir
public static final int NB_MAX = 30; gérer des listes
private Forme[] tabForme = new Forme[NB_MAX]; de formes
private int nbFormes = 0;
public void ajouter(Forme f){ On exploite le polymorphisme
if (nbFormes < NB_MAX) la prise en compte de nouveaux
tabForme[nbFormes++] =f; types de forme ne modifie pas le
} code
public void toutDeplacer(double dx,double dy){
for (int i=0; i < NbFormes; i++) Appel non valide car la méthode
tabFrome[i].deplace(dx,dy); périmètre n ’est pas implémentée
} au niveau de la classe Forme
public double périmetreTotal(){ Définir une méthode périmètre
double pt = 0.0; dans Forme ? Comment?
for (int i=0; i < NbFormes++; i++)
pt += tabForme[i].périmetre(); public double périmetre(){
return pt; return 0.0; // ou -1. ??
} }
}
HASSOUNI Larbi Une solution propre et élégante : les classes abstraites 22
Classes abstraites
● Utilité :
♦ définir des concepts incomplets qui devront être implémentés dans les sous classes
♦ factoriser le code
HASSOUNI Larbi 23
Héritage et Polymorphisme 11
Classes abstraites
● Une classe pour laquelle au moins une méthode abstraite est déclarée est une classe
abstraite (l'inverse n'est pas vrai).
♦ l'utilisation du nom d'une classe abstraite comme type pour une (des)
référence(s) est toujours possible (et souvent souhaitable !!!)
HASSOUNI Larbi 24
Classes abstraites
● Une classe abstraite est une description d'objets destinée à être héritée par des
classes plus spécialisées.
● Pour être utile, une classe abstraite doit admettre des classes descendantes concrètes.
● Toute classe concrète; sous-classe d'une classe abstraite doit “concrétiser” toutes les
opérations abstraites de cette dernière.
HASSOUNI Larbi 25
Héritage et Polymorphisme 12
Classes abstraites
public abstract class Magnitude {
HERITAGE ET ABSTRACTION
Interfaces
HASSOUNI Larbi 27
Héritage et Polymorphisme 13
Interfaces : Exemple introductif
abstract class Animal { Bill Venners Designing with Interfaces
... One Programmer's Struggle to Understand
the Interfaces
abstract void talk(); http://www.atrima.com/designtechniques
} /index.html
class Dog extends Animal { class Bird extends Animal { class Cat extends Animal {
... ... ...
void talk() { void talk() { void talk() {
System.out.println("Woof!"); System.out.println("Tweet"); System.out.println("Meow");
} } }
} } }
Polymorphisme signifie qu’une référence d’un En JAVA le polymorphisme est rendu possible
type (classe) donné peut désigner un objet de par la liaison dynamique (dynamic binding)
n’importe quelle sous classe et selon la nature de
class Interrogator {
cet objet produire un comportement différent static void makeItTalk(Animal subject) {
Animal animal1 = new Dog(); subject.talk();
... }
Animal animal2 = new Cat(); }
animal peut être un Chien, un Chat ou JVM décide à l’exécution (runtime) quelle méthode
n’importe quelle sous classe d ’Animal invoquer en se basant sur la classe de l’objet
HASSOUNI Larbi 28
Héritage et Polymorphisme 14
Interfaces : Exemple introductif
Comment utiliser Interrogator pour faire parler aussi un CuckooClock ?
class Interrogator {
static void makeItTalk(Talkative subject) { interface Talkative {
subject.talk(); public void talk(); Définition d’un type
} } abstrait (interface)
}
Utilisation de ce type abstrait
Les interfaces permettent plus de polymorphisme car avec les interfaces il n’est pas
HASSOUNI Larbi 31
nécessaire de tout faire rentrer dans une seule famille (hiérarchie) de classes
Héritage et Polymorphisme 15
Interfaces
HASSOUNI Larbi 32
● Une interface peut être vue comme une classe abstraite sans attributs et dont toutes les
méthodes sont abstraites.
<<interface>> interface
Dessinable
méthodes abstraites
dessiner(g : Graphics)
effacer(g: Graphics)
HASSOUNI Larbi 33
Héritage et Polymorphisme 16
Interfaces : Implémentation d’une interface
● Une interface est destinée à être “réalisée” (implémentée) par d’autres classes (celles-ci
en héritent toutes les descriptions et concrétisent les opérations abstraites).
si la classe est une classe concrète elle doit fournir une implémentation (un corps) à
chacune des méthodes abstraites définies dans l'interface (qui doivent être déclarées
publiques)
HASSOUNI Larbi 35
Héritage et Polymorphisme 17
Interfaces : Implémentation d’une interface
● Une classe JAVA peut implémenter simultanément plusieurs interfaces
● Pour cela la liste des noms des interfaces à implémenter séparés par des virgules
doit suivre le mot clé implements
Interfaces et polymorphisme
● Une interface peut être utilisée comme un type
♦ A des variables (références) dont le type est une interface il est possible d'affecter
des instances de toute classe implémentant l'interface, ou toute sous-classe d'une
telle classe.
Dessinable d;
public class Fenetre { ..
private nbFigures; d = new RectangleDessinable(…);
private Dessinable[] figures; ...
... d.dessiner(g);
public void ajouter(Dessinable d){ d.surface();
...
}
public void supprimer(Dessinable o){
... permet de s’intéresser uniquement à
} certaines caractéristiques d’un objet
public void dessiner() {
for (int i = 0; i < nbFigures; i++) règles du polymorphisme s’appliquent de
figures[i].dessiner(g); la même manière que pour les classes :
}
• vérification statique du code
}
• liaison dynamique
HASSOUNI Larbi 37
Héritage et Polymorphisme 18
Heritage d’interfaces
● De la même manière qu'une classe peut avoir des sous-classes, une interface peut
avoir des "sous-interfaces"
● Une sous interface
♦ hérite de toutes les méthodes abstraites et des constantes de sa "superinterface"
♦ peut définir de nouvelles constantes et méthodes abstraites
<< interface >>
Collection
interface Set extends Collection{
...
<< interface >> << interface >> }
List Set
● Une classe qui implémente une interface doit implémenter toutes les méthodes
abstraites définies dans l'interface et dans les interfaces dont elle hérite.
HASSOUNI Larbi 38
Heritage d’interfaces
● A la différence des classes une interface peut étendre plus d'une interface à la fois
<< interface >>
Chanel
boolean isOpen()
représente une connexion ouverte void close()
vers une entité telle qu’un dipositif
hardware, un fichier, une “socket”
réseau, ou tout composant logiciel
capable de réaliser une ou plusieurs
opérations d’entrée/sortie. << interface >> << interface >>
ReadableByteChanel WritableByteChanel
int read(ByteBuffer dst) int write(ByteBuffer src)
package java.nio;
interface ByteChannel extends ReadableByteChanel, WriteableByteChanel {
}
HASSOUNI Larbi 39
Héritage et Polymorphisme 19
Interfaces : Intérêts
♦ Lorsqu’on examine une classe implémentant une ou plusieurs interfaces, on est sûr que
le code d’implémentation est dans le corps de la classe. Excellente localisation du code
(défaut de l’héritage multiple, sauf si on hérite de classes purement abstraites).
HASSOUNI Larbi 40
HASSOUNI Larbi 41
Héritage et Polymorphisme 20
LES CLASSES ENVELOPPES (WRAPPERS)
Les variables instances d’une classe (objets) et les variables de types primitifs
ne se comportent pas de la même manière:
•L’affectation porte sur l’adresse d’un objet, sur la valeur d’une variable de
type primitif
•Les collections ne sont définies que pour des éléments qui sont des
objets.(collections = LinkedList, ArrayList, HashSet, TreeSet, …etc)
HASSOUNI Larbi 42
HASSOUNI Larbi 43
Héritage et Polymorphisme 21
LES CLASSES ENVELOPPES (WRAPPERS)
Construction et accès aux valeurs
Toutes les classes enveloppes disposent d’un constructeur qui reçoit un argument d’un
type primitif:
Ces classes WRAPPERS sont finales (ne peuvent pas être dérivées), et inaltérables (Les
valeurs qu’elles encapsulent ne sont pas modifiables
HASSOUNI Larbi 44
En revanche, la méthode equals a bien été redéfinie dans les classes WRAPPERS, de
manière à comparer effectivement les valeurs correspondantes.
intObj1.equals(intObj2) retournera à la valeur true.
HASSOUNI Larbi 45
Héritage et Polymorphisme 22
LES CLASSES ENVELOPPES (WRAPPERS)
Boxing / Unboxing dans JDK5.0
Le JDK 5.0 a introduit les techniques de boxing (emballage) et d’unboxing (déballage) qui
effectuent des conversions, et mises en place automatiquement par le compilateur, entre
les classes WRAPPERS et les types primitifs.
Exemple:
Integer intObj = 10 // 10 est converti en new Integer(10);
Double doubleObj = 10.5 //10.5 est converti en new Double(10.5);
CLASSES ANONYMES
JAVA permet de définir ponctuellement une classe, sans lui donner de nom. Cette
technique est très utilisée pour la gestion des événements dans les interfaces graphiques.
Une classe anonyme est soit une classe qui dérive d’une autre classe, soit elle
implémente une interface.
Héritage et Polymorphisme 23
CLASSE ANONYME
Dérivée d’une autre classe
Exemple :
Class A{
public void affiche(){
System.out.println(« Je suis un objet de la classe A »);
}
}
Public class Anonyme1{
public static void main(String[] args){
A a1 = new A();
A a2 = new A(){
public void affiche(){
System.out.println(« Je suis un objet de la classe anonyme dérivée de
A »);
};
a1.affiche();
a2.affiche();
}
HASSOUNI Larbi 48
CLASSE ANONYME
Implémentant une interface
Exemple :
Interface I{
public void affiche();
}
Public class Anonyme2{
public static void main(String[] args){
I a = new I(){
public void affiche(){
System.out.println(« Je suis un objet de la classe anonyme qui implémente
l’interface I »);
};
a.affiche();
}
HASSOUNI Larbi 49
Héritage et Polymorphisme 24
Les chaînes de caractères
Classe String
HASSOUNI Larbi 50
Exemple:
char[] bonjourTab = { ‘b', ‘o', ‘n', ‘j', 'o', ‘u’, ‘r’, '.'};
HASSOUNI Larbi 51
Héritage et Polymorphisme 25
Note:
La classe String est immuable, par conséquent,
une fois un objet String est créé, il ne peut pas être
modifié. La classe String possède un ensemble de
méthodes qui opèrent sur les objets comme s’ils les
modifiaient, mais en réalité, puisque la classe String
est immuable, ces méthodes créent et retournent de
nouveaux objets qui contiennent les résultat de
l’opération.
HASSOUNI Larbi 52
HASSOUNI Larbi 53
Héritage et Polymorphisme 26
Concatenation des chaînes
La classe String inclut une méthode d’instance qui permet de
concaténer deux chaînes: ch1.concat(ch2); retourne un
nouveau objet String formé par les carctères de ch1 ausquels
on a ajouté à la fin les caractères de ch2.
Attention, ch1 n’est pas modifié.
Il est aussi possible d’utiliser concat avec des constantes
chaines comme
“Bonjour ".concat(“tout le monde");
HASSOUNI Larbi 54
Note:
Java n’autorise pas de diviser une constante string en
plusieurs lignes dans un programme source. Par
conséquent, il faut avoir recours à l’opérateur + à la fin de
chaque ligne dans le cas d’une constante chaîne multilignes.
Exemple :
String quote = "Now is the time for all good " +
"men to come to the aid of their country.";
HASSOUNI Larbi 55
Héritage et Polymorphisme 27
Création d’une chaine de format
La classe String possède une méthode statique format() qui permet de créer une
chaine de format qui peut être réutilisée.
Par exemple, au lieu de :
System.out.printf(" La valeur de la variable float est %f, losque celle de la " + "
variable entier est %d, et celle de type string est %s", floatVar, intVar, stringVar);
Vous pouvez écrire:
String fs;
System.out.println(fs);
HASSOUNI Larbi 56
HASSOUNI Larbi 57
Héritage et Polymorphisme 28
Note:
Chaque classe WRAPPER fournit également une méthode statique dont le nom
est parseXXXX() (parseInt, parseFloat, …etc) qui convertit une chaîne en un
nombre de type primitif.
Puisque cette méthode retourne un type primitif, elle est plus directe que la
méthode. Ainsi dans le programme précédent, au lieu d’écrire :
float a = Float.parseFloat(args[0]);
float b = Float.parseFloat(args[1]);
HASSOUNI Larbi 58
int i;
String s1 = "" + i; //la conversion est faite automatiquement.
String s2 = String.valueOf(i);
Par example:
int i;
double d;
String s3 = Integer.toString(i);
String s4 = Double.toString(d);
HASSOUNI Larbi 59
Héritage et Polymorphisme 29
Manipulation des caractères dans une chaîne
Retourne le caractère 'O', qui se trouve à l’indice 9 (position 10) comme le montre
la figure ci-dessous.
HASSOUNI Larbi 60
String substring(int debut, int fin) : retourne la sous chaine située entre l’indice debut et
l’indice fin-1.
String substring(int debut) : retourne la sous chaine située entre l’indice debut et la fin
de la chaine.
HASSOUNI Larbi 61
Héritage et Polymorphisme 30
Les
Exceptions
Préparé par : Larbi Hassouni
Exceptions 1
Introduction aux exceptions
• Toutes les applications peuvent rencontrer des
erreurs lorsqu'elles s'exécutent. Par exemple:
– Un utilisateur peut fournir une donné
inappropriée (Une chaine au lieu d'un nombre);
– Un fichier dont a besoin l'application peut être
déplacé ou supprimé.
HASSOUNI Larbi 2
HASSOUNI Larbi 3
Exceptions 1
• Les anciens langages n'offraient pas de
moyens pour contrôler les erreurs.
• Pire encore, ils ne permettaient pas de
communiquer ces erreurs aux autres parties
de l'application qui peuvent avoir besoin
d'avoir des informations dessus.
• Pour résoudre ce problème, la plupart des
langages modernes, y compris java,
fournissent un mécanisme de gestion des
erreurs, connu sous le nom d'exceptions.
HASSOUNI Larbi 4
HASSOUNI Larbi 5
Exceptions 2
Hiérarchie des exceptions
• En Java, une exception est un objet instance
de la classe Exception ou de l'une de ses sous-
classes.
• Une exception représente une erreur qui s'est
produit lors de l'exécution d'une application,
et contient des informations sur cette erreur.
• Comme le montre la figure de la diapositive
suivante. Toutes les exceptions dérivent de la
classe Throwable.
HASSOUNI Larbi 6
Throwable
Error Exception
RunTimeException
Unchecked Errors
Exceptions 3
• Comme le montre le schéma, deux classes héritent
directement de la classe Throwable:
– Error
– Exception
• Les classes qui héritent de la classe Error représentent
des erreurs internes contre lesquelles, vous ne pouvez
rien faire, comme les erreurs de l'environnement
d'exécution (JVM).
• Par conséquent, vous pouvez ignorer ce type d'erreurs
dans la plupart du temps.
• En revanche, vous avez besoin de gérer les exceptions
qui héritent de la classe Exception.
HASSOUNI Larbi 8
HASSOUNI Larbi 9
Exceptions 4
• Les exceptions non contrôlées survient
souvent à cause d'une erreur de codage.
• Par exemple, si une application essaie
d'accéder à un tableau avec un indice
incorrect (par exemple, supérieur à la
longueur du tableau) Java lance un objet
exception instance de
ArrayIndexOutOfBoundsException qui est sous
classe de IndexOutOfBoundsException.
• Si vous êtes attentif lorsque vous écrivez votre
code, vous pouvez généralement éviter ce
type d'exception d'être lancé.
HASSOUNI Larbi 10
HASSOUNI Larbi 11
Exceptions 5
Sous classes de la classe RunTimeException
Dans le package java.lang
Exception
RunTimeException
NegativeArraySizeException
ClassCastException
NullPointerException
NumberFormatException
IndexOutOfBoundsException
IllegalThreadStateException
12
13
Exceptions 6
Nom de la classe Condition de lancement de
l’exception
14
15
Exceptions 7
Nom de la classe Condition de lancement de
l’exception
llegalThreadStateException est lancée lors d’une opération qui est
illégale dans l’état actuel du thread.
NumberFormatException est lancée avec les méthodes
valueOf(), et decode() qui se trouvent
dans les classes qui représentent les
entiers (Byte, Short, Integer, et Long).
Les méthodes parseXXX() présentes
dans ces classes peuvent égament
lancer NumberFormatException.
L’exception est lancée si l’objet String
passé en argument contient un
caractère invalide qui empêche la
conversion vers un entier.
16
ClassNotFoundException InterruptedException
SQLException IOException
EOFException FileNotFoundException
17
Exceptions 8
Exceptions : Exemple 1
class ExempleSansExcep1{
public static void main(String[] args){
int n ;
if(args.length > 0){
n = Integer.parseInt(args[0]);
System.out.println("C'est trés bien vous avez fourni un entier : " +n);
}
}
}
java ExempleSansExcep1 5
C'est tres bien vous avez fourni un entier : 5
java ExempleSansExcep1 a
Exception in thread "main" java.lang.NumberFormatException: For input string: "a"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at ExempleSansExcep1.main(ExempleSansExcep1.java:5)
18
Exceptions : Exemple 2
public class Div {
Exceptions 9
Exceptions : Exemple 3
class Point{
private int x, y;
public int getX(){ return x; }
public void setX(int x){ this.x = x; }
}
public class ExempleExcep2{
public static void main(String[] args){
Point p1 = null;
p1.setX(5);
System.out.println("l'abscisse du point est : " + p1.getX());
}
}
java ExempleSansExcep2
20
Exceptions : Exemple 4
class ExempleExcep1{
public static void main(String[] args){
int n = -1;
try{
if(args.length > 0){
n = Integer.parseInt(args[0]);
System.out.println("C'est trés bien vous avez fourni un entier : " +n);
}
}
catch (NumberFormatException e){
System.out.println("Vous n'avez pas fourni un entier :");
System.out.println(e.getMessage());
}
finally{
System.out.println("Je suis toujours exécutée!!!");
}
}
}
21
Exceptions 10
Exceptions : Exemple 5
class Point{
private int x, y;
public int getX(){ return x; }
public void setX(int x){ this.x = x; }
}
public class ExempleExcep2{
public static void main(String[] args){
Point p1 = null;
try{
p1.setX(5);
System.out.println("l'abscisse du point est : " + p1.getX());
}
catch (NullPointerException e){
System.out.println("Vous avez oublie de creer l'objet p1");
System.out.println(e.getMessage());
}
finally{
System.out.println("Je suis toujours exécutée!!!");
}
}}
22
Exceptions : Exemple 6
class Point{
private int x, y;
public int getX(){ return x; }
public void setX(int x){ this.x = x; }}
Exceptions 11
Exceptions : Exemple 7
class EntNat{
class ErrConst extends Exception{ private int n;
} public EntNat (int n) throws ErrConst {
if (n<0) throw new ErrConst();
java TestEntNat1 this.n = n;
n1 = 20 }
**Erreur construction entier naturel** public int getN(){ return n; }
}
public class TestEntNat{
public static void main(String[] args){
try{
EntNat n1 = new EntNat(20);
System.out.println("n1 = " + n1.getN());
EntNat n2 = new EntNat(-20);
System.out.println("n2 = " + n2.getN());
}
catch(ErrConst e){
System.out.println("**Erreur construction entier naturel);
System.exit(-1);
}
}} 24
Exceptions : Exemple 8
class EntNat{
class ErrConst extends Exception{ private int n;
private int valeur; public EntNat (int n) throws ErrConst {
public ErrConst(int valeur){ if (n<0) throw new ErrConst(n);
this.valeur = valeur;} this.n = n;
public int getValeur(){ return valeur; } }
} public int getN(){ return n; }
}
public class TestEntNat{
public static void main(String[] args){
try{
EntNat n1 = new EntNat(20);
System.out.println("n1 = " + n1.getN());
EntNat n2 = new EntNat(-20);
System.out.println("n2 = " + n2.getN());
}
catch(ErrConst e){
System.out.println("**Err: construction entier naturel avec:"+e.getValeur());
System.exit(-1);
}
}} 25
Exceptions 12
Exceptions contrôlées
Pour toutes les autres classes (différentes de RunTimeException) qui dérivent de la
classe Exception, le compilateur vérifie que l’exception est soit traitée par la méthode
où elle a été lancée, soit que vous avez indiqué que cette méthode peut lancer une
telle exception. Si vous ne faites ni l’une ni l ’autre, votre code ne se compilera pas.
26
27
Exceptions 13
Traitement des exceptions
Pour traiter une exception, il existe trois types de blocs de code que vous pouvez inclure dans la méthode qui va se
charger du traitement:
• try
• catch
• finally
Le bloc try délimite le code qui est sensé lancer une ou plusieurs exceptions.
Le bloc catch délimite le code qui est destiné à traiter les exceptions d’un type particulier qui pourraient être lancée par le
code du bloc try.
Le bloc finally délimite un code qui sera toujours exécuté qu’il y ait ou non lancement d’exceptions par le code du bloc try,
et traitement ou non d’une éventuelle exception par un bloc catch.
28
Bloc try
Lorsque vous voulez attraper une exception, vous devez placer le code
susceptible de lancer une telle exception dans un bloc try.
Un bloc try consiste simplement en le mot clé try suivi de deux accolades qui
englobent le code susceptible de lancer l’exception.
try {
// code qui peut lancer une ou plusieurs exceptions
}
Il n’est pas obligatoire de mettre un code qui peut causer des exceptions dans
un bloc try. Seulement, la méthode qui contient un tel code ne peut pas
attraper ces exceptions si elles sont lancées, et il faut alors que la méthode
déclare avec throws qu’elle peut lancer les types d’exceptions qui ne peuvent
pas être attrapées.
Même si on est en train de discuter des exceptions que nous devons traiter, un
bloc try est aussi nécessaire si vous voulez attraper des exceptions de type
Error ou RunTimeException.
29
Exceptions 14
Bloc catch
Un bloc catch englobe le code qui traite un type donné d’exception.
Le bloc catch doit suivre immédiatement le bloc try qui contient le code qui peut
avoir causé ce type d’exception.
Un bloc catch consiste en le mot clé catch, suivi d’un paramètre entre parenthèses
qui identifie le type d’exception que le bloc doit traiter, suivi du code, qui traite
l’exception, placé entre des accolades.
En général le paramètre du bloc catch doit être de type throwable ou d’une des
sous classes de throwable.
Le bloc catch traitera les exceptions de type de la classe du paramètre, et de toutes
les sous classes de cette classe.
Par exemple, si vous spécifiez un paramètre de type RunTimeException, le code
du bloc catch sera invoqué pour traiter les exceptions de type RunTimeException,
et celles de ses sous classes.
30
Exemple :
Try {
// Code qui peut lancer une ou plusieurs exceptions
}
Catch (ArithmeticException e) {
// Code qui traite l’exception de type ArithmeticException et pas les autres
}
31
Exceptions 15
public class TestTryCatch {
public static void main(String[] args) {
int i = 1;
int j = 0;
try {
System.out.println("Try block entered " + "i = "+ i + " j = "+j);
System.out.println(i/j); // Divide by 0 - exception thrown
System.out.println("Ending try block");
L’exécution montre que le bloc try n'a pas été entièrement exécuté, puisque
l'instruction println(i/j) lance une exception, le bloc try s'arrête et l'exécution
continue au bloc catch associé.
Remarque:
En ce qui concerne le scope des variables, les blocs try et catch ont le même
comportement qu’un bloc standard.
Par conséquent, une variable déclarée dans un bloc try ou catch n’est visible que
dans ce bloc, elle n’est pas visible à l’extérieur.
33
Exceptions 16
Que fait ce programme ?
public class TestLoopTryCatch {
public static void main(String[] args) {
int i = 12;
Exécution :
35
Exceptions 17
Que fait ce programme ?
public class TestLoopTryCatch2 {
public static void main(String[] args) {
int i = 12;
try {
System.out.println("Try block entered.");
for(int j=3 ;j>=-1 ; j--) {
System.out.println("Loop entered " + "i = "+ i + " j = "+j);
System.out.println(i/j); // Divide by 0 - exception thrown
}
System.out.println("Ending try block");
37
Exceptions 18
Les exceptions de type ArithmeticException seront
attrapées par le premier catch, et celles de type
IndexoutOfBoundsException seront attrapées par le
deuxième catch.
38
39
Exceptions 19
Le cas extrême serait si vous spécifiez un bloc catch avec un paramètre de type
Exception, ce bloc attrapera n’importe quelle exception de type Exception ou de
type d’une sous classe de la classe Exception.
Les blocs catch doivent être placés avec le bloc dont le paramètre est de type le
plus dérivé en premier, et le bloc catch dont le paramètre est de type de la
classe de base en dernier. Dans le cas contraire, le code ne sera pas compilé.
La raison de cela est que si un bloc catch qui attrape une exception d’un type
donné précède le bloc catch qui attrape une exception d’un type qui dérive de
type précédent, le second bloc catch ne sera jamais exécuté.
40
Try {
// Code qui peut lancer des exceptions de type
// ArithmeticException et d’autres exception de type sous classes
// de Exception
}
Catch (Exception e) {
// Code qui attrapera toute exception de type Exception
// ou de toute classe dérivé de la classe Exception
}
Catch (ArithmeticException e) {
// Code qui attrape uniquement les exceptions de type
// ArithmeticException et de ses sous classes
}
Exceptions 20
Le bloc finally
Lorsqu’une exception est lancée dans un bloc try, l’exécution du bloc est arrétée
à l’instruction qui cause l’exception, quel que soit l’importance du code qui vient
après.
Ceci peut avoir comme effet de laisser les choses dans un état non satisfaisant,
car il est possible d’avoir ouvert un fichier où établir une connexion réseau, et le
lancement d’une exception ne laissera pas les instructions destinées à fermer
les fihiers et les connexions s’exécuter.
Le bloc finally fournit le moyen de faire le nettoyage après l’exécution d’un bloc
try.
Vous utilisez un bloc finally lorsque vous voulez être sûr qu’un code sera
exécuté avant de quitter la méthode qu’il y ait ou non lancement d’exceptions
dans le bloc try.
Un bloc finally est toujours exécuté quel que soit ce qui arrive dans une
méthode.
42
Finally {
// code de nettoyage toujours exécuté et en dernier
}
Comme un bloc catch, un bloc finally doit toujours être associé à un bloc try, et
doit être placé après le dernier catch associé au même try.
S’il n’ya aucun catch associé à un bloc try, le bloc finally doît être placé
immédiatement après le bloc try.
Il est bien sûr possible d’avoir un bloc try avec uniquement des blocs catch sans
qu’il n’y ait de bloc finally.
43
Exceptions 21
Structure d’une méthode
Double doSomething(int aParam)
throws exceptionType1, ExceptionType2 try {
{ // Code qui peut lancer des exceptions
//Code qui ne lance pas d’exception }
//ensemble de blocs try/catch/finally catch (MyException1 e) {
// Code qui traite MyException1
//Code qui ne lance pas d’exception
}
//ensemble de blocs try/catch/finally
catch (MyException2 e){
//Code qui ne lance pas d’exception // Code qui traite MyException2
}
//ensemble de blocs try/catch/finally
//Code qui ne lance pas d’exception finally{
// Code à exécuter toujours
//…. }
44
Exceptions 22
Exécution lorsqu'une exception est lancée et attrapée
L’exécution
commence au try {
début de try
// Code qui peut lancer des exceptions
}
L’exécution s’arrête au point où s’est
produite l’exception. L’exécution catch (MyException1 e) {
continue au bloc catch qui
correspond à l’exception
// Code qui traite MyException1
}
catch (MyException2 e){
// Code qui traite MyException2
Après l’exécution du bloc catch, }
le contrôle passe au bloc finally
finally {
// Code à exécuter toujours
Si aucune instruction }
return ne se trouve ni
dans catch, ni dans
finally, l’exécution
continue à l’instruction
qui suit finally.
46
int method1(…){
try{
methode2(…)
Int methode2(…){
}
Propagation d'exception2 non attrapée methode3( …)
}
Exception2 attrapée
Une exception lancée mais non attrapée se propage d'un niveau à l'autre jusqu'à
ce qu'elle soit attrapée ou jusqu'au niveau le plus élevé. Si elle n'est pas traitée
dans ce dernier niveau, l'exécution du programme est interrompue 47
Exceptions 23
Que fait ce programme ?
public class TryBlockTest {
public static void main(String[] args) {
int[] x = {10, 5, 0}; // Array of three integers
} catch(ArithmeticException e) {
System.out.println("Arithmetic exception caught in main()");
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Index-out-of-bounds exception caught in main()");
}
System.out.println("Outside try block in main()");
}
48
// Divide method
public static int divide(int[] array, int index) {
try {
System.out.println("\nFirst try block in divide() entered");
array[index + 2] = array[index]/array[index + 1];
System.out.println("Code at end of first try block in divide()");
return array[index + 2];
} catch(ArithmeticException e) {
System.out.println("Arithmetic exception caught in divide()");
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Index-out-of-bounds exception caught in divide()");
} finally {
System.out.println("finally block in divide()");
}
System.out.println("Executing code after try block in divide()");
return array[index + 2];
}
}
49
Exceptions 24
Blocs try emboités
try{
try{
//premier bloc try interne
}
catch(Exception1 e){ Le bloc catch externe
//…… peut attraper n'importe
} quelle exception lancée
//bloc try externe mais non attrapée à
try{
//second bloc try interne
l'intérieur du bloc try , y
} compris dans les blocs
catch(Exception1 e){ try internes
//……..
}
}
Catch (Exception2 e){
bloc catch du bloc try externe
}
HASSOUNI Larbi 50
Une exception qui a été lancée et traitée dans une méthode appelée peut être
relancée vers le programme appelant en vue de terminer son traitement et en
tenir compte dans la suite des opérations du programme.
HASSOUNI Larbi 51
Exceptions 25
Objets Exception
L'objet Exception qui est passé comme
argument au block catch peut fournir des
informations importantes sur la nature du
problème qui a causé l'exception.
La classe de base des exceptions est la classe
Throwable, par conséquent chaque objet
Exception hérite ses membres
HASSOUNI Larbi 52
Classe Throwable
La classe Throwable contient deux constructeurs public:
• Le constructeur par défaut
• un constructeur qui accepte un argument de type String.
Cet argument est utilisé pour fournir une description de
la nature du problème qui a causé l'exception.
HASSOUNI Larbi 53
Exceptions 26
La pile d'exécution garde la trace de toutes les
méthode appelée.
HASSOUNI Larbi 54
HASSOUNI Larbi 55
Exceptions 27
La classe Throwable contient les méthodes public ci-
dessous pour permettre l'accès au message et à
l'enregistrement de la pile d'exécution:
Méthode Description
Retourne le message qui décrit
l'exception.
getMessage() Il est généralement formé par le
FQN de la classe exception, et une
brève description de l'exception
Affiche à l'écran le message et
printStackTrace() l'enregistrement de la pile
d'exécution
HASSOUNI Larbi 56
Méthode Description
printTraceStack Identique à printStackTrace, sauf qu'elle
(PrintStream s) écrit dans un fichier.
Modifie le numéro de la ligne où s'est
produite l'exception par celui où cette
méthode est appelée.
L'intérêt principal de cette méthode est
lorsqu'on veut relancer une exception, et
fillInStackTrace() enregistrer le numéro de la ligne où la
relance a été effectuée.
e.fillInStackTrace(); //enregistrer la ligne de
relance
throw e; //relancer l'exception.
HASSOUNI Larbi 57
Exceptions 28
Pourquoi des exceptions
non contrôlées ?
• Les exceptions non contrôlées peuvent
survenir dans toute portion de code (par
exemple NullPointerException ou
IllegalArgumentException)
• Si ces exceptions étaient contrôlées, toutes les
méthodes auraient une clause throws ou le
code serait rempli de bloc try-catch
58
HASSOUNI Larbi 59
Exceptions 29
Définition d'une classe Exception
une classe exception doit toujours avoir Throwable comme
superclasse, sinon vous ne définissez pas une exception.
Même si vous pouvez dériver votre classe exception de
n'importe quelle classe d'exception standard, la meilleure
politique est de la dériver à partir de la classe Exception.
Cela permet au compilateur de garder trace de l'endroit où
l'exception s'est produite, puis de contrôler si l'exception est
attrapée (caught) ou lancée (thrown) dans la méthode.
Si vous utilisez RunTimeException comme superclasse, le
compilateur supprimera le contrôle de l'existence des blocs
catch pour votre exception.
HASSOUNI Larbi 60
Exceptions 30
Il est bien sûr possible de définir d'autres
constructeurs.
Il est également possible d'ajouter à votre classe
des variables membres d'instances pour
stocker davantage d'information sur les causes
de l'exception, et des méthodes qui vont
permettre d'accéder à ces informations dans
un bloc catch.
Votre classe héritera bien sûr des méthode de la
classe Throwable citées précédemment.
HASSOUNI Larbi 62
Exceptions 31
Exemples de traitements
dans un bloc catch
• Fixer le problème et réessayer le traitement
qui a provoqué le passage au bloc catch
• Faire un traitement alternatif
• Retourner (return) une valeur particulière
• Sortir de l’application avec System.exit()
• Faire un traitement partiel du problème et
relancer (throw) la même exception (ou une
autre exception)
64
Exceptions 32
Pourquoi laisser remonter
une exception ?
• Plus une méthode est éloignée de la
méthode main dans la pile d’exécution,
moins elle a une vision globale de
l’application
• Une méthode peut donc laisser remonter
une exception si elle ne sait pas comment la
traiter, en espérant qu’une méthode
appelante en saura assez pour la traiter
66
Exceptions 33