CoursJava2021 2022
CoursJava2021 2022
CoursJava2021 2022
Page
Table des matières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1 Présentation Générale de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1 Principe de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.1 Le compilateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.2 La machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1.3 L’interpréteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Caractéristique objet de Java . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.1 La notion d’objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.2 La notion de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Création d’une application Java . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.1 Définition et création d’une application . . . . . . . . . . . . . . . . 10
1.3.2 Les paramètres de la méthode main . . . . . . . . . . . . . . . . . . 11
1.3.3 Organisation d’une application Java . . . . . . . . . . . . . . . . . . 13
1.4 Exercices d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2 Éléments de Base de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1 Les types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.1 Gestion de la mémoire . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.2 Les types primitifs . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.3 Les types références . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.4 Le transtypage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 Les instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.1 Les structures conditionnelles . . . . . . . . . . . . . . . . . . . . . 19
2.2.2 Les structures itératives (ou boucles) . . . . . . . . . . . . . . . . . 21
2.2.3 Les instructions de saut . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3 Exercices d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3 Programmation Orientée Objet . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1 L’approche objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2 Les concepts de base de l’approche objet . . . . . . . . . . . . . . . . . . . 28
3.2.1 Objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.2 Communication entre les objets . . . . . . . . . . . . . . . . . . . . 29
3.2.3 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.4 Classe et instanciation . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.5 Constructeur et Destructeur . . . . . . . . . . . . . . . . . . . . . . 31
3.2.6 Héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.7 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3 Implémentation en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3.1 Les classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3.2 Instanciation des objets . . . . . . . . . . . . . . . . . . . . . . . . 39
3.3.3 Appel des méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . 40
1
TABLE DES MATIÈRES 2
3.3.4 La référence sur l’objet courant . . . . . . . . . . . . . . . . . . . . 41
3.3.5 Les membres statiques . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.3.6 Les tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.3.7 Types des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4 Exercices d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4 Héritage et Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1 Héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.2 Syntaxe de l’héritage . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.1.3 Enchaı̂nement des constructeurs . . . . . . . . . . . . . . . . . . . . 54
4.1.4 Propriétés des constructeurs . . . . . . . . . . . . . . . . . . . . . . 54
4.1.5 Redéfinition des méthodes . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.6 Les modes de protection . . . . . . . . . . . . . . . . . . . . . . . . 56
4.1.7 Portée des méthodes redéfinies . . . . . . . . . . . . . . . . . . . . . 57
4.1.8 Interdire la redéfinition et bloquer l’héritage . . . . . . . . . . . . . 58
4.2 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2.2 Le polymorphisme des méthodes . . . . . . . . . . . . . . . . . . . . 59
4.2.3 Le polymorphisme des objets . . . . . . . . . . . . . . . . . . . . . 60
4.2.4 L’opérateur instanceof . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.2.5 Tableaux polymorphes . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.3 Exercices d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5 Classes Abstraites et Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.1 Les classes abstraites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.2 Les interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.2.1 Définition et déclaration d’une interface . . . . . . . . . . . . . . . . 70
5.2.2 Implémentation d’une interface . . . . . . . . . . . . . . . . . . . . 70
5.2.3 Implémentation de plusieurs interfaces . . . . . . . . . . . . . . . . 71
5.2.4 Dérivation d’une interface . . . . . . . . . . . . . . . . . . . . . . . 74
6 Gestion des Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6.1 Définition de l’exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6.2 La hiérarchie des classes des erreurs et des exceptions . . . . . . . . . . . . 79
6.3 Lever une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.4 Traitement d’une exception . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.4.1 Capturer une exception . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.4.2 Propagation d’une exception . . . . . . . . . . . . . . . . . . . . . . 83
6.5 Les sources d’exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.6 Exercices d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7 Utilisation de bases de données avec JDBC . . . . . . . . . . . . . . . . . . . . . 88
7.1 Classes de JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.2 Connexion à la base de données . . . . . . . . . . . . . . . . . . . . . . . . 89
7.2.1 Prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.2.2 Chargement du driver . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.2.3 Identification de l’URL . . . . . . . . . . . . . . . . . . . . . . . . . 90
TABLE DES MATIÈRES 3
− Java Virtual Machine (JVM) : la machine virtuelle “couche logicielle” qui isole les
programmes écrits en Java des contraintes des systèmes d’exploitation.
de programmes Java sur toutes les plates-formes. Le JRE désigne la JVM et l’ensemble des
outils nécessaires (bibliothèques standard) pour exécuter des programmes en Java. Le JRE
interprète le byte code en un langage propre au système d’exploitation. Il existe donc
plusieurs JRE, chacun associé à un système d’exploitation.
− Java Developpment Kit (JDK) : outils de développement permettant essentiellement
de compiler du code Java pour produire un code portable (byte code) pour n’importe
quel système d’exploitation. Il inclut un compilateur, un interpréteur et un environnement
de développement comprenant les outils et utilitaires favorisant la programmation.
Dans ce qui suit, nous présenterons une idée générale pour expliquer le principe de
fonctionnement de ces outils.
1.1.1 Le compilateur
Le programme javac est le principal compilateur de Java faisant partie du JDK. Il
est écrit entièrement en Java et disponible sur n’importe quelle plateforme qui permet
l’exécution de programmes Java.
La compilation d’un programme Java doit se faire avec l’exécution du programme javac.
CHAPITRE 1. PRÉSENTATION GÉNÉRALE DE JAVA 6
Syntaxe :
javac nomFichier.java
Nous pourrons effectuer une redirection du fichier résultant vers un autre répertoire en
utilisant l’option “d”.
Syntaxe :
javac -d cheminDestination nomFichier.java
Nous pourrons compiler plusieurs fichiers “.java” en même temps et regrouper tous les
fichiers “.class” dans un même répertoire.
Syntaxe :
javac -d cheminDestination nomFichier1.java nomFichier2.java ...
Elle isole les programmes Java des contraintes de l’environnement local, assurant ainsi
leur portabilité.
Pour qu’un système puisse faire tourner des programmes Java, il faut que la JVM soit
portée sur le système en question.
Nous pouvons développer un programme Java sous Linux et l’exécuter dans des envi-
ronnements divers. Pour cela, les programmes Java compilés n’utilisent pas directement le
processeur de la machine, ils se servent d’une machine virtuelle Java, c’est un programme
qui se charge d’interpréter de code compilé et l’adapter à la machine sur laquelle il tourne.
1.1.3 L’interpréteur
Un interpréteur Java est un logiciel qui implémente la machine virtuelle et qui exécute
les programmes Java.
Syntaxe :
java nomFichier
L’interpréteur gère toutes les activités du système d’exécution Java, il charge des fichiers
“.class” et interprète le bytecode compilé. En d’autres termes, il lit chaque instruction
du fichier “.class” et la traduit dans le langage du processeur et lance son exécution, puis
il prend en charge l’instruction suivante.
Les systèmes qui veulent exécuter un programme Java doivent fournir un interpréteur.
À l’heure actuelle, les JVM sont fournis avec les systèmes d’exploitation Linux, Windows,
Macintosh, etc. C’est le JRE qui va traduire donc le bytecode en un langage propre au
système d’exploitation utilisé.
Les objets regroupent les principales caractéristiques des éléments du monde réel. Un
objet est caractérisé par :
− ses attributs : il s’agit de données dont les valeurs caractérisent l’état l’objet.
− son identité : l’objet possède une identité qui permet de le distinguer des autres
objets. Cette identité est donnée par le système.
CHAPITRE 1. PRÉSENTATION GÉNÉRALE DE JAVA 8
Exemple : Soient deux objets objet1 et objet2 représentant deux personnes différentes.
N.B. : Par convention, un nom d’objet commence par une lettre minuscule. S’il est
composé de plusieurs mots, chaque mot (à part le premier) commence par majuscule et le
reste en minuscule.
La classe est donc la structure d’un objet c-à-d la déclaration de l’ensemble des parties
qui composeront un objet. Une classe est alors composée de deux parties :
Soit une classe appelée ExempleClasse instanciée en deux objets objet1 et objet2.
Cette instanciation peut être schématisée comme suit :
CHAPITRE 1. PRÉSENTATION GÉNÉRALE DE JAVA 9
Soient deux objets personne1 et personne2 créés par la classe Personne. Ils peuvent
avoir les valeurs suivantes pour leurs attributs :
La classe de lancement d’une application n’a besoin que d’un seul élément : une méthode
principale main. En Java, la méthode main doit obligatoirement exister à l’intérieur d’une
classe de lancement.
Syntaxe :
avec :
− pour la classe, sa caractéristique public indique qu’elle peut être accessible à partir
d’autres classes dans des paquetages différents (voir chapitre 3).
• static : signifie qu’il s’agit d’une méthode de classe (voir chapitre 3).
• main (String args []) : prend un paramètre, qui est un tableau de chaı̂nes de ca-
ractères “String”. Il s’agit des paramètres de la ligne de commande qui exécute la méthode
main (qui sera traitée dans la section suivante). Le corps de cette méthode contient le code
nécessaire à l’exécution de l’application : l’initialisation des variables ou la création d’ins-
tances des classes qui ont été déclarées (s’il y en a) et les instructions de manipulation de
ces variables ou instances.
,→ System est une classe qui se réfère au système dans lequel le programme s’exécute ;
out est l’objet de sortie par défaut (écran) ; la fonction println imprime son paramètre
String sur le périphérique de sortie suivi d’un saut de ligne.
Bonjour
SMI
S5
Integer.parseInt(chaı̂ne)
,→ Cette commande retourne la valeur entière, écrite sous forme de chaı̂ne de caractères,
de la variable cha^
ıne.
Pour convertir la valeur un paramètre du type String en un type float, nous pouvons
utiliser la fonction suivante :
Float.parseFloat(chaı̂ne)
Exemple : Le programme qui permet d’afficher le paramètre sous forme d’un entier est
le suivant :
Si le fichier contient une seule classe, il est important que le nom de ce fichier corres-
ponde au nom de la classe. Si le fichier contient plusieurs classes, il doit y avoir au moins
une classe qui porte le même nom de ce fichier.
Une application Java doit contenir une seule méthode main. Généralement, la classe qui
contient la méthode main ne contient pas d’autres méthodes.
CHAPITRE 1. PRÉSENTATION GÉNÉRALE DE JAVA 14
Exercice 1.1
1. Créez votre propre répertoire de travail (par exemple : C :\SMI5\B2\PC\TP1).
2. Écrivez le programme Bonjour.java suivant en utilisant un éditeur de texte :
− Les types primitifs : représentent des valeurs simples qui ont des fonctionnalités
prédéfinies par le langage. Exemple : byte, short, int, long, float, double, et char.
− Les types références (ou types de classes) : représentent des valeurs complexes
incluent des objets et des tableaux dont les fonctionnalités doivent être définies.
Exemple : String.
15
CHAPITRE 2. ÉLÉMENTS DE BASE DE JAVA 16
Exemples :
boolean b = true;
char c = ‘m’;
int val = 19;
long l = 13L;
double d = 3.7;
float f = 7.1F;
Exemple :
String s;
Cette instruction permet de créer une référence appelée s contenant la valeur null.
2.1.4 Le transtypage
Le transtypage permet de convertir une donnée d’un type primitif (sauf le boolean) ou
d’un type référence en un nouveau type.
Un transtypage peut être fait :
− entre deux types primitifs.
− ou entre deux types références.
typeMoinsLarge → typePlusLarge
Les différents types primitifs peuvent être classés selon la règle de conversion comme
suit :
En effet, une variable de type float, par exemple, pourra être convertie en un double,
mais l’inverse n’est pas évident.
CHAPITRE 2. ÉLÉMENTS DE BASE DE JAVA 18
Exemple :
double d=5.0;
float f=3.0F;
int i;
// le compilateur autorise le transtypage
// implicite suivant:
d=f;
// il s’agit de convertir f en un double
i=d;
/* erreur : le système ne peut pas convertir implicitement un
double en un entier */
Lorsqu’un transtypage implicite illégal est tenté, alors une erreur est déclenchée (excep-
tion lancée : voir chapitre 6) indiquant une incompatibilité de type.
• Transtypage explicite
Le transtypage explicite permet de spécifier, directement dans le code, le type que l’on
souhaite donner à une variable.
Syntaxe :
(type) expression ;
Exemple :
float f = 7.3F;
int i;
i = (int) f;
Pour les types primitifs, il est possible d’être confronté à une perte d’informations
lorsque le type de transtypage est moins large que celui de l’origine.
Syntaxe :
if(condition){
// instructions si la condition est vraie;
}
else {
// instructions si la condition est fausse;
}
Syntaxe :
if (condition1)
[ if (condition2) {
// instructions si condition1=vraie et condition2=vraie
}
[ else { //condition2
// instructions si condition1=vraie et condition2=fausse
}
]
]
[ else { //condition1
// instructions si condition1=fausse
}
]
Syntaxe :
switch (sélecteur) {
case valeur1 :
// liste des instructions si sélecteur = valeur1;
[ break; ]
case valeur2 :
// liste des instructions si sélecteur = valeur2;
[ break; ]
...
[default :
// liste des instructions si aucune valeur n’est
choisie ]
}
• Structure while
Syntaxe :
while(conditions){
//ensemble d’instructions;
}
Les instructions sont répétées tant que les conditions sont vérifiées. La boucle peut ne
jamais être exécutée si la condition est fausse dès la première itération.
• Structure do while
Syntaxe :
do {
//ensemble d’instructions
}while(conditions);
Les instructions sont exécutées jusqu’à ce que les conditions deviennent fausses ou tant
que les conditions sont vraies. Les instructions de la boucle sont exécutées au moins une fois.
• Structure for
Syntaxe :
for(initialisations; conditions; incrémentations){
//ensemble d’instructions
}
Les instructions sont répétées tant que les conditions sont vraies. Les conditions sont
évaluées avant chaque itération de la boucle. Les initialisations sont effectuées avant
d’entrer dans la boucle pour la première fois. Les incrémentations sont exécutées après
chaque itération de la boucle.
N.B. : − Les trois paramètres de la boucle for sont à l’intérieur de parenthèses et sont
———— séparés par des points-virgules.
——— − Chaque instruction de la boucle for est terminée par un point-virgule.
——— − L’accolade n’est pas nécessaire que s’il y a plus d’une instruction.
• Structure foreach
La boucle foreach (appelée for avancée) a été intégrée depuis Java 5. Cette boucle est
utilisée pour parcourir les tableaux ainsi que les collections d’objets.
Syntaxe :
for(type variable : tableau | collection){
//ensemble d’instructions
}
CHAPITRE 2. ÉLÉMENTS DE BASE DE JAVA 23
Exemple :
public class BoucleForeach {
public static void main(String[] args) {
String[] tabString = {‘‘Ali’’,‘‘Jamal’’,‘‘Meryam’’,‘‘Mohamed’’};
for(String s : tabString)
System.out.println(s);
}
}
Syntaxe :
nomEtiquette : {
//liste d’instructions;
}
En Java, une étiquette ne peut se trouver que juste avant une instruction itérative (ou
un switch). La raison de mettre une étiquette c’est lorsqu’on a l’intention de revenir au
bloc itératif (ou au switch).
• L’instruction break
L’instruction break termine une structure itérative (while, do while ou for) ou une
structure switch. L’instruction break termine directement la boucle en cours.
Syntaxe :
break [ nomEtiquette ];
Si l’instruction break est accompagnée d’une étiquette, c’est qu’il faut sortir de l’étiquette.
Le contrôle est alors passé à l’instruction qui suit l’instruction étiquetée.
CHAPITRE 2. ÉLÉMENTS DE BASE DE JAVA 24
Exemple :
• L’instruction continue
L’instruction continue ne peut être rencontrée que dans les instructions itératives.
L’instruction continue termine l’itération en cours : la boucle continue à s’exécuter avec
l’itération suivante.
Dans le cas des boucles while et do while, l’exécution reprend avec l’évaluation de la
condition de contrôle.
Syntaxe :
continue [ nomEtiquette ];
Exemple :
Exercice 2.1
Développer un programme qui permet de chercher 20 premiers entiers positifs qui sont
premiers. Un nombre est dit premier s’il n’est divisible que par 1 et lui-même.
• C = (L + K) mod 26
• L = (C − K) mod 26
Ainsi, dans un texte chiffré en français, si une lettre apparaı̂t aux environs des 16%,
nous pourrons assimiler cette lettre à un E ; et ainsi de suite avec les autres lettre du texte
chiffré.
Soit le texte chiffré par l’algorithme de César ci-dessous :
Ctot xlm ng etgztzx inkxfxgm hkbxgmx hucxm. Xg xyyxm, ng ikhzktffx Ctot xlm
utlx vhfiexmxfxgm lnk exl hucxml. Xqvximx exl mrixl wx whggxxl yhgwtfxgmtnq,
mhnm xlm hucxm.
Java est un langage de programmation orienté objet (POO). Il fallait dire que la prin-
cipale caractéristique du langage Java est qu’il a été conçu directement comme un langage
de POO. Cette spécificité permet une meilleure lisibilité des programmes (une plus grande
organisation des lignes de code).
3.2.1 Objet
L’objet est un groupement des valeurs des attributs. Il utilise les méthodes proposées
par sa classe pour manipuler ces attributs.
Exemple : Soit un compte c caractérisé par son numéro, propriétaire et solde. Pour
c, nous pouvons déposer ou retirer un montant donné et afficher son solde.
28
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 29
Un message est réalisé par l’exécution d’une méthode de la classe. Les paramètres du
message seront utilisés comme paramètres de la méthode lancée.
Exemple : Pour l’objet c du type Compte, soit un message m qui permet de déposer
un montant de 100 dirhams pour le profit de c. En effet, c est défini par un numéro de
compte égal à 2371113.
Après l’exécution du message m sur l’objet c, cet objet va changer d’état en modifiant
son solde.
3.2.3 Encapsulation
L’encapsulation est un regroupement d’attributs et de méthodes au sein d’un objet en
dissimulant ces attributs au monde extérieur.
Parmi les avantages de l’encapsulation :
− une meilleure modularité : la communication entre objets est assurée par les traitements
définis pour l’objet.
− une meilleure sécurité : certaines parties de l’objet sont inaccessibles.
− une simplicité apparente pour l’utilisateur : il n’y aura pas d’impacts pour l’utilisateur
de l’objet si le contenu de ce dernier a été changé.
Une classe représente un élément concret du monde réel (exemple : personne, rectangle,
etc). Les attributs d’une classe représentent ses caractéristiques (exemple : pour la classe
Personne, nous pourrons gérer les attributs nom, prenom, etc.) et les méthodes représentent
les opérations que nous pourrons effectuer sur les attributs (exemple : les informations
d’une personne peuvent être affichées, modifiées, etc.). La déclaration des attributs et des
méthodes peut apparaı̂tre dans n’importe quel ordre.
Les classes servent de moules pour créer directement des instances. L’instanciation est
la fabrication d’un objet particulier à partir d’une classe.
Un objet est alors une instance d’une classe.
Exemple : Pour la classe Compte, nous définirons les attributs numéro, propriétaire,
solde ainsi que les méthodes déposer, retirer et afficher.
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 31
3.2.6 Héritage
L’héritage est un principe propre à l’approche objet. Il permet de créer une nouvelle
classe à partir d’une classe existante.
Le nom d’héritage provient du fait que la classe dérivée (la classe nouvellement
créée) contient les attributs et les méthodes de sa classe mère (la classe dont elle dérive).
L’intérêt majeur de l’héritage est de pouvoir réutiliser ce qui a été déjà défini ( attributs
et méthodes) sans avoir besoin de le redéclarer. L’héritage est donc un mécanisme permet-
tant le partage des propriétés communes entre les classes tout en préservant leurs différences.
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 32
Avec ce moyen, la classe dérivée sera plus spécialisée par rapport à sa classe mère
par l’ajout de nouveaux attributs et méthodes. Nous créons alors une hiérarchie de classes
de plus en plus spécialisées.
a. Héritage simple
Il est possible de représenter, sous forme d’une hiérarchie de classes (parfois ap-
pelée arborescence de classes), la relation de parenté qui existe entre les différentes
classes. L’arborescence commence par une classe générale appelée superclasse (appelée
aussi classe de base, classe parent, classe anc^ etre ou classe mère). Puis, les classes
dérivées (appelées aussi classes filles ou sous-classes) deviennent de plus en plus
spécialisées.
Ainsi, nous pouvons exprimer la relation qui lie une classe dérivée et sa superclasse
par l’association ‘est un’ représentée par une flèche de la classe dérivée vers la classe
mère.
Exemple :
Pour la classe Personne, nous pouvons définir les attributs nom, prenom et age ainsi
que la méthode afficher. Nous pouvons aussi définir une autre classe Enseignant qui
a les mêmes caractéristiques que celles d’une personne auxquelles nous ajoutons les attri-
buts specialite et matiere enseignée. La classe Enseignant est donc une extension et
spécialisation de la classe Personne puisqu’elle réutilise le contenu de la classe Personne.
a. Héritage multiple
Certains langages orientés objets permettent de faire de l’héritage multiple. Ce qui
signifie qu’ils offrent la possibilité de faire hériter une classe de deux classes mères. Ainsi,
cette technique permet de regrouper au sein d’une seule et même classe des attributs et des
méthodes hérités de plusieurs classes mères.
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 33
Le langage Java ne permet pas ce type d’héritage multiple ; il le remplace par la notion
d’interface (chap. 5).
3.2.7 Polymorphisme
Littéralement, le polymorphisme désigne la possibilité à prendre plusieurs formes (comme
l’eau qui se trouve à l’état solide, liquide ou gazeux). Cette propriété se conjugue avec
l’héritage pour produire des liens entre les objets.
Syntaxe :
package nompaquetage;
Les classes qui font partie d’un paquetage particulier ont accès à toutes les autres classes
qui font partie du même paquetage.
Syntaxe :
package exemplecours;
public [abstract] class NomClass {
// [ liste des attributs ]
// [ liste des méthodes ]
}
Une classe regroupe des attributs et des méthodes qui manipulent ces attributs.
c. Les attributs
Java autorise la manipulation des attributs d’une classe avec des degrés de protection
appelés modes de protection. Avec les modes de protections, il s’agit d’autoriser les accès
aux attributs ou les refuser. Ces modes sont au nombre de quatre qui sont :
• private : un attribut privé n’est accessible que par les méthodes internes de la même
classe.
• public : un attribut publique est accessible par toute méthode de la même classe ou
d’une autre classe.
• protected : un attribut protégé n’est accessible que par les méthodes de la classe qui l’a
déclaré ou d’une classe dérivée, ou d’une autre classe du même paquetage.
• aucun : par défaut, si aucune protection n’est indiquée, l’attribut sera accessible par la
classe qui l’a déclaré et les autres classes du même paquetage.
Cette syntaxe sera expliquée en détail au fur et à mesure où nous avançons dans le cours.
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 35
package exemplecours;
public class Personne {
// attributs
private String nom;
private String prenom;
private int age;
// méthodes
}
Les attributs nom, prenom et age sont des attributs privés. Ils ne sont accessibles que
par les méthodes de la même classe. L’accès à ces attributs n’est pas permis ; il faut que
l’on fournisse les méthodes permettant de manipuler ces attributs privés.
d. Les méthodes
Les méthodes sont des opérations applicables sur les objets d’une classe. La définition
d’une méthode se fait en définissant le corps de la méthode à l’intérieur de la classe.
Une méthode est définie par un nom et des éventuels paramètres. Le type de retour
est soit void (si la méthode ne retourne aucun résultat), soit un type primitif ou une
référence vers un objet.
Comme les attributs d’une classe, les méthodes doivent être qualifiées d’un mode de
protection. Chaque mode agit sur le droit d’utilisation de la méthode. Ces modes sont les
suivants :
• private : indique qu’il s’agit d’une méthode interne à la classe. Seules les méthodes
de la même classe peuvent l’invoquer (ou l’appeler).
• public : indique qu’il n’y a pas restriction d’accès. La méthode est visible en dehors de
la classe : elle peut être appelée par n’importe quelle autre classe.
• protected : indique que l’invocation de la méthode est autorisée par toutes les méthodes
des classes dérivées et par toutes les méthodes des classes du même paquetage.
• aucun : si aucune protection n’est indiquée, la méthode pourra alors être invoquée par
les classes du même paquetage.
package exemplecours;
public class Personne {
// attributs
private String nom;
private String prenom;
private int age;
// méthodes
public void afficher() {
System.out.println(nom+","+prenom+","+age);
}
}
Exemple :
package exemplecours;
public class Personne {
// attributs
private String nom;
private String prenom;
private int age;
// méthodes
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 37
f. Le constructeur d’objets
Un constructeur est une méthode particulière qui est invoquée pour initialiser les attri-
buts d’une classe. Lorsqu’un nouvel objet est créé, Java lui alloue de la mémoire et initialise
ses attributs avec leurs valeurs par défaut. Puis, il appelle le constructeur associé à la classe
pour effectuer toutes les initialisations nécessaires.
Exemple :
package exemplecours;
public class Personne {
// Attributs
private String nom, prenom;
private int age;
// Constructeur sans paramètres
public Personne() {
nom = null;
prenom = null;
age = 20;
}
// Constructeur avec deux paramètres
public Personne(String n, String p) {
nom = n;
prenom = p;
age = 0;
}
// Constructeur avec trois paramètres
public Personne(String n, String p, int a) {
nom = n;
prenom = p;
age = a;
}
// Constructeur de copie
public Personne(Personne p) {
nom = p.nom;
prenom = p.prenom;
age = p.age;
}
public void afficher() {
System.out.println(nom+","+prenom+","+age);
}
}
la déclaration d’un objet ne crée pas l’objet, mais crée uniquement une variable qui
référence cet objet. Toutefois, il est nécessaire de créer l’objet dynamiquement en utilisant
le mot-clé new. L’opérateur new est l’opérateur d’instanciation (ou création) des objets. La
déclaration et la création d’un objet sont deux étapes distinctes.
Syntaxe :
− En Java, la création des objets figure dans la méthode main. Le fichier contenant la
main sera alors un programme de test pour tester la manipulation des objets créés.
− Un objet, déclaré avec l’opérateur final et qui référence un objet, ne peut pas
modifier sa référence vers un autre objet.
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 40
Exemple :
package exemplecours;
public class TestPersonne {
public static void main (String args [ ]) {
Personne p1;
p1 = new Personne ("Touil", "Abdelali",23);
final Personne p2 = new Personne ("ElMrabet", "Amine",25);
p2=p1; // erreur de compilation
}
}
Syntaxe :
nomObjet.nomMéthode([paramètres]);
Cet appel permet d’envoyer un message à l’objet utilisé pour exécuter la méthode
déclenchée sur les attributs de cet objet. Ceci entraı̂ne éventuellement des modifications
des valeurs des attributs de l’objet.
Exemple :
package exemplecours;
public class TestPersonne {
public static void main (String args [ ]) {
Personne p1;
p1 = new Personne ("Touil", "Abdelali",23);
Personne p2 = new Personne ("ElMrabet", "Amine",25);
p1.afficher();
p2.afficher();
}
}
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 41
il est logique d’écrire ces affectations en espérant que les membres gauches sont des attributs
de l’objet, et ceux de droite les paramètres du constructeur.
Au niveau de la compilation, ceci est acceptable. Mais au niveau de l’exécution, Java
n’est pas capable de distinguer entre ces identificateurs.
Il faut alors utiliser l’autoréférence this qui représente l’objet courant. Le constructeur
pourra alors être comme suit :
b. Définition
L’identificateur spécial this correspond à l’objet en cours de manipulation. Il est sou-
vent appelé la référence this ou autoréférence. Nous pourrons l’utiliser bien souvent
pour faire explicitement référence à l’instance de la classe courante.
Exemple:
//Premier constructeur
public Personne (String nom, String prenom, int age) {
this.nom=nom;
this.prenom=prenom;
this.age=age;
} //Deuxième constructeur
public Personne (String nom, String prenom) {
this (nom, prenom, 0);
//D’autres éventuels traitements
}
Syntaxe :
package exemplecours;
public class Personne {
// attributs
private String nom;
private String prenom;
private int age;
private static int nbPersonne=0;
// Constructeur
public Personne(String nom, String prenom, int age){
this.nom=nom;
this.prenom=prenom;
this.age=age;
nbPersonne++;
}
}
Nous utilisons, généralement, d’attributs de classe pour stocker une information qui ne
dépend pas d’une instance particulière de la classe.
Nous accédons aux attributs statiques de la même manière que pour les attributs de
l’instance.
Toutefois, bien que les attributs statiques existent dans la classe, indépendamment de
l’instance, il est toujours possible d’y accéder directement via la classe. Nous pouvons alors
utiliser le nom de la classe comme référence. Cette opération provoque la modification de
la valeur du membre statique dans n’importe quelle instance existante et dans les instances
qui seront éventuellement créées.
Exemple :
Personne.nbPersonne=19;
Nous pouvons ajouter le mot-clé static pour les constantes. Cette valeur sera utilisée
par toutes les instances de la classe.
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 44
Exemple : Pour la classe Personne, nous pouvons définir la constante NB MODULE MAX
qui représente le nombre des modules maximaux pour chaque étudiant par semestre
et qui sera fixé à 8.
package exemplecours;
public class Personne {
// attributs
//...
private static final int NB MODULE MAX=8;
//...
}
Syntaxe :
[private/public/protected] static void/type nomMethode([parametres]){
//Définition de la méthode
}
Une méthode de classe est une méthode qui n’implémente pas un message envoyé à un
objet, mais qui définit un comportement global au niveau de la classe. En particulier, il n’y
a pas d’objets qui déclenchent une méthode de classe. L’appel d’une méthode statique doit
alors se faire avec le nom de sa classe.
Syntaxe :
NomClasse.nomMethode([parametres]);
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 45
package exemplecours;
public class Personne {
// attributs
private String nom;
private String prenom;
private int age;
private static int nbPersonne=0;
// Constructeur
public Personne(String nom, String prenom, int age){
this.nom=nom;
this.prenom=prenom;
this.age=age;
nbPersonne++;
}
public static void afficherNbPersonne(){
System.out.println("le nombre de personnes est:"+nbPersonne);
}
}
package exemplecours;
public class TestPersonne {
public static void main (String args[]){
// ...
Personne.afficherNbPersonne();
}
}
L’accès aux valeurs d’un tableau se fait à l’aide d’un indice (du type entier), partant de
zéro jusqu’à la valeur nombre d’éléments diminués de un.
Les tableaux en Java sont des vrais objets. Un tableau est une instance d’une classe
tableau Java et possède un type correspondant dans le système de typage. Cela signifie que
pour utiliser un tableau comme un autre objet, nous devons déclarer en premier lieu une
variable du type approprié, puis nous utilisons l’opérateur new pour créer une instance.
a. Caractéristiques
En Java, les objets tableaux diffèrent des autres objets sur trois points :
• Java crée implicitement une classe spéciale tableau au moment de la déclaration d’une
nouvelle variable de type tableau.
• Java permet d’utiliser l’opérateur spécial [] pour accéder aux éléments du tableau.
• Java fournit une forme spéciale de l’opérateur new qui permet de construire une instance
d’un tableau en spécifiant sa taille avec la notation [].
b. Déclaration
Un objet de type tableau est caractérisé par un type de base suivi par des crochets vides
[]. Les crochets indiquent qu’il s’agit d’un tableau.
Dans chacun de ces cas, la taille du tableau n’est pas spécifiée, car il s’agit de déclarer
uniquement le type de l’objet. La déclaration permet uniquement de créer un objet de type
référence (initialisé par défaut à null) qui pourra référencer un tableau ultérieurement.
,→ Un tableau, déclaré avec l’opérateur final et qui contient un ensemble d’objets, ne peut
pas modifier son contenu.
c. Création et initialisation
Avec la déclaration d’un tableau, aucun espace mémoire n’est réservé. Il faut alors
réserver de l’espace mémoire nécessaire et signaler le nombre d’éléments que le tableau
contiendra. Ceci est fait avec l’opérateur new pour créer une instance du tableau. Après
new, il faut spécifier le type de base du tableau ainsi que sa taille entre des crochets. L’espace
mémoire sera alors contigu, et il ne sera plus question ensuite de modifier sa taille.
CHAPITRE 3. PROGRAMMATION ORIENTÉE OBJET 47
Syntaxe :
Cette écriture permet d’allouer l’espace nécessaire pour les éléments du tableau dont le
nombre est donné par la variable taille. Ensuite, les éléments du tableau sont initialisés
systématiquement par la valeur par défaut de leur type.
Nous pourrons déclarer et initialiser un tableau avec la même instruction comme suit :
Syntaxe :
Exemple :
Java permet l’utilisation des accolades {} pour créer un tableau et initialiser ses éléments
au moment de leur déclaration. Dans ce cas nous n’utilisons pas l’opérateur new, et la taille
du tableau sera déduite à partir du nombre d’éléments affectés au tableau.
Syntaxe :
Syntaxe :
nomTableau.length;
Exemple :
La manipulation d’un tableau Java peut être faite élément par élément (comme dans la
majorité des langages de programmation), ou en utilisant tout simplement la référence de
début du tableau.
package exemplecours;
public class Tableau {
public static void main (String args[]){
char [] t= new char[2];
t[0]= ‘K’;
t[1]= ‘M’;
System.out.print(t) ;
for(int i=0; i<t.length; i++);
System.out.print(t[i]) ;
}
}
Pour manipuler les éléments d’un tableau d’objets, on doit respecter les trois étapes
suivantes :
− déclaration du tableau à manipuler ;
− création du tableau avec l’opérateur new ;
− remplissage du tableau.
La déclaration de tels tableaux s’effectue en posant autant de crochets qu’il est nécessaire
à la suite de son type ou de son identificateur.
type[][]... nomTableau;
type nomTableau [][]...;
Syntaxe:
Exercice 3.1
Un point est caractérisé par les attributs abscisse, ordonnée et couleur. Les méthodes
qui peuvent être associées à un point sont :
− initialiser : pour initialiser les attributs d’un point par des valeurs données en pa-
ramètres.
− deplacer : pour déplacer un point.
− afficher : pour afficher les attributs d’un point.
1. Trouver un type approprié pour un point.
2. Implémenter les méthodes demandées.
3. Implémenter la classe TestPoint qui permet de tester les méthodes proposées.
Exercice 3.2
RSA est un cryptosystème asymétrique peut-être utilisé à la fois pour les signatures électroniques
et pour le chiffrement. Il tire sa sécurité de la difficulté de factoriser des grands nombres.
La génération des clés :
− Générer deux nombres premiers aléatoires distincts p et q.
− Calculer n = pq.
− Calculer φ(n) = (p − 1)(q − 1).
− Sélectionner un exposant public e tel que pgcd(e, φ(n)) = 1.
− Calculer d ≡ e−1 (mod φ(n)).
,→ La clé publique est : (n, e). La clé privée est : (n, d).
Le chiffrement : Soit un message m, tel que m < n et (n, e).
− Calculer c = me (mod n).
,→ Le message chiffré : c.
Le déchiffrement : c et (n, d).
− Calculer m = cd ( mod n).
,→ Le message clair : m.
Héritage et Polymorphisme
4.1 Héritage
4.1.1 Définition
L’héritage est une relation entre différentes classes permettant de définir de nouvelles
classes en se basant sur des classes existantes.
L’héritage est mis en œuvre par la construction de classes dérivées. Lorsqu’une classe B
hérite d’une classe A, nous disons que B est une classe dérivée (ou fille ou descendante)
de A. A est la superclasse (ou classe mère ou classe de base ou classe anc^ etre) de
B.
L’héritage est représenté par une flèche allant de la classe dérivée vers la classe
mère. Cette flèche indique que la classe fille hérite de la classe mère. Nous disons
que les deux classes sont reliées entre elles par un lien d’héritage ou une hiérarchie
d’héritage. La représentation schématique pourra être comme suit :
Nous aurons donc un objet du type classe mère contenu à l’intérieur d’un objet du
type classe fille.
Exemple : Un Etudiant est un cas particulier d’une Personne. Le digramme de classes
correspondant aux deux classes peut être le suivant :
52
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 53
Exemple : pour exprimer que la classe Etudiant hérite les propriétés de la classe
Personne, nous écrivons :
package exemplecours;
public class Etudiant extends Personne {
// Contenu de la classe Etudiant
}
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 54
Exemple :
package exemplecours;
public class Etudiant extends Personne {
// Attributs
private String filiere;
// Constructeur sans paramètres
public Etudiant() {
super(); // instruction facultative
filiere = "SMI";
}
//methodes
}
L’instruction super() n’est pas obligatoire car elle peut être implicite.
package exemplecours;
public class Etudiant extends Personne {
// Attributs
private String filiere;
// Constructeur avec paramètres
public Etudiant(String nom, String prenom, int age, String filiere)
{
super(nom, prenom, age);
this.filiere = filiere;
}
//methodes
}
Pour une classe fille, la génération automatique d’un constructeur par défaut n’est
possible que si la classe mère :
− dispose d’un constructeur sans paramètres.
− ou ne dispose aucun constructeur.
,→ Si la classe mère ne contient que des constructeurs avec paramètres, le compilateur
génère une erreur.
,→ Pour une méthode redéfinie, il est interdit d’avoir les mêmes paramètres avec un
type retourné des méthodes différentes pour éviter le risque d’ambiguı̈té.
,→ Une redéfinition ne doit pas modifier le comportement logique d’une méthode.
Elle peut éventuellement enrichir ce comportement, mais pas l’appauvrir.
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 56
a. Le mode privé
Un attribut privé déclaré dans une classe mère sera hérité dans le sens où il occu-
pera une zone mémoire chez toutes les instances de la classe dérivée. Toutefois, sa valeur
ne sera pas accessible aux méthodes de la classe fille.
Une méthode privée ne peut pas être redéfinie dans une classe fille. La classe
fille peut proposer une méthode portant le même nom et les mêmes paramètres, mais cette
méthode n’aura rien à voir avec la méthode privée de la classe mère.
b. Le mode publique
Les attributs publiques peuvent être hérités. Ils sont accessibles (uniquement par le
mot-clé super) directement par les méthodes de la classe dérivée.
Les méthodes publiques peuvent être héritées. De telles méthodes peuvent être redéfinies
dans la classe fille pour adapter leur comportement. Dans ce ces, si une méthode de la classe
fille désire invoquer la méthode de la classe mère, elle pourra le faire en utilisant le mot-clé
super.
c. Le mode protégé
Le mode protégé (appelé protected) autorise l’accès aux classes dérivées et du
m^
eme paquetage.
Les attributs et les méthodes protégés sont hérités, et sont accessibles par :
− les méthodes de toutes les classes dérivées ;
− et les méthodes de toutes les classes appartenant au même paquetage. En Java, nous
considérons que les classes du même paquetage sont vraiment des classes amies, au point
de faire partie de la même famille.
Une méthode protégée peut être redéfinie. Il est possible, au moment de sa redéfinition,
de modifier son mode de protection en passant du mode protégé au mode publique ; l’in-
verse n’est pas autorisé.
Exemple :
package exemplecours;
public class Personne {
private String nom, prenom;
private int age;
public Personne (String nom, String prenom, int age) {
this.nom = nom;
this.prenom = prenom;
this.age = age;
}
public void afficher () {
System.out.print(nom+","+prenom+","+age);
}
}
package exemplecours;
public class Etudiant extends Personne {
//...
public void afficher () {
super.afficher();
System.out.println(","+filiere);
}
}
package exemplecours;
public class Test {
public static void main (String args[]) {
Etudiant e = new Etudiant ("BOUROUA","Issam",21,"SMI");
e.afficher();
}
}
Syntaxe :
package nompaquetage;
public final class NomClasse {
// Contenu de la classe
}
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 59
4.2 Polymorphisme
4.2.1 Définition
Le nom polymorphisme vient du grec, ::::
appliqué sur un objet, signifie que cet objet
peut prendre plusieurs formes. Cette caractéristique est un des concepts essentiels de la
programmation orientée objet.
Alors que l’héritage concerne les classes, le polymorphisme est relatif aux méthodes
et objets.
Exemple : Soit la classe Somme qui permet de faire la somme de deux valeurs. Nous pou-
vons définir plusieurs méthodes appelées additionner effectuant une somme de valeurs sur
des différents types de paramètres :
package exemplecours;
public class Somme {
private int a, b;
private float x, y;
//Constructeurs
public int additionner(int a, int b) {
return a+b
}
public float additionner(float x, float y) {
return x+y
}
}
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 60
Nous appelons signature d’une méthode le nombre et le type des paramètres. C’est
donc la signature d’une méthode qui détermine laquelle des méthodes surchargées sera
appelée.
Si deux méthodes dans la hiérarchie ont le même nom, Java exécute la première méthode
trouvée en partant de la classe réelle de l’objet et en remontant dans la hiérarchie des classes.
Comme le lien vers la méthode à exécuter est déterminé dynamiquement, nous parlons
alors de liaison dynamique.
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 61
À la phase de compilation, le système vérifie que toutes les déclarations sont correctes.
Par contre, à la phase d’exécution, il vérifie l’instanciation.
Exemple : Si nous disposons d’une classe ClasseB qui hérite d’une classe ClasseA,
l’instruction ClasseA a = new ClasseB() permet de déclarer un objet a du type ClasseA,
mais qui référence un objet du type ClasseB. Avec ce cas d’exemple, nous avons deux effets :
− L’instruction a.afficher() ne sera considérée comme correcte que si ClasseA possède
la méthode afficher().
− Si ClasseA possède une méthode afficher() qui affiche ”A” et ClasseB possède une
méthode afficher() qui affiche ”B”, alors le résultat de l’instruction a.afficher() est
”B” malgré que a est déclaré du type ClasseA.
b. Le transtypage explicite
Le transtypage explicite consiste à convertir une référence d’objet d’une certaine classe
en une référence d’objet d’une autre classe. Ceci n’est possible que si les classes sont reliées
par un lien d’héritage.
Le transtypage explicite est utilisé lorsqu’une référence d’un objet contient une instance
d’une classe dérivée, il est nécessaire de forcer le type de la référence pour accéder aux
attributs et méthodes spécifiques à la classe dérivée. Si ce n’est pas fait, le compilateur ne
peut déterminer le type réel de l’instance, ce qui provoque une erreur de compilation.
Syntaxe :
(NomClasse) nomObjet;
Avec la condition où la classe réelle de nomObjet doit hériter de NomClasse, sinon une
exception ClassCastException est levée (chapitre 6).
package exemplecours;
public class Etudiant extends Personne {
// ...
public String getFiliere() {
return filiere;
}
}
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 62
package exemplecours;
public class Test {
public static void main (String args[]) {
//Ligne1
Personne e = new Etudiant ("AZARFAN","Ali",21,"SMI");
//Ligne2: erreur de compilation
System.out.println(e.getFiliere());
//Ligne3: transtypage explicite
System.out.println(((Etudiant)e).getFiliere());
}
}
Syntaxe :
nomObjet instanceof NomClasse
package exemplecours;
public class Test {
public static void main (String args[]){
Personne p = new Personne();
Etudiant e = new Etudiant ("BENSAID", "Mohamed", 21, "SMI");
if (e instanceof Personne)
System.out.println("L’étudiant e est une personne");
else
System.out.println("Erreur");
}
}
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 63
package exemplecours;
public class Test {
public static void main (String args[]){
Personne p = new Personne();
Enseignant pr = new Enseignant ("BENALLA", "Hicham", 30, "Info");
Etudiant e = new Etudiant ("EL KHAYATI", "Samira", 21, "SMI");
Personne [] tab = new Personne;
tab [0] = p;
tab [1] = pr;
tab [2] = e;
for (int i=0; i<tab.length; i++)
tab[i].afficher()
}
}
Dans ce cas d’exemple, la structure tab est dite polymorphe puisqu’elle manipule des objets
différents de la hiérarchie.
CHAPITRE 4. HÉRITAGE ET POLYMORPHISME 64
Exercice 4.1
Soit le diagramme de classes suivant :
Exercice 4.2
Soient les classes suivantes :
− Employe définie par les attributs nom, prénom, adresse, numéro CIN, matricule, date
d’embauche, salaire.
− EmployeAssure : un employé assuré se caractérise par les attributs numéro CNSS et date
d’inscription à la CNSS.
− EmployeNonAssure : c’est un employé non assuré.
Les attributs date d’embauche et date d’inscription à la CNSS sont du type Date.
Chaque classe possède le/les constructeurs (avec paramètres et/ou de copie) et la méthode
afficher().
Soit la classe Societe qui embauche des employés assurés et des employés non assurés.
Une société se caractérise par les attributs suivants : code, raison sociale et un tableau
d’employés recrutés.
Nous pouvons, pour une société afficher ses attributs, ajouter, rechercher et supprimer
des employés assurés et non assurés.
Java a supprimé la notion d’héritage multiple qui existe dans les notions de base de
l’orientée objet. Pour remplacer ce concept, Java propose les interfaces.
a. Méthode abstraite
Une méthode abstraite est une méthode qui n’a pas de corps d’instructions ; elle est
définie par son prototype seulement. Pour être acceptée par le compilateur, l’entête de cette
méthode doit comporter le mot-clé abstract.
Syntaxe:
public abstract type nomMethode ([parametres]);
L’avantage des méthodes abstraites est qu’elles peuvent déclarer un comportement glo-
bal (au niveau d’une classe mère) commun à un ensemble de classes dérivées dans une
hiérarchie d’héritage.
Une méthode non abstraite est dite concrète, elle contient le corps de sa définition.
b. Classe abstraite
Une classe peut être définie abstraite. Le mot-clé abstract, écrit avant le mot class,
annonce qu’il s’agit d’une classe abstraite.
Syntaxe:
package nompaquetage;
public abstract class NomClasse {
//Contenu de la classe
}
65
CHAPITRE 5. CLASSES ABSTRAITES ET INTERFACES 66
Si une classe qui contient au moins une méthode abstraite doit être alors définie abstraite.
Syntaxe:
package nompaquetage;
public abstract class NomClasse {
//...
public abstract type nomMethode1 ([parametres]);
public type nomMethode2 ([parametres]){
//Contenu de la méthode
}
}
,→ Une classe abstraite sert uniquement à définir un cadre général, c’est-à-dire à définir
l’ensemble des caractéristiques communes aux classes dérivées. Elle ne peut servir que de
classe mère pour une dérivation.
Exemple : Pour la classe Personne et ses dérivées, nous pourrons déclarer une méthode
abstraite calculer au niveau de la classe Personne et qui sera définie dans les classes
EnseignantPermanent et EnseignantContractuel selon les attributs de ces classes. Les
classes Personne et Enseignant restent alors abstraites puisqu’elles n’ont pas défini cette
méthode.
La méthode calculer permet de calculer le salaire d’enseignant. S’il s’agit d’un per-
manent, son salaire mensuel est égal au salaire de base auquel nous ajoutons le nombre
des heures supplémentaires multiplié par le prix d’une heure supplémentaire. S’il s’agit
d’un contractuel, son salaire correspond alors à la durée du contrat multipliée par le salaire
mensuel.
CHAPITRE 5. CLASSES ABSTRAITES ET INTERFACES 67
package exemplecours;
public abstract class Personne {
private String nom, prenom;
private int age;
public Personne (String nom, String prenom, int age){
this.nom=nom;
this.prenom=prenom;
this.age=age;
}
public abstract float calculer ();
public void afficher (){
System.out.print(nom+", "+prenom+", "+age) ;
}
}
La classe Personne contient la méthode calculer() qui est abstraite. La classe devient
alors abstraite.
package exemplecours;
public abstract class Enseignant extends Personne {
private String matiere;
public Enseignant (String nom, String prenom, int age, String
matiere){
super(nom, prenom, age);
this.matiere=matiere;
}
public void afficher (){
super.afficher ();
System.out.println(", "+matiere);
}
}
La classe Enseignant hérite de la classe Personne mais ne définit pas la méthode calculer() ;
elle reste alors abstraite.
CHAPITRE 5. CLASSES ABSTRAITES ET INTERFACES 68
package exemplecours;
public class EnseignantPermanent extends Enseignant {
private float salaireBase, prixHeureSupp;
private int nbHeureSupp;
public EnseignantPermanent (String nom, String prenom, int age,
String matiere, float salaireBase, float prixHeureSupp, int
nbHeureSupp){
super(nom, prenom, age, matiere);
this.salaireBase=salaireBase;
this.prixHeureSupp=prixHeureSupp;
this.nbHeureSupp=nbHeureSupp;
}
public float calculer (){
return salaireBase+(prixHeureSupp*nbHeureSupp);
}
public void afficher (){
super.afficher ();
System.out.println("Salaire de base "+salaireBase);
System.out.println(prixHeureSupp+" "+nbHeureSupp);
System.out.println("Montant mensuel à payer : "+ calculer ());
}
}
CHAPITRE 5. CLASSES ABSTRAITES ET INTERFACES 69
package exemplecours;
public class EnseignantContractuel extends Enseignant {
private int dureeContrat;
private float salaireMois;
public EnseignantContractuel (String nom, String prenom, int age,
String matiere, int dureeContrat, float salaireMois {
super(nom, prenom, age, matiere);
this.dureeContrat=dureeContrat;
this.salaireMois=salaireMois;
}
public float calculer (){
return dureeContrat*salaireMois;
}
public void afficher (){
super.afficher ();
System.out.println("Salaire de base "+salaireBase);
System.out.println(dureeContrat);
System.out.println("Montant total à payer : "+ calculer ());
}
}
package exemplecours;
public class Test {
public static void main (String args []){
//Personne et Enseignant sont abstraites: elles ne peuvent pas
e
^tre instanciées
EnseignantPermanent ep=new EnseignantPermanent ("Touil", "Ali",
31, "Informatique", 7000F, 4000F, 7);
ep.afficher();
EnseignantContractuel ec=new EnseignantContractuel ("ElMrabet",
"Amine", 33, "Informatique", 5, 6000F);
ec.afficher();
}
Syntaxe:
package nompaquetage;
interface NomInterface {
[liste des constantes;]
[liste de déclarations des méthodes;]
}
Le nom d’une interface doit respecter les mêmes conventions que celles d’une classe.
Une interface est par défaut abstraite et publique.
Les méthodes d’une interface sont par défaut publiques et abstraites.
Les constantes d’une interface sont par défaut publiques, statiques et finales.
Exemple:
package exemplecours;
interface Visualisation {
void afficher ();
}
Syntaxe:
package nompaquetage;
public class NomClasse implements NomInterface {
//Attributs de la classe
//Définition des méthodes déclarées dans l’interface
//Définition des méthodes de la classe
}
CHAPITRE 5. CLASSES ABSTRAITES ET INTERFACES 71
Une classe qui implémente une interface et ne définit pas toutes les méthodes de
cette interface, sera une classe abstraite.
L’implémentation d’une interface peut être représentée par une flèche interrompue,
comme suit :
package exemplecours;
public class Personne implements Visualisation {
private String nom, prenom;
private int age;
//Définition de la méthode de l’interface
public void afficher () {
System.out.println(nom+", "+prenom+", "+age);
}
//Définition des méthodes de la classe Personne
}
Syntaxe:
package nompaquetage;
public class NomClasse implements NomInterface1, NomInterface2, ... {
//Attibuts de la classe]
//Définition des méthodes déclarées dans toutes les interfaces
//Définition des méthodes de la classe
}
En Java, une classe ne peut hériter que d’une seule classe, mais une classe peut implémenter
plusieurs interfaces. C’est une solution pour simuler l’héritage multiple.
Si une classe implémente toutes les méthodes d’une interface, une instance de cette
classe peut être considérée et traitée comme un objet de type interface. Nous pourrons
alors lui appliquer l’opérateur instanceof pour vérifier qu’il représente une instance de
l’interface implémentée.
Exemple : pour l’exemple de la classe Personne et ses dérivées, nous pourrons utiliser
l’interface Visualisation pour afficher les informations des classes et l’interface Calcul
pour calculer les salaires des enseignants contractuels et permanents. Nous aurons les in-
terfaces et classes suivantes :
package exemplecours; package exemplecours;
interface Visualisation { interface Calcul {
void afficher (); float calculer ();
} }
package exemplecours;
public abstract class Personne implements Virtualisation, Calcul {
private String nom, prenom;
private int age;
public Personne (String nom, String prenom, int age) {
this.nom=nom;
this.prenom=prenom;
this.age=age;
}
public void afficher () {
System.out.print(nom+", "+prenom+", "+age) ;
}
}
CHAPITRE 5. CLASSES ABSTRAITES ET INTERFACES 73
package exemplecours;
public abstract class Enseignant extends Personne {
private String matiere;
public Enseignant (String nom, String prenom, int age, String
matiere){
super(nom, prenom, age);
this.matiere=matiere;
}
public void afficher (){
super.afficher ();
System.out.println(", "+matiere);
}
}
La classe Enseignant hérite de Personne mais n’a pas encore défini la méthode calculer
() ; elle reste alors abstraite.
package exemplecours;
public class EnseignantContractuel extends Enseignant {
private int dureeContrat;
private float salaireMois;
public EnseignantContractuel (String nom, String prenom, int age,
String matiere, int dureeContrat, float salaireMois {
super(nom, prenom, age, matiere);
this.dureeContrat=dureeContrat;
this.salaireMois=salaireMois;
}
public float calculer (){
return dureeContrat*salaireMois;
}
public void afficher (){
super.afficher ();
System.out.println(dureeContrat);
System.out.println(salaireMois);
}
}
package exemplecours;
public class Test {
public static void main (String args []){
Visualisation ec1 = new EnseignantContractuel ("ElMrabet",
"Amine", 33, "Informatique", 5, 6000F);
ec1.afficher();
Calcul ec2 = new EnseignantContractuel ("ElMrabet", "Amine",
33, "Informatique", 5, 6000F);
System.out.println("le salaire est: "+ec2.calculer());
//ou
EnseignantContractuel ec = new EnseignantContractuel
("ElMrabet", "Amine", 33, "Informatique", 5, 6000F);
ec.afficher();
System.out.println("le salaire est: "+ec.calculer());
}
}
Une classe qui implémente l’interface dérivée doit définir les méthodes des deux inter-
faces, sinon elle reste abstraite.
Une interface ne peut pas dériver d’une classe, seulement d’une autre interface.
CHAPITRE 5. CLASSES ABSTRAITES ET INTERFACES 76
Exercices d’application
Exercice 5.1
Soit le diagramme de classes suivant :
ElGamal est un cryptosystème asymétrique peut-être utilisé à la fois pour les signa-
tures électroniques et pour le chiffrement. Il tire sa sécurité de la difficulté de calculer des
logarithmes discrets.
La génération des clés :
− Choisir un nombre premier p.
− Générer le générateur g de groupe cyclique G d’ordre p.
− Choisir un nombre aléatoire x inférieur à p − 1.
− Calculer y = g x mod p.
,→ La clé publique est : (p, g, y). La clé privée est : (x).
Le chiffrement : Soit un message m, tel que m < p.
− Choisir un nombre aléatoire k inférieur à p − 1.
− Calculer c1 = g k mod p.
− Calculer c2 = m ∗ y k mod p.
,→ Le message chiffré : c = (c1 , c2 ).
Le déchiffrement :
(p−1)−x
− Calculer m = c2 ∗ c1 mod p.
,→ Le message clair : m.
Exercice 5.2
Soit le diagramme de classes suivant :
78
CHAPITRE 6. GESTION DES EXCEPTIONS 79
Lorsqu’une méthode, définie dans une classe de la hiérarchie, déclenche une ou plusieurs
exceptions, ceci permet de conserver une trace de la pile d’exécution au moment où la ou
les exceptions sont produites. La machine Java remonte la pile qui contient la suite des
invocations des méthodes jusqu’à atteindre une méthode qui capture cette exception. Si
aucune méthode capturant cette exception n’est trouvée, alors l’exécution s’arrête.
La classe Object est la super-classe de toutes les classes en Java. Elle permet de définir
un comportement global qui peut être exploité par n’importe quelle autre classe.
Les objets de la classe Error sont des erreurs relativement graves et une application
(qui n’est pas sensée de la capturer). De même, une application Java n’est pas sensée de
lancer ce type d’erreur.
Une application Java ne travaille généralement qu’avec des objets de la classe Exception.
Dans ce cas, il s’agit d’erreurs qu’une application est susceptible de lancer. Nous pouvons
créer des classes dérivées pour définir des exceptions propres à chaque application.
CHAPITRE 6. GESTION DES EXCEPTIONS 80
package exemplecours;
public class ErrorAge extends Exception {
public ErrorAge (String message) {
super (message);
}
}
Les raisons pour lesquelles nous préférerons créer une nouvelle classe dérivée de la classe
Exception sont les suivantes :
− Il est parfois utile de disposer d’informations complémentaires sur l’exception. La définition
d’une nouvelle classe permet alors de définir des attributs pour coder ces informations
complémentaires.
− Les exceptions sont filtrées en fonction de leur type pour assurer leur meilleure gestion.
Le choix d’une nouvelle classe permet de filtrer un type bien précis d’exception et non pas
toutes les exceptions de la classe Exception.
− Lorsque, pour chaque type d’exception, nous créons une nouvelle classe, la gestion des
exceptions est bien plus simple. Il n’est pas nécessaire de faire une étude de cas pour
déterminer quel est le type de l’exception.
Syntaxe :
//...
try {
// Instructions
}
[catch (typeException1 nomException1) {
// Traitement de l’exception n°1
}]
...
[catch (typeExceptionN nomExceptionN) {
// Traitement de l’exception n°N
}]
[finally {
// Traitement relatif au bloc finally
}]
− Le bloc try indique une instruction (ou un bloc d’instructions), susceptible de lever des
exceptions, débute.
− Le bloc catch indique le traitement pour un type particulier d’exceptions.
− Le bloc finally sert à définir un bloc de code à exécuter dans tous les cas (si exception
levée ou non).
Lorsque le programme rencontre une exception dans un bloc try , une exception est
instanciée puis lancée. L’interpréteur cherche un bloc catch à partir de l’endroit ou l’ex-
ception a été créée en cherchant vers le bas. S’il ne trouve aucun bloc catch, l’exception
est lancée dans le bloc de niveau supérieur, ainsi de suite jusqu’au bloc de la classe qui
par défaut enverra l’exception au bloc catch. Celui-ci émettra alors un message d’alerte
standard pour le type d’exception.
a. Le bloc try
Les exceptions levées par une méthode doivent être capturées par la méthode appelante.
Pour ce faire, nous devons encapsuler l’appel de la méthode dans un bloc try.
Les instructions du corps du bloc try sont exécutées jusqu’à la fin de ce bloc si aucune
exception n’est levée. Dans le cas contraire, le contrôle est transféré à l’un des blocs catch.
Un bloc try peut être suivi d’un ou plusieurs blocs catch. Si une exception est déclenchée
dans le code entouré de ces deux blocs, le premier bloc catch qui correspond le mieux au
type de l’exception sera exécutée.
Le gestionnaire d’exceptions peut aussi gérer des exceptions qui se produisent à l’intérieur
des méthodes qui sont appelées par une instruction entourée des blocs try et catch.
CHAPITRE 6. GESTION DES EXCEPTIONS 82
b. Le bloc catch
Le bloc try est suivi par les gestionnaires des exceptions et leurs traitements corres-
pondants dont chacun est annoncé par le bloc catch. Un seul gestionnaire par exception
est autorisé. Lorsqu’une exception est déclenchée dans un bloc try, le bloc catch du ges-
tionnaire d’exceptions (qui accepte un objet exception du type de celle déclenchée) sera
exécutée.
Le nombre de blocs catch est arbitraire et peut être nul. Si aucun bloc catch n’est
prévu pour traiter cette exception, le contrôle est transféré au bloc finally. S’il y a plus
d’un bloc catch, le premier bloc catch (dont le paramètre correspond au type de l’exception
déclenchée) est exécuté. Si l’exception ne correspond à aucun bloc catch, elle remontra à
celui qui a appelé la méthode pour être gérée. Sinon c’est le gestionnaire d’exceptions par
défaut qui s’en occupera en arrêtant le programme. Dans le cas où il n’y a pas eu d’exception
levée par aucune des instructions du bloc try, l’exécution du programme se poursuit après
de dernier bloc catch.
L’ordre des blocs catch est important : si la classe d’un catch dérive de celle d’un autre
catch, alors elle doit être placée devant cette dernière.
c. Le bloc finally
L’intérêt d’un tel bloc repose sur le fait que les instructions qu’il comporte sont toujours
exécutées, qu’une exception soit levée ou pas. Il permet donc de s’assurer par exemple qu’un
fichier ouvert dans le bloc try sera systématiquement refermé, quoi qu’il arrive, grâce au
bloc finally.
Si un bloc finally existe à la fin d’un bloc try, le contrôle est passé alors à cette
portion du code dans tous les cas suivants :
− fin normale du corps du bloc try.
− fin anormale du bloc try.
− sortie du corps du bloc try par un return ou un break.
Le code contenu dans un bloc finally ne peut être ignoré : il n’existe aucun moyen de
quitter un bloc try sans exécuter le bloc finally.
CHAPITRE 6. GESTION DES EXCEPTIONS 83
Exemple :
package exemplecours;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner clavier = new Scanner (System.in);
System.out.print ("a = ");
int a=clavier.nextInt();
System.out.print ("b = ");
int b=clavier.nextInt();
try {
System.out.println(a/b);
}
catch(ArithmeticException e) {
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
}
finally {
System.out.println("fin du programme");
}
}
}
a. L’instruction throws
Si une méthode est susceptible de lever une exception qui n’est pas à proximité de la
méthode origine de l’erreur, il faut alors adopter la propagation des exceptions. En
effet, cette méthode doit mentionner le type de l’exception dans son entête en utilisant le
mot-clé throws.
CHAPITRE 6. GESTION DES EXCEPTIONS 84
Syntaxe :
[private/public/protected] type nomMethode ([parametres]) throws
NomException {
// Instructions
}
Cette écriture signifie que la méthode nomMethode est susceptible de générer une ex-
ception de type NomException.
Lorsqu’une méthode lève plusieurs exceptions, elles seront séparées par des virgules dans
l’entête de la méthode.
Syntaxe :
[private/public/protected] type nomMethode ([parametres]) throws
NomException1, ..., NomExceptionN {
// Instructions
}
Les seules exceptions qu’il n’est pas nécessaire de préciser dans le bloc throws sont les
RuntimeException et Error et leurs dérivées.
b. L’instruction throw
Pour lever une exception, il faut utiliser la commande throw qui se traduit par création
d’une instance de la classe où réside cette exception.
package exemplecours;
public class Personne {
private String nom, prenom;
private int age;
public Personne(String nom, String prenom, int age) throws ErrorAge
{
this.nom = nom;
this.prenom = prenom;
if (age <= 0)
throw new ErrorAge("age doit etre > 0");
else
this.age = age;
}
}
CHAPITRE 6. GESTION DES EXCEPTIONS 85
package exemplecours;
public class ErrorAge extends Exception {
public ErrorAge (string message) {
super (message);
}
}
Si nous examinons les différents types d’exceptions qui peuvent être captées par le
gestionnaire d’exceptions, nous pourrons comprendre les problèmes liés à l’utilisation de
ses classes.
CHAPITRE 6. GESTION DES EXCEPTIONS 86
Classe : RuntimeException
ArithmeticException
Cause :division par zéro, dépassement de capacité d’un entier.
ArrayIndexOutOfBoundsException
Cause :utilisation d’un index du tableau erroné.
ArrayStoreException
Cause : tentative de mettre une valeur dans un tableau de type différent.
ClassCastException
Cause : utilisation du transtypage d’une classe donnée vers une classe dérivée.
IllegalArgumentException
Cause : si nous passons un paramètre qui n’est pas illégal pour une méthode.
IndexOutOfBoundsException
Cause : c’est la classe mère de la classe ArrayIndexOutOfBoundsException
NegativeArraySizeException
Cause : allocation d’un tableau de taille négative.
NullPointerException
Cause : utilisation d’une méthode ou une variable avec une variable qui
contient une référence objet à null.
NumberFormatException
Cause : essai de convertir une cha^ıne non valide en un nombre, ou inversement.
SecurityException
Cause : appel d’une méthode dont le traitement est interdit par les paramètres
de sécurité.
StringIndexOutOfBoundsException
Cause :accès à une position erronée dans une cha^ıne (index négatif ou supérieur
ou égal à la taille de la cha^
ıne).
Classe : Exception
ClassNotFoundException
Cause :générée par le chargeur de classes si un fichier ‘‘.class’’ n’est pas
trouvé au moment d’instanciation d’une classe.
DateFormatException
Cause :les données lues dans une cha^ıne ne sont pas dans un format correct.
IllegalAccessException
Cause : déclenchée par certaines méthodes de ‘‘java.lang.Class’’ lors de
l’instanciation d’une classe à partir de son nom, si la classe n’est pas
publique ou s’il n’y a pas de constructeurs publiques.
InstanciationException
Cause : tentative d’instancier une classe abstraite.
NoSuchMethodException
Cause : une méthode d’un objet ou d’une classe n’est pas trouvée.
RuntimeException
CHAPITRE 6. GESTION DES EXCEPTIONS 87
Exercice 6.1
Tester, corriger et expliquer le programme Java suivant :
Chapitre 7
L’API JDBC (Java data base connectivity) permet de programmer en Java l’accès
aux bases de données locales ou distantes.
Une base de données est constituée d’un ensemble d’informations organisé suivant l’un
des trois modèles suivants : en réseau, hiérarchique ou relationnel. Le dernier, le plus
répandu, consiste à représenter les informations de la base sous la forme d’une ou plu-
sieurs tables.
Une table n’est rien d’autre qu’un tableau a deux dimensions dont les lignes se
nomment des enregistrements et les colonnes des champs.
Pour qu’une application Java puisse accéder à une base de données, il suffit que le SGBDR
fournisse un pilote JDBC (ou driver JDBC).
Il s’agit d’un ensemble de classes Java qui vont permettre l’utilisation du SGDB, par le
biais de requêtes SQL. SQL (Structured Query Langage) est un langage d’exploitation de
bases de données très répandu fondé sur des requêtes (nous parlons aussi de demande ou
d’instruction), utilisant une syntaxe simple.
88
CHAPITRE 7. UTILISATION DE BASES DE DONNÉES AVEC JDBC 89
Cette requête permettra d’obtenir les valeurs des champs prenom et nom de tous les
enregistrements de la table etudiants.
import java.sql.*;
DriverManager :
Charger et configurer le driver de la base de données.
Connection :
Cette interface réalise la connexion et l’authentification à la
base de données.
Statement (et PreparedStatement hérite de l’interface Statement):
Contenir la requ^ete SQL et la transmettre à la base de données.
ResultSet :
Cette interface parcourt les informations retournées par la base
de données dans le cas d’une sélection de données.
jdbc:mysql://nomHote:port/nomDataBase
• nomHote : le nom de l’hôte sur lequel le serveur MySQL est installé. S’il est en place sur
la même machine que l’application Java exécutée, alors vous pouvez simplement spécifier
localhost. Cela peut également être une adresse IP comme 127.0.0.1.
• port : le port TCP/IP écouté par votre serveur MySQL. Par défaut, il s’agit du port
3306.
• nomDataBase : le nom de la base de données à laquelle vous souhaitez vous connecter.
Celle-ci fournit alors en résultat un objet du type ResultSet contenant les informations
sélectionnées.
La méthode executeQuery() est dédiée à la lecture de données via une requête de type
SELECT. Tandis que, la méthode executeUpdate()est réservée à l’exécution de requêtes
ayant un effet sur la base de données (écriture ou suppression), typiquement les requêtes
du type INSERT, UPDATE, DELETE, etc.
CHAPITRE 7. UTILISATION DE BASES DE DONNÉES AVEC JDBC 92
ResultSet result;
result = statement.executeQuery("SELECT prenom, nom FROM etudiant");
String prenom, nom;
while(result.next()){
prenom = result.getString(1);
nom = result.getString(2);
System.out.println(prenom + " " + nom);
}
connec.close();
− Notez que l’objet résultat (du type ResultSet) n’est plus accessible lorsque la connexion
est fermée.
− Les objets du type Statement et ResultSet disposent également de méthode close().
CHAPITRE 7. UTILISATION DE BASES DE DONNÉES AVEC JDBC 93
Exercice 8.1
Soit le programme Java suivant :
Exercice 8.2
Refaire l’exercice “Exercice 3.2 ” en utilisant des tables pour stocker les informations (les
comptes, ...) des clients.
Une fonction de hachage (MD5, SHA-1, SHA 256) cryptographique est une primitive
cryptographique qui transforme un message de taille arbitraire en un message de taille
fixe, appelé un condensé. Les fonctions de hachage cryptographiques sont employées pour
l’authentification, les signatures numériques et les codes d’authentification de messages.
Pour être utilisable en cryptographie, une fonction de hachage doit disposer de ces qualités :
• rapide à calculer (parce qu’elles sont fréquemment sollicitées).
• non réversible (chaque condensé peut provenir d’un très grand nombre de messages,
et seule la force brute peut générer un message qui conduit à un condensé donné).
CHAPITRE 7. UTILISATION DE BASES DE DONNÉES AVEC JDBC 94
Les collections
La collection en Java est un framework (cadre) qui fournit une architecture pour stocker
et manipuler un groupe d’objets.
Les collections Java peuvent réaliser toutes les opérations que vous effectuez sur des
données telles que la recherche, le tri, l’insertion, la manipulation et la suppression.
Le framework Java Collection fournit de nombreuses interfaces (Set, List, Queue, Deque)
et classes (ArrayList, Vector, LinkedList, PriorityQueue, HashSet, LinkedHashSet, Tree-
Set).
Iterator<T> iterator()
Certaines des méthodes de l’interface Collection sont : Boolean add (Object obj),
Boolean addAll (Collection c), void clear(), etc ; qui sont implémentées par toutes
les sous-classes de l’interface Collection.
Il existe plusieurs méthodes de l’interface List qui peuvent être utilisées pour insérer,
supprimer et accéder aux éléments de la liste.
Exemple :
import java.util.*;
public class TestArrayList {
public static void main(String[] args) {
// Création ArrayList
ArrayList<String> etudiant=new ArrayList<String>();
// Ajout d’un objet dans ArrayList
etudiant.add("Issam Seddik");
etudiant.add("Mohamed Chillou");
etudiant.add("Mohamed Fournan");
etudiant.add("Hassan Talhaoui");
etudiant.add("Samia Dadou");
etudiant.add("Rania El-Otmani");
etudiant.add("Siham Baallal");
etudiant.add("Omayma Nabil");
etudiant.add("Jouhayna Driouach");
etudiant.add("Manal Afkir");
etudiant.add("Saliha Abokar");
etudiant.add("Khadija Ousfya");
etudiant.add("Ikram Idrissi");
etudiant.add("Zayneb El Bercani");
etudiant.add("Hanae Aurag");
etudiant.add("Redouan Bayyay");
etudiant.add("Xxxxxx Yyyyyyyy");
for (int i=0; i<etudiant.size(); i++) {
System.out.println(etudiant.get(i));
}
etudiant.set(16, "anonymous anonymous");
// Parcours la liste via Iterator
Iterator itr=etudiant.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
etudiant.remove(16);
for (String e: etudiant) {
System.out.println(e);
}
System.out.println(etudiant) ;
}}
8.3.1 HashSet
La classe HashSet implémente l’interface Set. Elle représente la collection qui utilise une
table de hachage pour le stockage. Le hachage est utilisé pour stocker les éléments dans le
HashSet. Il contient des éléments uniques.
Exemple :
CHAPITRE 8. LES COLLECTIONS 99
import java.util.*;
public class TestHashSet {
public static void main(String[] args) {
// Création HashSet
Set<String> etudiant=new HashSet<String>();
// Ajout d’un objet dans HashSet
etudiant.add("Jamal Boussouf");
etudiant.add("Mohamed El Abdallaoui");
etudiant.add("Widad Boukadida");
etudiant.add("Zakaria Chamlal");
etudiant.add("Lamyae Azouagh");
etudiant.add("Chaymae Yahyati");
etudiant.add("Jamal Boussouf");
etudiant.add("Xxxx Xxxxxxxx");
// Parcours la liste via Iterator
Iterator itr=etudiant.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
etudiant.remove("Xxxx Xxxxxxxx");
for (String e: etudiant) {
System.out.println(e);
}
}}
https ://www.javatpoint.com/collections-in-java
Chapitre 9
Le mot-clé package spécifie de quel paquetage le code fait partie. Le code Java qui
fait partie d’un paquetage particulier a accès à toutes les classes qui font partie du même
paquetage.
La déclaration d’un paquetage se fait au début d’un fichier source comme suit :
Syntaxe :
package nompaquetage;
Syntaxe :
nompaquetage.NomClasse
Exemple :
package packagetest;
public class Test {
public static void main (String args[]){
//...
exemplecours.Personne p = new exemplecours.Personne();
p.afficher();
}
}
Cette démarche devient fastidieuse dès que nombreuses classes sont appelées.
Syntaxe :
import nompaquetage.NomClasse;
Exemple :
package packagetest;
import exemplecours.Personne;
public class Test {
public static void main (String args[]){
//...
Personne p = new Personne();
p.afficher();
}
}
Syntaxe :
import nompaquetage.*;
Si nous disposons de plusieurs classes ayant le même nom et appartenant à des paque-
tages différents, le nom du paquetage doit préfixer le nom de la classe pour distinguer entre
ces classes.
Syntaxe:
import java.util.Scanner;
// ...
Scanner sc = new Scanner(System.in);
Pour récupérer les données, il faut faire appel sur l’objet sc aux méthodes prédéfinies
suivantes :
package exemplecours;
import java.util.Scanner;
public class TestScanner {
public static void main (String args []){
Scanner sc = new Scanner (System.in);
String nom, prenom;
int age;
System.out.println("Saisir votre nom : ");
nom = sc.nextLine();
System.out.println("Saisir votre prénom : ");
prenom = sc.nextLine();
System.out.println("Saisir votre age : ");
age = sc.nextInt();
//...
}
}
Exemple :
double x, y=9;
x=Math.sqrt(y);
Quelques méthodes
Quelques méthodes
Pour afficher le contenu de l’objet en utilisant exactement le même code, Java fournit
une méthode, appelée toString(), qui retourne une représentation de l’instance sous forme
d’une String.
La méthode toString() est invoquée automatiquement par System.out.println.
package exemplecours;
public class Etudiant {
private String nom, prenom, filiere;
public Etudiant (String nom, String prenom, String filiere){
this.nom=nom;
this.prenom=prenom;
this.filiere=filiere;
}
public String toString (){
return ‘‘nom :’’+nom+‘‘prénom :’’+prenom+‘‘filière:’’+filiere;
}
}
package exemplecours;
public class Test {
public static void main (String args []){
Etudiant e = new Etudiant ("Azzouz", "Anissa", "SMI");
System.out.println(e);
}
}
Mini-projets
106