0% ont trouvé ce document utile (0 vote)
15 vues130 pages

Introduction à la Programmation Java

Transféré par

muhammadekramah786
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
15 vues130 pages

Introduction à la Programmation Java

Transféré par

muhammadekramah786
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Université Sultan Moulay Slimane Ecole Supérieure de Technologie

Béni Mellal
Département: ITG
Filière: DUT-GI-2- S3 Module: Génie Logiciel (M11-E2)
Année universitaire: 2023-2024 Elément: Prog. Orientée Objet: Java

Support de cours
Programmation Orientée objet : Java

Chapitre I: Programmation orientée objet


en Java 1

Pr. Siham BAKKOURI Email: [Link]@[Link]


Plan
❑ INTRODUCTION À JAVA
❑ LES BASES DE JAVA
❑ CONCEPTS DES CLASSES ET DES OBJETS
❑ HERITAGE ET POLYMORPHISME
❑ CLASSES ABSTRAITES ET INTERFACES
❑ GESTION DES EXCEPTIONS
❑ LES FLUX D’ENTRÉES/SORITES
❑ LES ENUMERATIONS
❑ LES COLLECTIONS D’OBJETS
❑ LA GÉNÉRICITÉ EN JAVA
❑ JAVA ET LA RÉFLEXIVITÉ

2
Introduction à Java

❑ Java est un langage de développement créé par Sun en 1995 puis racheté par Oracle en
2009 qui a réussi à obtenir une très grande notoriété en seulement quelques années grâce
à ses qualités.
❑ Java représente la synthèse des bons côtés de plusieurs langages de programmation
(notamment C++ et SmallTalk). J'apprécie sa portabilité, sa robustesse et la richesse de
ses API fournies en standard ou par des tiers commerciaux ou libre.
❑ On peut faire de nombreux types de programmes avec Java :
→ Des applications, sous forme de fenêtre ou de console
→ Des applets, qui sont des programmes Java incorporés à des pages Web
→ Des applications pour appareils mobiles, comme les smartphones, avec J2ME
(Java 2 Micro Edition)
→ Des sites web dynamiques, avec J2EE (Java 2 Enterprise Edition, maintenant
JEE) et bien d'autres : JMF (Java Media Framework), J3D pour la 3D. . .

Pr. S. BAKKOURI Programmation Orientée Objet: Java 3


Introduction à Java

→ Les différentes éditions et versions de Java

❑ Sun puis Oracle ont toujours fourni gratuitement un ensemble d'outils et d'API pour
permettre le développement de programmes avec Java. Ce kit, nommé JDK, est librement
téléchargeable sur le site web d'Oracle : [Link]
❑ Le JRE (Java Runtime Environment) contient uniquement l'environnement d'exécution
de programmes Java. Le JDK contient lui-même le JRE. Le JRE seul doit être installé sur
les machines où des applications Java doivent être exécutées.
❑ Trois plate-formes d'exécution (ou éditions) Java sont définies pour des cibles distinctes
selon les besoins des applications à développer :
→ Java Standard Edition (J2SE / Java SE) : environnement d'exécution et ensemble
complet d'API pour des applications de type desktop.
→ Java Enterprise Edition (J2EE / Java EE) : environnement d'exécution reposant
intégralement sur Java SE pour le développement d'applications d'entreprises
→ Java Micro Edition (J2ME / Java ME) : environnement d'exécution et API pour le
développement d'applications sur appareils mobiles.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 4


Introduction à Java

→ Les différentes éditions de Java

❑ Sun puis Oracle ont toujours fourni gratuitement un ensemble d'outils et d'API pour
permettre le développement de programmes avec Java. Ce kit, nommé JDK, est librement
téléchargeable sur le site web d'Oracle : [Link]
❑ Le JRE (Java Runtime Environment) contient uniquement l'environnement d'exécution
de programmes Java. Le JDK contient lui-même le JRE. Le JRE seul doit être installé sur
les machines où des applications Java doivent être exécutées.
❑ Trois plate-formes d'exécution (ou éditions) Java sont définies pour des cibles distinctes
selon les besoins des applications à développer :
→ Java Standard Edition (J2SE / Java SE) : environnement d'exécution et ensemble
complet d'API pour des applications de type desktop.
→ Java Enterprise Edition (J2EE / Java EE) : environnement d'exécution reposant
intégralement sur Java SE pour le développement d'applications d'entreprises
→ Java Micro Edition (J2ME / Java ME) : environnement d'exécution et API pour le
développement d'applications sur appareils mobiles.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 5


Introduction à Java

→ Les différentes éditions de Java

❑ La séparation en trois plateformes permet au développeur de mieux cibler


l'environnement d'exécution et de faire évoluer les plateformes de façon plus
indépendante.
❑ Avec différentes éditions, les types d'applications qui peuvent être développées en
Java sont nombreux et variés :
→ Applications desktop
→ Applications web : servlets/JSP, portlets, applets
→ Applications pour appareil mobile (MIDP) : midlets
→ Applications pour appareil embarqué (CDC) : Xlets
→ Applications pour carte à puce (Javacard) : applets Javacard
→ Applications temps réel

Pr. S. BAKKOURI Programmation Orientée Objet: Java 6


Introduction à Java

→ Les différentes versions de Java

Les versions majeures de Java : (1/2)

▪ Java 1.0 (23 janvier 1996) :** Première version publique de Java.
▪ Java 1.1 (19 février 1997) :** Ajout de classes internes, collections, et introduction de
Swing.
▪ Java 2 (J2SE 1.2) (8 décembre 1998) :** Renommage en Java 2, introduction du
compilateur JIT et de Swing.
▪ Java 2 (J2SE 1.3) (8 mai 2000) :** Améliorations de la performance et introduction de
JNDI.
▪ Java 2 (J2SE 1.4) (6 février 2002) :** Intégration de HotSpot, ajout de l'API Logging, et
améliorations de la sécurité.
▪ Java SE 5.0 (30 septembre 2004) :** Intégration de generics, énumérations, et boucle
for-each.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 7


Introduction à Java

→ Les différentes versions de Java

Les versions majeures de Java : (2/2)

▪ Java SE 6 (11 décembre 2006): Intégration de HotSpot, gestion automatique des


ressources.
▪ Java SE 7 (28 juillet 2011) : Introduction des expressions lambda et améliorations de la
gestion des exceptions.
▪ Java SE 8 (18 mars 2014) : Introduction de JPMS, expressions lambda, API Stream, et
[Link].
▪ Java SE 9 (21 septembre 2017) : Intégration de JShell et projet Jigsaw pour les modules.
▪ Java SE 11 (25 septembre 2018) : Version LTS avec améliorations de la performance et
introduction de l'API HTTP Client.
▪ Java SE 12-17 (2019 - 2021) : Versions successives avec des améliorations continues.
▪ Java SE 18-21 (2022 - 2023) : Versions successives avec des améliorations continues.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 8


Les bases de java

→ Java : Un langage de programmation

Java se distingue en tant que langage de programmation grâce à ses caractéristiques


avantageuses:
❑ Simplicité et productivité:
→ Intégration complète de l'orientation objet
→ Gestion automatique de la mémoire grâce au "Garbage collector".
❑ Robustesse, fiabilité et sécurité
❑ Indépendance par rapport aux plateformes
❑ Ouverture:
→ Intégration native d'Internet.
→ Connexion transparente aux bases de données via JDBC (Java DataBase Connectivity ).
→ Prise en charge des caractères internationaux.
❑ Distribution et aspects dynamiques
❑ Performance

Pr. S. BAKKOURI Programmation Orientée Objet: Java 9


Les bases de java

→ Java : Une plateforme

Java en tant que Plateforme


❑ L'Interface de Programmation Applicative (API) de Java est structurée en bibliothèques
(packages).
❑ Ces packages regroupent des ensembles fonctionnels de composants (classes).
❑ Le cœur (core) de l'API Java, inclus dans toute implémentation complète de la
plateforme Java, comprend notamment :
o Essentials (types de données, objets, chaînes de caractères, tableaux, vecteurs, E/S,
date, etc.)
o Applet
o Abstract Windowing Toolkit (AWT)
o Basic Networking (URL, Socket - TCP ou UDP -, IP)
o Evolved Networking (Remote Method Invocation)
o Internationalization
o Sécurité ... .
Pr. S. BAKKOURI Programmation Orientée Objet: Java 10
Introduction à Java

→ Essentiel du Développement Java : JVM


❑ Java est effectivement un langage de programmation compilé. On peut identifier trois
grandes phases dans le cycle de vie d'un programme Java :
• Phase d'écriture du code source
• Phase de compilation : cette étape implique la conversion du code source Java en
code intermédiaire appelé bytecode. Cela se fait à l'aide du compilateur Java.
• Phase d'exécution : lors de cette phase, le bytecode est interprété et exécuté par
une machine virtuelle Java (JVM).
❑ Contrairement à certains autres langages compilés tels que le C ou le C++, le résultat
de la compilation en Java n'est pas directement utilisable par l'ordinateur cible → La
particularité de Java réside dans l'utilisation de la machine virtuelle.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 11


Introduction à Java

→ Essentiel du Développement Java: JVM

❑ Après la compilation, le bytecode généré n'est pas directement converti en langage


machine spécifique à l'ordinateur cible. Au lieu de cela, la JVM intervient pour
interpréter et exécuter le bytecode, assurant ainsi la portabilité du code Java sur
différentes plates-formes.
❑ En résumé, Java utilise une approche compilée avec une machine virtuelle, ce qui
offre à la fois la portabilité du code et la possibilité de l'exécuter sur divers
environnements sans nécessiter une compilation spécifique pour chaque système cible.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 12


Introduction à Java

→ Essentiel du Développement Java: JVM

Pr. S. BAKKOURI Programmation Orientée Objet: Java 13


Introduction à Java

→ JVM, JRE et JDK


❑ Pour garantir la portabilité des programmes Java sur divers systèmes d'exploitation, la
machine virtuelle Java (JVM) joue un rôle crucial. Pendant la compilation du code
source, celui-ci est transformé en bytecode, un langage intermédiaire interprétable
uniquement par la JVM.

❑ Le JRE (Java Runtime Environment) englobe la JVM,


permettant ainsi l'exécution des applications Java sans
se soucier des détails liés à un OS particulier.
❑ Pour simplifier le développement, l'utilisation d'un IDE
(Integrated Development Environment) est
recommandée, nécessitant l'installation du JRE.
➔ En résumé, le JDK (Java Development Kit) est
nécessaire pour développer des programmes Java, la JVM
les exécute, et le JRE fournit l'environnement d'exécution,
permettant ainsi une portabilité aisée sur différents
systèmes d'exploitation.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 14


Introduction à Java

→ JVM, JRE et JDK

→ Les utilitaires Java


❑ Javac : Compilateur, traduit fichier source .java en fichier bytecode .class
❑ Java : Interpréteur java, lance des programmes
❑ Javadoc : Générateur de documentation d’API
❑ Jar : Utilitaire d’archivage et de compression

Pr. S. BAKKOURI Programmation Orientée Objet: Java 15


Introduction à Java

→ Développer une application Java

❑ Deux façons d’écrire des programmes Java:


1. En écrivant le code dans un simple éditeur de texte
→ Compilation et exécution du code en ligne de commande (DOS)
2. En utilisant un environnement de développement (IDE)
→ Eclipse (Télécharger )
→ Netbeans (Télécharger )
→ Microsoft .Net Studio
→ BlueJ
→ JDeveloper…..

Pr. S. BAKKOURI Programmation Orientée Objet: Java 16


Les bases de java

→ Les types de variables


❑ Une déclaration de variable se fait comme ceci :

<Type de la variable> <Nom de la variable> ;


❑ En Java, nous avons deux types de variables :
• Des variables de type simple ou primitif : elles stockent directement des valeurs
comme des nombres entiers, des nombres à virgule flottante, des booléens ou des
caractères.
• Des variables de type complexe ou des objets (ou types de données de référence) :
elles stockent des références vers des objets en mémoire plutôt que les objets eux-
mêmes. Elles incluent les classes, les interfaces, les tableaux…

→ Variable de type primitif → Variable de type objet

Pr. S. BAKKOURI Programmation Orientée Objet: Java 17


Les bases de java

→ Les types de variables

Pr. S. BAKKOURI Programmation Orientée Objet: Java 18


Les bases de java

→ Les types de variables

▪ Les variables de type simple/Primitifs

Pr. S. BAKKOURI Programmation Orientée Objet: Java 19


Les bases de java

→ Les types de variables

Exemple

int nombre;
String chaine;
float nbrfloat;
int entier = 32; String commence par une majuscule, et lors de
float pi = 3.1416f; l'initialisation, on utilise des guillemets doubles ( " " ).
char carac = 'z';
String mot = new String("Coucou");
int nbre1 = 2, nbre2 = 3, nbre3 = 0;

Pr. S. BAKKOURI Programmation Orientée Objet: Java 20


Les bases de java

→ Les opérateurs arithmétiques

• + : permet d'additionner deux variables numériques (mais aussi de concaténer des


chaînes de caractères ! Ne vous inquiétez pas, on aura l'occasion d'y revenir).
• - : permet de soustraire deux variables numériques.
• * : permet de multiplier deux variables numériques.
• / : permet de diviser deux variables numériques (mais je crois que vous aviez deviné).
• % : permet de renvoyer le reste de la division entière de deux variables de type
numérique ; cet opérateur s'appelle le modulo.

Exemple

nbre2 = nbre2 * 2; nbre1 = nbre1 + 1;


nbre3 = nbre2; nbre1 += 1;
nbre3 = nbre3 / nbre3; nbre1++;
nbre1 = nbre1 - 1; ++nbre1;

Pr. S. BAKKOURI Programmation Orientée Objet: Java 21


Les bases de java

→ Les conversions, ou cast

Les conversions, ou "casts" en Java, consistent à changer le type d'une variable d'une
forme à une autre. On distingue deux types principaux de conversions :

❑ Conversion implicite (ou widening) : Se produit automatiquement lorsque le type de


données de petite taille est assigné à un type de données de plus grande taille. Il n'y a
généralement pas de perte de données.

❑ Conversion explicite (ou narrowing) : Nécessite une intervention du programmeur


pour convertir un type de données de grande taille en un type de données plus petit.
Cela peut entraîner une perte de données, et une syntaxe spécifique est utilisée,
appelée "cast".

Pr. S. BAKKOURI Programmation Orientée Objet: Java 22


Les bases de java

→ Les conversions, ou cast

Exemple

// Conversion implicite (widening)

int entier = 42;

long longEntier = entier; // Pas besoin de cast, conversion implicite

// Conversion explicite (narrowing)

double reel = 3.14;

int entierArrondi = (int) reel; // Besoin d'un cast pour la conversion explicite

// Attention : perte de précision lors de la conversion

Pr. S. BAKKOURI Programmation Orientée Objet: Java 23


Les bases de java

→ Ecrire/ afficher un message sur la console

En Java, l'écriture dans la console est généralement réalisée à l'aide de la classe


[Link]

• [Link] : utilisé pour afficher du texte sans saut de ligne.

Exemple

• [Link] : utilisé pour afficher du texte avec un saut de ligne.

Exemple

Pr. S. BAKKOURI Programmation Orientée Objet: Java 24


Les bases de java

→ Lire les entrées clavier

• La classe Scanner

❑ Pour permettre à Java de lire l'entrée clavier, on utilise un objet de type Scanner. Cet
objet peut être configuré avec différents paramètres.

❑ Avant de lire l'entrée clavier, nous devons instancier un objet Scanner.

Exemple

Dans cet exemple, nous utilisons celui qui correspond à l'entrée standard de Java, [Link]
et importer la classe Scanner depuis le package [Link]

import [Link];

Scanner sc = new Scanner([Link]);

Pr. S. BAKKOURI Programmation Orientée Objet: Java 25


Les bases de java

→ Lire les entrées clavier


Avant de lire l'entrée clavier, nous devons instancier un objet Scanner. Voici un exemple
simple dans la méthode main d'une nouvelle classe :

la méthode nextLine() pour lire une ligne de


texte entrée par l'utilisateur.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 26


Les bases de java

→ Lire les entrées clavier

De façon générale, dites-vous que pour récupérer un type de variable, il vous suffit
d'appeler :
next<Type de variable commençant par une majuscule>
Exemple

Attention: il y a un type de variables primitives qui n'est pas pris en compte par la classe
Scanner : il s'agit du type char.
Voici comment on pourrait récupérer un caractère :

Pr. S. BAKKOURI Programmation Orientée Objet: Java 27


Les bases de java

→ Les conditions

• La structure if... else


Pour créer et évaluer des conditions en Java, nous utilisons des opérateurs logiques tels que:
• == : permet de tester l'égalité.
• != : permet de tester l'inégalité.
• < : strictement inférieur.
• <= : inférieur ou égal.
• > : strictement supérieur.
• >= : supérieur ou égal.
• && : l'opérateur et. Il permet de préciser une condition.
• || : le ou. Même combat que le précédent.
• ? : : l'opérateur ternaire.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 28


Les bases de java

→ Les conditions

❑ Exemple 1

❑ Exemple 2

Pr. S. BAKKOURI Programmation Orientée Objet: Java 29


Les bases de java

→ Les conditions

❑ La structure switch - case


Le switch-case en Java est une structure de contrôle qui permet d'évaluer une expression et
d'exécuter des blocs de code en fonction de la valeur de cette expression.

Syntaxe

Pr. S. BAKKOURI Programmation Orientée Objet: Java 30


Les bases de java

→ Les conditions

❑ La condition ternaire
La condition ternaire, également connue sous le nom d'opérateur ternaire, est une
expression concise qui permet de prendre une décision basée sur une condition.
Syntaxe
variable = (condition) ? valeurSiVrai : valeurSiFaux;

→ Si la condition est vraie, la variable prend la valeur "valeurSiVrai".


→ Si la condition est fausse, la variable prend la valeur "valeurSiFaux".

Exemple

Pr. S. BAKKOURI Programmation Orientée Objet: Java 31


Les bases de java

→ Les boucles

❑ La boucle while : utilisée lorsque la condition de répétition est vérifiée avant


l'exécution du bloc.

❑ La boucle do-while : similaire à while, mais garantit au moins une


exécution du bloc de code.

❑ La boucle for : utilisée lorsque le nombre d'itérations est connu à l'avance.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 32


Les bases de java

→ Les tableaux

En Java, un tableau est une structure de données qui permet de stocker des éléments de
même type de manière contiguë. Voici un aperçu succinct des tableaux en Java :
Syntaxe

<type du tableau> <nom du tableau> [] = { <contenu du tableau>};

Ou <nom du tableau> = new <type du tableau>[taille du tableau];

❑ Exemple 1

❑ Exemple 2

Pr. S. BAKKOURI Programmation Orientée Objet: Java 33


Les bases de java

→ Les tableaux

❑ Les tableaux multidimensionnels

Exemple 1

Pr. S. BAKKOURI Programmation Orientée Objet: Java 34


Les bases de java

→ Les tableaux

❑ Les tableaux multidimensionnels

Exemple 2

« matrice » est une référence vers un tableau


int[][] matrice = new int[3][]; contenant lui-même 3 tableaux de taille non
définie

matrice[0] = new int[4];


matrice[1] = new int[5];
Le premier élément de la matrice est une
matrice[2] = new int[3]; référence vers un tableau de 4 entiers,…

matrice[0][0] = 25;
Le premier élément du premier tableau de la
matrice est un entier de valeur 25

Pr. S. BAKKOURI Programmation Orientée Objet: Java 35


Les bases de java

Exercice 1
Écrivez un programme Java qui prend un nombre entier en entrée et vérifie s'il est pair ou
impair. Affichez le résultat.
Exercice 2
Écrivez une calculatrice en Java qui offre un menu avec des opérations telles que
l'addition, la soustraction, la multiplication et la division. Le programme doit prendre
deux nombres en entrée, effectuer l'opération sélectionnée, puis afficher le résultat.
Exercice 3
Écrivez un programme Java qui prend en entrée un tableau d'entiers et un nombre cible.
Le programme doit déterminer si le nombre cible est présent dans le tableau et afficher
l'index s'il est trouvé.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 36


Concepts des classes et des objets

→ Objets et Classes
❑ Un objet se définit par ses états (on peut aussi parler de ses caractéristiques) et
son comportement.
Exemple d’un objet voiture
Etats Comportements
marque accélérer
modèle passer rapport supérieur
cylindrée passer rapport inférieur
quantité d’essence tourner volant
niveau d’huile ouvrir porte
pression des pneus fermer porte
nombre de tours freiner

❑ Une classe est un plan ou un moule pour fabriquer des objets.


→ les états d’un objet vont être représentés par des variables
→ les comportements d’un objet seront représentés par des méthodes.
❑ Un objet est une instance d’une classe.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 37


Concept des classes et des objets

→ Objets et Classes

❑ Une classe est un type abstrait caractérisé par des propriétés (attributs et méthodes)
communes à un ensemble d’objets et permettant de créer des objets ayant ces propriétés.
❑ Un objet ou une instance de classe possède un comportement et un état qui ne peut être
modifié que par les actions du comportement.

On peut créer une classe Personnage car tous les personnages partagent les
mêmes caractéristiques. Lorsqu’on veut créer un personnage, on instancie la
classe Personnage.

Par convention en Java, le nom d'une classe commence toujours par une
MAJUSCULE, tandis que le nom des autres éléments (méthodes,
variables, etc.) commence par une minuscule.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 38


Concept des classes et des objets

→ La bibliothèque de classes Java

❑ Java possède une vaste bibliothèque de classes. Cette bibliothèque est structurée en
différents packages et sous-packages.
→ Documentation Java
Toutes ces classes sont organisées en packages (ou bibliothèques) dédiés à un thème précis.
Parmi les packages les plus utilisés, on peut citer les suivants :

Package Description
[Link] Classes graphiques et de gestion d’interfaces
[Link] Gestion des entrées/sorties
[Link] Classes de base (importé par défaut)
[Link] Classes utilitaires
[Link] Autres classes graphiques

Pr. S. BAKKOURI Programmation Orientée Objet: Java 39


Concept des classes et des objets

→ La bibliothèque de classes Java

❑ Par exemple, le package [Link] regroupe des classes fondamentales du langage


Java. On y trouve également une classe dédiée à la manipulation des chaînes de
caractères, appelée String.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 40


Concepts des classes et des objets

→ Attributs et variables de classe

❑ Variables d’instance ou attributs : ces variables définissent les caractéristiques de


l’objet.
→ initialisation optionnelle.
• Accès : <nom objet>.<nom attribut>
• Exemple : [Link]
❑ Variables de classe : ces variables sont communes à toutes les instances de la classe,
→ déclaration avec le mot clé static
→ initialisation obligatoire
• accès : <nom de classe>.<nom variable de classe>
• Exemple : Float.MAX_VALUE

Remarque: Classe Float pour encapsuler un nombre flottant float.


Variables de classes : MAX_VALUE, MAX_EXPONENT, NaN, etc.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 41


Concepts des classes et des objets

→ Méthodes d’instance et méthodes de classe

❑ Méthode d’instance : ces méthodes permettent de modifier ou d’accéder à l’état de


l’objet.
❑ Méthode de classe : ces méthodes ne modifient pas l’état interne d’un objet.
Exemple
• la classe Float
→ Méthode d’instance: String toString(): retourne une représentation en chaîne de
caractères de l’objet courant
→ Méthode de classe: static String toString(Float f): retourne une représentation en
chaîne de caractères du float passé en paramètre

Float f;
[Link]([Link]());
[Link]([Link](3.1419));

Pr. S. BAKKOURI Programmation Orientée Objet: Java 42


Concepts des classes et des objets

→ Les modificateurs d’accès

Les comportements et états d'un objet peuvent être définis par la visibilité de leurs
membres :
• Public (public) : Les membres déclarés comme publics sont accessibles depuis
n'importe quelle classe. Ils forment l'interface publique de la classe et peuvent être
utilisés par d'autres classes.
• Privé (private) : Les membres déclarés comme privés ne sont accessibles qu'à
l'intérieur de la classe où ils sont définis. Ils ne peuvent pas être utilisés ou modifiés
depuis l'extérieur de la classe.
• Protégé (protected) : Les membres protégés sont accessibles dans le même paquet
(package) ainsi que par les sous-classes, même si elles sont situées dans un autre
paquet.
• Sans modificateur / par défaut (parfois appelé "package-private") : L'absence de
modificateur signifie que le membre est accessible uniquement dans le même paquet
(package). Cela permet de limiter la visibilité aux classes du même package.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 43


Concepts des classes et des objets

→ Les modificateurs d’accès

• Autorisations d’accès

public protected défaut private

Dans la même classe Oui Oui Oui Oui

Dans une classe du même package Oui Oui Oui Non

Dans une sous-classe d’un autre


Oui Oui Non Non
package

Dans une classe quelconque d’un


Oui Non Non Non
autre package

Pr. S. BAKKOURI Programmation Orientée Objet: Java 44


Concepts des classes et des objets

→ Les constructeurs

En programmation orientée objet, un constructeur est une méthode spéciale appelée


lorsqu'un objet est instancié. Son rôle principal est d'initialiser les membres de l'objet et
de préparer l'objet à être utilisé.. Ils sont caractérisés par :
• Nom et Signature : Un constructeur porte le même nom que la classe à laquelle il
appartient. Il n'a pas de type de retour défini.
• Appel par Défaut : Un constructeur sans arguments est appelé "constructeur par
défaut". Il est automatiquement appelé lorsqu'un objet est créé sans spécifier
d'arguments.
→ On appelle constructeur par défaut le constructeur sans arguments :

Pr. S. BAKKOURI Programmation Orientée Objet: Java 45


Concepts des classes et des objets

→ Les constructeurs

• Surcharge de Constructeurs
La surcharge de constructeurs permet de définir plusieurs constructeurs pour une
classe, chacun ayant une liste différente de paramètres. Cela offre une flexibilité lors
de la création d'objets de la classe.
Exemple Signature d’un constructeur
• Modificateur d’accès (en
général public)
• Pas de type de retour
• Le même nom que la classe
• Les arguments sont utilisés
pour initialiser les variables
de la classe

Pr. S. BAKKOURI Programmation Orientée Objet: Java 46


Concepts des classes et des objets

→ Création d'une instance d’objet

• Déclaration : comme pour les types primitifs :


<Nom de la classe> <nom objet>;
• Création/initialisation à l’aide du mot clé new et appel du constructeur :
new <Nom de classe>(<liste d’arguments>);
• Comme pour les types primitifs, on peut déclarer et initialiser plusieurs objets
du même type en même temps.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 47


Concepts des classes et des objets

→ Création d'une instance d’objet

Exemple

Pr. S. BAKKOURI Programmation Orientée Objet: Java 48


Concepts des classes et des objets

→ Destruction d’un objet

• La destruction des objets est prise en charge par Java à l’aide d’un “Garbage Collector”
(GC).

• Le GC détruit les objets (i.e. efface la mémoire) qui ne sont référencés par aucun autre
objet.

• Les destructions sont asynchrones et il n’y a pas de garanties que les objets soient
détruits.

• Une méthode optionnelle nommée finalize() est appelée lorsque l’objet est détruit. Elle
peut par exemple s’assurer que des fichiers ou des connexions sont bien fermées avant la
destruction de l’objet.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 49


Concepts des classes et des objets

→ Accesseurs et mutateurs

Exemple:
o Un accesseur est une
méthode qui permet
d'accéder aux variables de
nos objets en lecture.
o Un mutateur, quant à lui,
permet de modifier ces
variables.
o Les accesseurs vous
permettent d'afficher les
valeurs des variables de
vos objets, tandis que les
mutateurs vous autorisent
à les modifier.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 50


Concepts des classes et des objets

→ Accesseurs et mutateurs

❑ Les accesseurs sont des méthodes et sont déclarés public afin d'être accessibles depuis
d'autres classes, comme depuis la méthode main.
❑ Les mutateurs sont déclarés avec le type void. en effet, ces méthodes ne retournent
aucune valeur, elles se contentent de mettre à jour les variables de la classe.
❑ Les accesseurs sont nommés en commençant par "get" et les mutateurs par "set",
conformément à la convention de nommage standard. On se réfère souvent à eux en
utilisant les termes "Getters" et "Setters".

→ L'utilisation de this en Java à l'intérieur des méthodes peut être employée pour
référencer les attributs de l'objet courant.
Par exemple, [Link] ferait référence à l'attribut nom de l'objet actuel à l'intérieur d'une
méthode de la classe ➔ Cela est particulièrement utile pour éviter les ambiguïtés
lorsqu'un nom de variable local est similaire au nom d'un attribut de la classe.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 51


Concepts des classes et des objets

→ Principe d’encapsulation

L'encapsulation est un principe fondamental de la programmation orientée objet (POO)


qui consiste à regrouper les données (attributs) et les méthodes qui agissent sur ces
données au sein d'une même entité, généralement une classe.
Les points clés de l'encapsulation :
▪ Rassemblement des données et des méthodes : Les données et les méthodes sont
regroupées à l'intérieur d'une classe, formant ainsi une unité logique et fonctionnelle.
▪ Protection des données : Les attributs de la classe sont généralement déclarés comme
privés, ce qui signifie qu'ils ne peuvent être directement accessibles depuis l'extérieur
de la classe.
▪ Accès contrôlé aux données : L'accès aux attributs se fait généralement via des
méthodes spéciales appelées "getters" (pour accéder aux données) et "setters" (pour
les modifier). Ces méthodes permettent de contrôler et de valider l'accès aux données
de la classe.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 52


Héritage et polymorphisme

→ Héritage

❑ L’héritage permet à un objet d’acquérir les propriétés d’un autre objet, favorisant la
factorisation des connaissances. Dans ce concept :
→ La classe mère (ou classe de base) est plus générale et contient les propriétés
communes à toutes les classes filles (ou classes dérivées ou héritées).
→ Les classes filles ont des propriétés plus spécifiques, élargissant ainsi les fonctionnalités
de la classe de base.
➔ Cela conduit à la formation d'une hiérarchie de classes.
❑ Pour exprimer qu’une classe est une classe fille, on utilise le mot-clé extends dans la
déclaration de la classe :
class <nom classe fille> extends <nom classe mère>
❑ En Java, on hérite d’une seule et unique classe.
❑ Une classe qui n’hérite d’aucune classe héritent en fait implicitement de la classe
Object

Pr. S. BAKKOURI Programmation Orientée Objet: Java 53


Héritage et polymorphisme

→ Héritage
❑ Exemple

Classe mère :
Personne

Classe fille :
Etudiant

Pr. S. BAKKOURI Programmation Orientée Objet: Java 54


Héritage et polymorphisme

→ Héritage

❑ Les méthodes de la classe mère


Pour les méthodes public ou protected héritées d'une classe mère, deux options se
présentent :
→ Si le comportement doit rester le même dans la classe fille, il est possible (et souvent
recommandé) d'omettre la ré-écriture de la méthode.
→ Si le comportement doit être différent dans la classe fille, il est nécessaire de ré-écrire
la méthode.

▪ L'annotation @Override peut être utilisée pour indiquer explicitement que l'on
redéfinit une méthode de la classe mère en Java.
➔ Cette annotation permet à Java de vérifier si la méthode de la classe fille est
réellement une redéfinition de celle de la classe mère.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 55


Héritage et polymorphisme

→ Héritage
❑ Les méthodes de la classe mère
o Deux références sont utilisées pour naviguer dans la hiérarchie des classes :

• this : fait référence à l'instance de la classe courante.


• super : fait référence à l'instance de la classe parente.

• Il est tout à fait possible d'ajouter des méthodes spécifiques à la classe fille en plus des
méthodes héritées de la classe mère.

➔ Cela permet d'ajouter des fonctionnalités spécifiques à la classe fille sans altérer le
comportement des méthodes héritées.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 56


Héritage et polymorphisme

→ Héritage
❑ Constructeur de la classe fille
• Le constructeur de la classe fille suit généralement la même signature que celui de la
classe mère. Son implémentation implique deux étapes :

o Appeler le constructeur de la classe mère : Cela se fait à l'aide de la méthode


super() avec la liste des arguments nécessaires, si applicable.
o Effectuer les traitements spécifiques à la classe fille à l'intérieur du constructeur
de la classe fille lui-même.

• Si l'appel explicite au constructeur de la classe mère n'est pas effectué dans le


constructeur de la classe fille, Java tentera automatiquement d'appeler le constructeur
par défaut (sans argument) de la classe mère.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 57


Héritage et polymorphisme

→ Héritage
❑ Exemple

Appel au constructeur
de la classe mère

Surcharge de la méthode presentation()


de la classe Personne pour inclure des
Utilisation de informations spécifiques à l'étudiant
[Link]
n() pour appeler
la méthode de la
classe mère

Pr. S. BAKKOURI Programmation Orientée Objet: Java 58


Héritage et polymorphisme

→ Héritage
❑ Opérateur – instanceof
L'opérateur instanceof en Java est utilisé pour vérifier si un objet est une instance d'une
classe, d'une de ses sous-classes ou d'une classe implémentant une interface.
➔ Il retourne true si l'objet est une instance de la classe spécifiée ou de l'une de ses
superclasses, sinon il retourne false.
• Exemple (1/2)

Pr. S. BAKKOURI Programmation Orientée Objet: Java 59


Héritage et polymorphisme

→ Héritage
❑ Opérateur – instanceof
Exemple (2/2)

true → professeur est une instance de Personne


false → professeur n'est pas une instance de Etudiant
true → professeur est une instance de Enseignant
true → professeur est une instance de EnseignantChef

Pr. S. BAKKOURI Programmation Orientée Objet: Java 60


Héritage et polymorphisme

→ Polymorphisme
• Le polymorphisme en POO fait référence à la capacité d'un objet de prendre
plusieurs formes.
➔ Cela signifie que même si un objet est instancié à partir d'une classe spécifique, il
peut être manipulé comme s'il était d'un type différent, à condition que ce type soit
lié à la même hiérarchie de classes.
• Exemple (1/4) : Reprenons l'exemple des classes Personne (classe mère) et
Etudiant (classe fille)

Pr. S. BAKKOURI Programmation Orientée Objet: Java 61


Héritage et polymorphisme

→ Polymorphisme
Exemple (2/4)

Pr. S. BAKKOURI Programmation Orientée Objet: Java 62


Héritage et polymorphisme

→ Polymorphisme
Exemple (3/4)
• Les objets personne1 et personne2 sont déclarés comme des Personne, mais ils sont en fait
des instances de Etudiant.
• Chaque objet a sa propre présentation spécifique grâce à la méthode presentation() redéfinie
dans la classe Etudiant.

• Même si personne1 et personne2 sont déclarés comme des Personne, lorsqu'on appelle
[Link]() dans la boucle, le polymorphisme permet d'appeler la méthode appropriée
selon le type réel de chaque objet.
Pr. S. BAKKOURI Programmation Orientée Objet: Java 63
Héritage et polymorphisme

→ Polymorphisme
Exemple (4/4)
• Appeler la méthode getCNE() directement sur l'objet personne4 provoque une erreur
de compilation car getCNE() appartient spécifiquement à la classe Etudiant.
• Pour éviter cette erreur, on vérifie d'abord si l'objet est une instance de Etudiant (avec
instanceof), puis on effectue un "cast" vers le type (Etudiant) avant d'appeler la
méthode getCNE().

On ne peut pas appeler String cne = [Link]() - cela


générera une erreur de compilation.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 64


Héritage et polymorphisme

→ Mot clés - final

→ Pour une classe : une classe déclarée comme final ne peut pas avoir de classe fille.
Cela est mis en place pour des raisons de sécurité, dans le but d'éviter toute forme de
modification ou de "détournement".
➔ Par exemple, la classe String est déclarée comme finale, elle ne peut donc pas être
héritée.

→ Pour une méthode : si une méthode est déclarée comme final, elle ne peut pas être
redéfinie dans une classe dérivée. Cela signifie que son comportement ne peut pas être
modifié par une classe héritée.
→ Pour une variable : une variable déclarée comme final ne peut pas être modifiée
après son initialisation. Une fois qu'elle a été assignée une valeur, elle ne peut être
changée.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 65


Héritage et polymorphisme

→ La classe ‘Object’

❑ Tout objet en Java hérite de la classe Object.


❑ La classe Object en Java possède 11 méthodes publiques
1. protected Object clone() 7. void notifyAll()
2. boolean equals(Object obj) 8. String toString()
3. protected void finalize() 9. void wait()
4. Class<?> getClass() 10. void wait(long timeout)
5. int hashCode() 11. void wait(long timeout, int nanos)
6. void notify()

• Ces méthodes sont héritées par toutes les autres classes Java, car toutes les classes Java
sont des sous-classes de Object.
• Certaines de ces méthodes sont utilisées pour des opérations avancées de gestion de
mémoire et de synchronisation, tandis que d'autres, comme equals(), toString(), et
hashCode(), sont couramment utilisées dans le développement pour des comparaisons
d'objets, des représentations en chaîne de caractères et la gestion des codes de hachage.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 66


Héritage et polymorphisme

→ La classe ‘Object’

Méthodes Description
protected Object clone() Crée et renvoie une copie de cet objet.
boolean equals(Object obj) Indique si un autre objet est "égal à" celui-ci.
protected void finalize() Appelée par le garbage collector sur un objet lorsque la
collecte des déchets détermine qu'il n'y a plus de
références à l'objet.
String toString() Renvoie une représentation sous forme de chaîne de
caractères de l'objet.
Class<?> getClass() Renvoie la classe d'exécution de cet objet.

int hashCode() Renvoie une valeur de code de hachage pour l'objet

Si vous ne redéfinissez pas ces méthodes de la classe Object, l'implémentation par


défaut sera celle de la classe Object.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 67


Héritage et polymorphisme
Exercice 4

Une entreprise compte plusieurs employés. Chaque employé est caractérisé par son nom,
un identifiant unique (matricule) et un indice salarial. Le salaire est déterminé en
multipliant l'indice salarial par une valeur fixe.
1. Créer une classe nommée Employe possédant les attributs nom, matricule et
indiceSalarial.
2. Ajouter à la classe Employe une méthode afficherCaracteristiques() pour présenter
les détails de chaque employé et une méthode calculerSalaire() pour déterminer son
salaire.
3. Développer une sous-classe appelée Responsable héritant de Employe et comprenant
un tableau pour enregistrer les employés placés directement sous sa supervision
(inferieurs). Ajouter la méthode afficherInferieursDirects() à cette sous-classe pour
afficher les subordonnés directs.
4. Redéfinir la méthode afficherCaracteristiques() dans la classe Responsable pour
inclure des informations spécifiques aux responsables en plus de celles des employés.
Utiliser cette méthode redéfinie dans la méthode main() pour afficher les caractéristiques à la fois des
employés ordinaires et des responsables, mettant ainsi en évidence l'utilisation du polymorphisme.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 68


Classes abstraites et interfaces

→ Classes abstraites

❑ En Java, une classe abstraite est une classe déclarée avec le mot-clé abstract. Elle
ne peut pas être instanciée directement, ce qui signifie qu'on ne peut pas créer d'objets
à partir d'une classe abstraite.
➔ Elle est conçue dans le but d'être utilisée d’être utilisée comme classe de base pour
d'autres classes.

❑ Une classe abstraite peut contenir à la fois des méthodes concrètes (avec une
implémentation) et des méthodes abstraites (sans implémentation).
❑ Les méthodes abstraites sont des méthodes déclarées sans implémentation dans la
classe parente, et leur implémentation doit être fournie par les sous-classes qui
étendent cette classe abstraite.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 69


Classes abstraites et interfaces

→ Classes abstraites
Exemple (1/2)

Classe abstraite :
Personne Méthode abstraite à
implémenter dans les
sous-classes

Pr. S. BAKKOURI Programmation Orientée Objet: Java 70


Classes abstraites et interfaces

→ Classes abstraites
Exemple (2/2)

Implémentation de la méthode
abstraite identite() de la classe
Personne

Pr. S. BAKKOURI Programmation Orientée Objet: Java 71


Classes abstraites et interfaces

→ Interfaces

❑ En Java, l'héritage est simple, ce qui signifie qu'une classe peut hériter directement
d'une seule autre classe. Cependant, les interfaces offrent un moyen de réaliser un type
d'héritage multiple.

❑ Une interface représente un standard que les classes peuvent choisir de suivre. Pour
respecter ce standard, une classe doit mettre en œuvre (ou "implémenter") les
méthodes et les constantes déclarées dans l'interface correspondante.

❑ Lorsqu'une classe met en œuvre une interface, on dit qu'elle "implémente" cette
interface.

❑ Une classe Java peut implémenter plusieurs interfaces.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 72


Classes abstraites et interfaces

→ Interfaces
❑ Pour définir une interface en Java, on utilise un fichier .java portant le même nom que
l'interface.
❑ Le nom d'une interface commence toujours par une majuscule. La structure d'une
interface suit généralement ce schéma :
[public] interface NomInterface [extends NomInterface1,
NomInterface2, ...] {
// Déclaration de méthodes ou d'attributs statiques }
• Toute méthode déclarée dans une interface est abstraite
• Les méthodes sont implicitement déclarées comme telles (i.e. il n’est pas nécessaire
d’ajouter le mot-clé abstract)
• Tout attribut est implicitement déclaré static et final.
❑ La syntaxe pour déclarer une classe en Java qui implémente une interface est la
suivante :
[<modificateurs>] class NomClasse implements
NomInterface { // Corps de la classe }

Pr. S. BAKKOURI Programmation Orientée Objet: Java 73


Classes abstraites et interfaces

→ Interfaces
Exemple
Déclaration de l'interface Vehicule

Déclaration de la classe Voiture qui


implémente l'interface Vehicule

Dans cet exemple, la classe Voiture implémente l'interface Vehicule en utilisant le mot-clé
implements, et fournit une implémentation pour la méthode deplacer() définie dans l'interface
Vehicule.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 74


Classes abstraites et interfaces

→ Interfaces
On peut maintenant utiliser l’interface comme un type normal !

On sait qu’on ne peut pas instancier


l’interface, mais on peut créer des instances
d’une classe qui implémente l’interface.

• Dans cet exemple, dans la méthode main(), nous déclarons monVehicule comme une référence de
type Vehicule, une interface. Ensuite, nous créons une instance de la classe Voiture et l'assignons
à cette référence Vehicule.
• Même si nous déclarons monVehicule comme une interface Vehicule, nous sommes capables
d'instancier et d'utiliser une classe concrète (comme Voiture) qui implémente cette interface.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 75


Classes abstraites et interfaces

Exercice 5
Une application de dessin doit gérer diverses formes géométriques telles que des cercles et des
rectangles. Chaque forme possède ses caractéristiques distinctes tout en partageant des
fonctionnalités communes.
1. Créer une interface nommée Forme définissant une méthode calculerSurface() pour
uniformiser le calcul de la surface de toutes les formes géométriques.
2. Élaborer une classe abstraite appelée FormeGenerique implémentant l'interface Forme.
Cette classe contiendra des méthodes pour gérer les dimensions communes à toutes les
formes.
3. Créer deux classes abstraites, Cercle et Rectangle, qui héritent des attributs et méthodes de
la classe FormeGenerique. Ces classes devront également implémenter la méthode
calculerSurface() adaptée à chaque forme.
4. Créer des classes concrètes telles que CercleRouge et RectangleBleu, héritant
respectivement des classes abstraites Cercle et Rectangle. Ces classes devront définir les
attributs spécifiques à chaque forme et redéfinir la méthode calculerSurface().
Dans la méthode main(), créer des instances de différentes formes géométriques et appeler la
méthode calculerSurface() pour illustrer le calcul de la surface pour chaque forme.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 76


Gestion des exceptions

❑ Les exceptions sont des éléments fondamentaux en programmation, représentant des


erreurs pouvant interrompre le déroulement normal d'un programme.

Exemple:
Division par zéro : Lorsqu'une division par zéro est tentée, elle génère une exception
ArithmeticException.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 77


Gestion des exceptions

→ Gestion des erreurs

❑ Java possède un mécanisme de gestion des erreurs, ce qui permet de renforcer la


sécurité du code. On peut avoir différents niveaux de problèmes :

❑ L'erreur (Error) représente un


dysfonctionnement grave survenant
dans la machine virtuelle (par
exemple, OutOfMemoryError).
❑ La classe Exception quant à
elle représente des anomalies
ou des situations imprévues
dans le programme, lesquelles
sont signalées au développeur.
o Le développeur a la possibilité de gérer ces erreurs (Exception) et ainsi éviter une
cessation soudaine de l'application.
o Nous souhaitons principalement gérer les erreurs anticipées, celles que l'on peut prévoir
et traiter dans le code.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 78


Gestion des exceptions
→ Gestion des erreurs

❑ Les exceptions vérifiées (checked Exception) représentent des situations où l'on


peut anticiper le problème, telles que les opérations d'entrée-sortie (IOException),
nécessitant une gestion explicite dans le code.
❑ Les RunTimeException ne peuvent pas être détectées lors de la compilation. Elles
surviennent généralement en raison d'erreurs de programmation telles que
NullPointerException et diffèrent des erreurs provoquées par des sources
incontrôlables comme les opérations d'entrée-sortie (IOException).

Pr. S. BAKKOURI Programmation Orientée Objet: Java 79


Gestion des exceptions

→ Gestion des erreurs

❑ Les exceptions sont à utiliser pour des conditions véritablement exceptionnelles. Les
exceptions vérifiées (checked exception) correspondent à des situations pour
lesquelles on peut raisonnablement espérer pouvoir récupérer et continuer l'exécution
du programme.
➔ Ces exceptions obligent le développeur à gérer des situations exceptionnelles,
l'empêchant ainsi de les ignorer.
➔ Les "exceptions d'utilisation" doivent être déclarées dans la signature de la fonction si
elles ne sont pas capturées à l'intérieur de la fonction.

❑ Les RunTimeException signalent généralement des erreurs de programmation. Par


exemple, NullPointerException est une exception "unchecked" (non vérifiée).
Si elle n'est pas traitée spécifiquement, elle peut potentiellement survenir à n'importe
quel endroit du code.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 80


Gestion des exceptions

→ Utilisation de la Bibliothèque Standard


pour la Gestion des Exceptions

Pr. S. BAKKOURI Programmation Orientée Objet: Java 81


Gestion des exceptions

→ Utilisation de la Bibliothèque Standard


pour la Gestion des Exceptions

❑ IllegalArgumentException : Correspond à un argument ayant une valeur


inappropriée.
❑ IllegalStateException : Indique que l'objet n'est pas dans un état adéquat pour
effectuer l'appel.
Il est possible d'utiliser principalement ces deux exceptions, car la plupart des erreurs sont
liées à un argument ou à un état illégal :
- NullPointerException
- IndexOutOfBoundsException
- ArithmeticException
- NumberFormatException
Cependant, déterminer quelles exceptions utiliser n'est pas une science exacte

Pr. S. BAKKOURI Programmation Orientée Objet: Java 82


Gestion des exceptions

→ Utilisation de la Bibliothèque Standard


pour la Gestion des Exceptions
Exemple
Supposons un programme de gestion d'inventaire pour un magasin. Imaginons qu'il
comporte une fonctionnalité permettant l'ajout d'articles au stock. Cette fonction, nommée
ajouterArticle, prend en paramètres le nom de l'article (String nomArticle) ainsi que la
quantité d'articles à ajouter (int quantite).
public void ajouterArticle(String nomArticle, int quantite);

- IllegalArgumentException pourrait être levée si la quantité passée en


paramètre est négative.
- IllegalStateException pourrait être déclenchée si la fonction est appelée
alors que la connexion à la base de données ou une ressource externe nécessaire n'est
pas établie correctement

Pr. S. BAKKOURI Programmation Orientée Objet: Java 83


Gestion des exceptions

→ Déclaration des Exceptions

❑ La clause throws est utilisée pour déclarer une méthode dans laquelle l'échec peut
être anticipé.
Exemple:

→ Dans cette déclaration, il est possible de regrouper les exceptions en utilisant une
superclasse commune ou de les énumérer individuellement.
→ Dans l'exemple, nous déclenchons des exceptions de type IOException. Toutefois,
il est également envisageable de spécifier de manière plus précise tous les types
d'exceptions possibles, notamment les sous-classes spécifiques de IOException."

Pr. S. BAKKOURI Programmation Orientée Objet: Java 84


Gestion des exceptions

→ Lever une exception

Lorsqu'une erreur est détectée dans le code,


→ un objet héritant de la classe Exception est créé, ce processus étant appelé "lever
une exception".
→ L'exception créée est propagée à travers la pile d'exécution jusqu'à ce qu'elle soit
traitée.
Exemple 1

Exception in thread "main"


[Link]: 5
At [Link]([Link])

o ArrayIndexOutOfBoundsException : Se produit lorsqu'on tente d'accéder à


un index non valide dans un tableau.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 85


Gestion des exceptions

→ Lever une exception

Exemple 2

Exception in thread "main"


[Link]: / by zero
at [Link]([Link])

o ArithmeticException : Se produit lors d'une opération arithmétique invalide,


comme une division par zéro.

Ces exemples illustrent comment les exceptions, telles que ArrayIndexOutOfBoundsException


et ArithmeticException, sont générées et signalées dans le code Java, fournissant des
informations sur leur origine dans la pile d'exécution (stack trace)."

La pile d'exécution, ou stack trace, est une structure de données


qui enregistre l'ordre chronologique des appels de fonctions ou de
méthodes dans un programme en cours d'exécution.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 86


Gestion des exceptions

→ Le bloc try … catch - finally

❑ Le bloc try englobe le code pouvant générer des erreurs.


❑ Les exceptions sont récupérées et gérées via le bloc catch.
❑ Plusieurs blocs catch peuvent être utilisés pour attraper différents types d'erreurs.
❑ En option, le bloc finally est ajouté pour exécuter des instructions, qu'une exception
ait été levée ou non.
❑ Lorsqu'une erreur survient dans le bloc try, le reste du code du bloc est abandonné.
❑ Les blocs catch sont testés séquentiellement, et le premier bloc correspondant à
l'erreur est exécuté.
❑ L'ordre des blocs catch doit aller de l'erreur la plus spécifique à la plus générale,
établissant ainsi une hiérarchie d'exceptions à attraper.
→ Ce mécanisme permet de filtrer et de gérer les exceptions de manière ordonnée et
adaptée à chaque type d'erreur.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 87


Gestion des exceptions

→ Le bloc try … catch - finally

Exemple

Les instructions présentes dans le bloc finally sont toujours exécutées, même
si une exception est levée dans le bloc try. Cela est utile pour effectuer des
actions qui doivent être réalisées quelle que soit la situation, telles que la
fermeture de fichiers, la libération de ressources, ou des opérations de nettoyage.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 88


Gestion des exceptions

→ Le bloc try … catch - finally

Une méthode peut lever plusieurs exceptions :


• Il peut être tentant de les regrouper dans une classe mère d'exception, mais cela
entraîne une perte partielle d'informations spécifiques à chaque type d'erreur.
• Il est possible de déclarer chaque exception individuellement, bien que le langage ne
requière pas explicitement cette déclaration pour chaque exception potentielle du code.
• Cette pratique encourage le développeur à être plus attentif à certains aspects du code.
• La balise Javadoc '@throws' permet de documenter spécifiquement chaque type
d'exception qu'une méthode peut lever, fournissant ainsi une documentation claire sur
les erreurs possibles.
• Depuis Java 7, il est possible de gérer plusieurs exceptions dans une seule clause
catch à l'aide de la syntaxe

catch(ExceptionType1 | ExceptionType2 | ExceptionType3 e) {... }

Pr. S. BAKKOURI Programmation Orientée Objet: Java 89


Gestion des exceptions

→ Le bloc try … catch - finally

Exemple

Une tentative de division (d / (t2 - t1)) est effectuée.


→ Si une ArithmeticException est levée (dans ce cas, une division par zéro), le
premier bloc catch sera exécuté pour afficher "Vitesse non valide".
→ Si une autre exception est levée, le deuxième bloc catch utilisera la méthode
printStackTrace() pour afficher les détails de cette exception dans la sortie d'erreur.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 90


Gestion des exceptions

→ Créer une Exception Personnalisée

❑ Pour créer une exception personnalisée en Java, vous pouvez définir votre propre
classe qui étend une classe d'exception existante, comme Exception ou l'une de ses
sous-classes.
Exemple (1/2)

• Dans cet exemple, MonExceptionPersonnalisee étend la classe Exception. Vous


pouvez personnaliser cette classe en ajoutant des attributs ou des méthodes supplémentaires
selon vos besoins.
• Le constructeur MonExceptionPersonnalisee prend en paramètre un message d'erreur, qui sera
utilisé pour décrire l'exception lorsqu'elle est levée.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 91


Gestion des exceptions

→ Créer une Exception Personnalisée

Exemple (2/2) : Voici comment utiliser cette exception personnalisée :

En utilisant throw new MonExceptionPersonnalisee("Erreur personnalisée !");


→ vous pouvez déclencher et gérer votre exception personnalisée, en utilisant le
bloc catch pour attraper l'exception et afficher son message.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 92


Gestion des exceptions

→ Créer une Exception Personnalisée

Exemple (2/2) : Voici comment utiliser cette exception personnalisée :

En utilisant throw new MonExceptionPersonnalisee("Erreur personnalisée !");


→ vous pouvez déclencher et gérer votre exception personnalisée, en utilisant le
bloc catch pour attraper l'exception et afficher son message.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 93


Les flux d’entrées/sorites

→ Les principes de base

❑ Entrée/sortie : échange de données entre le programme et une source :


o Entrée : saisie au clavier, lecture d’un fichier, communication réseau.
o Sortie : affichage sur la console, écriture dans un fichier, envoi via le réseau.
❑ Java utilise des flux (streams) pour abstraire ces opérations. De manière générale, on
observe trois phases :
1. Ouverture du flux.
2. Lecture/écriture du flux.
3. Fermeture du flux.

En ce qui concerne les entrées/sorties :


❑ Les streams sont présents dans [Link].
❑ Les channels sont utilisés dans [Link].

Pr. S. BAKKOURI Programmation Orientée Objet: Java 94


Les flux d’entrées/sorites

→ Les principes de base

❑ Les streams dans [Link] gèrent les opérations d'entrée/sortie en représentant des
séquences ordonnées de données. Ils sont décomposés en streams d'entrée (comme
FileInputStream) pour lire des données depuis une source et en streams de sortie
(comme FileOutputStream) pour écrire des données vers une destination.

❑ Les channels de [Link] (New I/O ou « n » pour non-blocking) diffèrent des


streams en prenant en charge les opérations d'E/S non bloquantes. Ils s'associent à des
buffers pour stocker temporairement les données à transférer. Les channels sont
souvent utilisés pour des opérations avancées comme les E/S sur des canaux de
communication non bloquants, par exemple, avec des sockets réseau.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 95


Les flux d’entrées/sorites

→ Le package: [Link]

….
…. ….
….

Pr. S. BAKKOURI Programmation Orientée Objet: Java 96


Les flux d’entrées/sorites

→ [Link]: Classe File

….
…. ….
….

Pr. S. BAKKOURI Programmation Orientée Objet: Java 97


Les flux d’entrées/sorites

→ [Link]: Classe File

La classe File ([Link]) ) est utilisée pour représenter des chemins de


fichiers ou de répertoires dans le système de fichiers en offrant les fonctionnalités
suivantes :

• Représentation de Chemins de Fichiers

• Manipulation de Chemins : elle permet de manipuler les chemins, d'obtenir des


informations sur les fichiers ou répertoires, de vérifier leur existence, d'obtenir
des propriétés comme le nom, le chemin absolu, le répertoire parent, etc.

• Opérations de Fichiers : elle offre des méthodes pour effectuer des opérations
courantes sur les fichiers tels que la création, la suppression, le renommage, la
vérification des autorisations d'accès, etc.

• Indépendance du Système de Fichiers : elle fournit une abstraction pour


travailler avec les chemins de fichiers de manière indépendante de la plateforme.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 98


Les flux d’entrées/sorites

→ [Link]: Classe File

❑ Les méthodes de la classe File

Pr. S. BAKKOURI Programmation Orientée Objet: Java 99


Les flux d’entrées/sorites

→ [Link]: Classe File

❑ Les méthodes de la classe File

• boolean canExecute(): retourne true si le chemin d'accès abstrait pointe vers un fichier
exécutable. Si le fichier n'est pas exécutable, elle renvoie false.
• boolean canRead(): Cette fonction retourne true si le programme peut lire le fichier,
représenté par un chemin d'accès abstrait. Si ce n'est pas possible, elle renvoie false.
• boolean canWrite(): Cette fonction booléenne retourne true si elle peut écrire sur le
contenu du fichier. Sinon, elle renvoie false.
• int compareTo(File pathname): Cette fonction compare deux chemins d'accès de manière
lexicographique. Il faut noter que les noms de chemins d'accès sont abstraits. Si ces deux
chemins d'accès ne sont pas identiques, la fonction renvoie la différence entre eux.
• boolean createNewFile(): Cette fonction crée un nouveau fichier vide suivant le chemin
d'accès abstrait. Si elle ne peut pas, elle renvoie false.
• static File createTempFile(String prefix, String suffix): Comme son nom l'indique, cette
fonction crée un fichier temporaire dans la bibliothèque de fichiers temporaires par défaut.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 100


Les flux d’entrées/sorites

→ [Link]: Classe File

❑ Les méthodes de la classe File

• boolean delete(): Cette fonction supprime le répertoire ou le fichier indiqué par le


chemin d'accès abstrait. Elle renvoie false en cas d'exception.
• boolean equals(Object obj): Cette fonction vérifie si le chemin d'accès est égal à l'objet
donné.
• boolean exists(): Cette méthode vérifie si le fichier ou le répertoire existe. Elle renvoie
true s'il est trouvé, sinon elle renvoie false.
• String getAbsolutePath(): Cette fonction retourne le chemin absolu du fichier.
• long getFreeSpace(): Cette méthode est particulièrement utile pour trouver le nombre
d'octets non alloués dans la partition. Elle renvoie une valeur de type long. Si l'espace est
épuisé, elle retourne "0L".
• String getName(): Cette méthode, comme son nom l'indique, retourne le nom du
répertoire ou du fichier pointé par le chemin d'accès.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 101


Les flux d’entrées/sorites

→ [Link]: Classe File

Exemple

Pr. S. BAKKOURI Programmation Orientée Objet: Java 102


Les flux d’entrées/sorites

→ [Link]: Les flux E/S

❑ Il existe deux principales sortes de streams :

• Byte Streams (les flux d’octets): Ils contiennent des séquences d'octets.
• Character Streams (les flux de caractères) : Ils contiennent des caractères
encodés en UTF-16.

❑ En ce qui concerne la distinction entre les types Character et Byte :

• Pour les flux d’octets, on utilise généralement les classes InputStream ou


OutputStream.
• Pour les flux de caractères, on utilise les classes Reader ou Writer.
• Ces deux hiérarchies de classes sont corrélées, chacune offrant des fonctionnalités
spécifiques aux types de données manipulés.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 103


Les flux d’entrées/sorites

→ [Link]: Les flux E/S

Pr. S. BAKKOURI Programmation Orientée Objet: Java 104


Les flux d’entrées/sorites

→ [Link]: Les flux E/S

Pr. S. BAKKOURI Programmation Orientée Objet: Java 105


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets

❑ Les objets qui gèrent les flux d'entrée sont représentés par in :

❑ Les objets qui gèrent les flux de sortie sont représentés par out :

Pr. S. BAKKOURI Programmation Orientée Objet: Java 106


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


La hiérarchie des classes InputStrean et OutpuStram

Pr. S. BAKKOURI Programmation Orientée Objet: Java 107


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


Les flux peuvent être liés à différentes sources :

❑ Fichiers : Ces flux sont utilisés pour lire ou écrire vers des fichiers.

o FileInputStream : Pour lire à partir d'un fichier.

o FileOutputStream : Pour écrire dans un fichier.

❑ Objets : Ces flux permettent d'envoyer ou de recevoir des objets via le flux.

o ObjectInputStream : Pour recevoir un objet à partir d'un flux.

o ObjectOutputStream : Pour envoyer un objet via un flux.

Les classes ObjectInputStream et ObjectOutputStream


en Java sont utilisées pour la sérialisation et la désérialisation
d'objets Java à travers les flux d'entrée/sortie.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 108


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets

❑ Pour obtenir un flux de bytes de ou vers un fichier :

Pr. S. BAKKOURI Programmation Orientée Objet: Java 109


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets

❑ Pour obtenir un flux de ou vers Internet :

❑ Pour obtenir un flux à partir d'un tableau de bytes :

Pr. S. BAKKOURI Programmation Orientée Objet: Java 110


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


→ Classe InputStream
La classe InputStream offre plusieurs méthodes pour manipuler les flux d'octets.
o abstract int read() : Lit un octet.
o int read(byte[] b) : Lit des octets et les écrit dans le tableau b, le nombre
d'octets lus est retourné.
o int read(byte[] b, int off, int len) : Lit des octets et les écrit dans
le tableau b, à partir de l'index off jusqu'à len.
o long skip(long n) : Saute (ignore) n octets.
o int available() : Retourne le nombre d'octets disponibles pouvant être lus.
o void mark(int readlimit) et void reset() : Pose une marque dans le
flux et permet de revenir à cette marque.
o void close() : Ferme le flux.
Ces méthodes sont utilisées pour lire et manipuler les flux d'octets avec InputStream.
➔ Il est important de noter que toutes ces méthodes peuvent potentiellement lancer une
IOException

Pr. S. BAKKOURI Programmation Orientée Objet: Java 111


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


→ Classe OutputtStream

La classe OutputStream offre plusieurs méthodes pour manipuler les flux d'octets.
o abstract void write(int b) : Écrit un octet.
o void write(byte[] b) : Écrit les octets du tableau b.
o void write(byte[] b, int off, int len) : Écrit les octets du tableau b, à
partir de l'index off jusqu'à len.
o void close() : Ferme le flux.
o void flush() : Vide le flux en le vidant immédiatement.
Ces méthodes sont utilisées pour écrire et manipuler les flux d'octets avec
OutputStream.
➔ Il est important de noter que toutes ces méthodes peuvent potentiellement lancer une
IOException

Pr. S. BAKKOURI Programmation Orientée Objet: Java 112


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


→ Classe InputStream et OutputtStream

Exemple

Pr. S. BAKKOURI Programmation Orientée Objet: Java 113


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


Les objets FileInputStream et FileOutputStream

Les objets FileInputStream et FileOutputStream :


→ Ils permettent respectivement de lire depuis un fichier et d'écrire dans un fichier.
→ Ces classes héritent des classes abstraites InputStream et OutputStream du
package [Link].
▪ Lors de la lecture depuis un fichier, c'est considéré comme une entrée (in), et lors de
l'écriture dans un fichier, c'est considéré comme une sortie (out).
▪ En utilisant ces classes, nous pouvons lire le contenu d'un fichier et le copier dans un
autre via un programme Java.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 114


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


Les objets FileInputStream et FileOutputStream
Exemple

Pr. S. BAKKOURI Programmation Orientée Objet: Java 115


Les flux d’entrées/sorites
→ [Link]: Les flux d’octets
Les objets FilterInputStream et FilterOutputStream

Les classes FilterInputStream et FilterOutputStream sont des classes


abstraites qui fournissent un comportement commun pour leurs sous-classes. Elles ajoutent
des fonctionnalités supplémentaires aux flux d'entrée/sortie.
Quatre sous-classes héritent de FilterInputStream (et de FilterOutputStream) :
o DataInputStream : permet la lecture directe de types primitifs (double, char, int) avec
des méthodes comme readDouble(), readInt()…
o BufferedInputStream : utilise un tampon pour optimiser la lecture, stockant les
données avant leur utilisation.
o PushbackInputStream : offre la possibilité de remettre un octet déjà lu dans le flux
entrant.
o LineNumberInputStream : permet de suivre le numéro de la ligne lue à un instant T.
Ces classes prennent en paramètre une instance de InputStream (pour
FilterInputStream) ou de OutputStream (pour FilterOutputStream) pour
ajouter des fonctionnalités à ces flux.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 116


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


Les objets ObjectInputStream et ObjectOutputStream

Les objets ObjectInputStream et ObjectOutputStream en Java sont utilisés pour


la sérialisation et la désérialisation des objets.
❑ La sérialisation implique de sauvegarder des objets dans des fichiers pour une
réutilisation future. En implémentant l'interface Serializable dans un objet, Java
reconnaît sa capacité à être sérialisé. Si une classe parente implémente
Serializable, ses sous-classes sont également considérées comme sérialisables.
❑ La déserialisation est le processus inverse de la sérialisation. Cela signifie prendre des
données sérialisées (généralement stockées dans un fichier ou transmises via un réseau)
et les convertir en objets Java.

Sauvegarder des objets java en flot d'octets:


o objet vers byte: sérialisation
o byte vers objet: désérialisation

Pr. S. BAKKOURI Programmation Orientée Objet: Java 117


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


Les objets ObjectInputStream et ObjectOutputStream

Exemple (1/3)

Cet exemple illustre les étapes suivantes :


1. La classe Game est créée avec deux attributs (nom et prix), et elle implémente
l'interface Serializable.
2. Deux objets de type Game (game1 et game2) sont créés avec des données
spécifiques.
3. Les objets sont sérialisés dans un fichier nommé "[Link]" à l'aide d'un
ObjectOutputStream.
4. Les objets sont ensuite désérialisés à partir du fichier "[Link]" à l'aide d'un
ObjectInputStream, et leurs attributs sont affichés à la console pour
vérification.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 118


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


Les objets ObjectInputStream et ObjectOutputStream
Exemple (2/3)

L'interface Serializable est


ce qu'on appelle une interface
marqueur en Java. Contrairement
à d'autres interfaces, elle ne
contient aucune méthode à
redéfinir. En implémentant cette
interface dans une classe, Java
sait que les objets de cette classe
peuvent être sérialisés. Cela
signifie que ces objets peuvent
être convertis en un flux d'octets
pour être stockés ou transmis via
des opérations de sérialisation.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 119


Les flux d’entrées/sorites

→ [Link]: Les flux d’octets


Les objets ObjectInputStream et ObjectOutputStream
Exemple (3/3)

La désérialisation d'un objet peut engendrer


une ClassNotFoundException,
pensez donc à la capturer

Pr. S. BAKKOURI Programmation Orientée Objet: Java 120


Les flux d’entrées/sorites

→ [Link]: Les flux de caractères

❑ Les classes abstraites Reader et Writer sont des composants essentiels pour
traiter les flux de caractères en Java.

❑ Lorsque nous utilisons InputStream, la méthode read nous retourne un byte,


représentant un octet de poids faible d'un int. En contraste, dans le contexte de
Reader, la méthode read récupère un char à partir de deux octets, interprétés
comme un caractère dans un int.

❑ Cette distinction est importante car elle définit comment les données textuelles sont
lues à partir de ces flux de données, soit en utilisant des octets individuels
(InputStream), soit en interprétant deux octets pour former un caractère unique
(Reader).

Pr. S. BAKKOURI Programmation Orientée Objet: Java 121


Les flux d’entrées/sorites

→ [Link]: Les flux de caractères


La classe : Reader
Reader offre principalement les mêmes méthodes que InputStream, mais pour traiter
les flux de caractères :
o int read() : lit un caractère.
o int read(char[] cbuf) : lit des caractères dans un tableau donné.
o abstract int read(char[] cbuf, int off, int len) : lit des
caractères dans un tableau avec une position de départ et une longueur spécifiées.
o int read(CharBuffer target) : lit des caractères dans un objet
CharBuffer.
o boolean ready() : vérifie si le flux est prêt à être lu.
o void reset() : réinitialise le flux.
o void mark(int readAheadLimit) : marque la position actuelle du flux.
o boolean markSupported() : vérifie si la marque est prise en charge.
o long skip(long n) : saute un certain nombre de caractères dans le flux.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 122


Les flux d’entrées/sorites

→ [Link]: Les flux de caractères


La classe : Writer
Writer est similaire à OutputStream mais travaille avec des caractères au lieu d'octets.
o void write(char[] cbuf) : écrit un tableau de caractères.
o abstract void write(char[] cbuf, int off, int len) : écrit une
partie du tableau de caractères, à partir de la position spécifiée, pour une longueur
donnée.
o void write(int c) : écrit un caractère.
o void write(String str) : écrit une chaîne de caractères.
o void write(String str, int off, int len) : écrit une partie d'une
chaîne de caractères, à partir de l'offset donné, pour une longueur donnée.
o Writer append(char c) : ajoute un caractère.
o Writer append(CharSequence csq) : ajoute une séquence de caractères.
o Writer append(CharSequence csq, int start, int end) : ajoute
une séquence de caractères, à partir de l'indice de début jusqu'à l'indice de fin.
o abstract void close() : ferme le flux de caractères.
o abstract void flush() : vide le flux de caractères.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 123


Les flux d’entrées/sorites

→ [Link]: Les flux de caractères


La hiérarchie des classes Reader et Writer

Pr. S. BAKKOURI Programmation Orientée Objet: Java 124


Les flux d’entrées/sorites

→ [Link]: Les flux de caractères


Les objets InputStreamReader et OutputStreamWriter

InputStreamReader et OutputStreamWriter facilitent la conversion entre


caractères et octets en utilisant un jeu de caractères spécifié (charset). Voici les
constructeurs associés à ces classes :
❑ Constructeurs InputStreamReader :
o InputStreamReader(InputStream in)
o InputStreamReader(InputStream in, Charset cs)
o InputStreamReader(InputStream in, String charsetName)
❑ Constructeurs OutputStreamWriter
o OutputStreamWriter(OutputStream out)
o OutputStreamWriter(OutputStream out, Charset cs)
o OutputStreamWriter(OutputStream out, CharsetEncoder enc)
o OutputStreamWriter(OutputStream out, String charsetName)

Ces classes permettent de spécifier explicitement un jeu de caractères lors de la conversion entre octets et
caractères, facilitant ainsi la lecture et l'écriture dans des encodages spécifiques.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 125


Les flux d’entrées/sorites

→ [Link]: Les flux de caractères

Autres classes de la hiérarchie des flux de caractères :


o FileInputStream : permet de lire les données depuis un fichier spécifié par son
nom (String) ou par un objet File.
o FileOutputStream : permet d'écrire les données dans un fichier spécifié par son
nom (String) ou par un objet File.
o FileReader : permet la lecture de caractères à partir d'un fichier spécifié par son
nom (String) ou par un objet File.
o FileWriter : permet l'écriture de caractères dans un fichier spécifié par son nom
(String) ou par un objet File. Cette classe prend en charge un mode d'écriture en
append (ajout) en plus du mode classique.
Remarques
• Les streams standard [Link] et [Link] sont des flux d'octets.
• InputStreamReader permet de convertir un InputStream en Reader.
• [Link] et [Link] sont des PrintStream (obsolètes et à remplacer par la
version caractère PrintWriter).

Pr. S. BAKKOURI Programmation Orientée Objet: Java 126


Les flux d’entrées/sorites

→ [Link]: Les flux de caractères

Quelques autres classes de la hiérarchie des flux de caractères :


❑ Les filtres :
• FilterInputStream
• FilterOutputStream
• FilterReader
• FilterWriter
❑ Buffered :
• BufferedInputStream
• BufferedOutputStream
• BufferedReader
• BufferedWriter
❑ Tubes :
• PipedInputStream
• PipedOutputStream
• PipedReader
• PipedWriter

Pr. S. BAKKOURI Programmation Orientée Objet: Java 127


Les flux d’entrées/sorites

→ Le package: [Link]

❑ [Link], (New I/O), améliore les performances du traitement des fichiers, du réseau
et des buffers.
❑ Contrairement à [Link], il manipule les données en blocs, offrant une lecture plus
rapide.
➔ Ses éléments centraux sont les channels et les buffers, utilisés pour gérer efficacement
les données lors des opérations d'E/S sur fichiers et réseaux.

En résumé
[Link] est un package optimisé pour le traitement des fichiers et des données
réseau.
→ Il fonctionne en manipulant les données par blocs plutôt qu'en octets, offrant ainsi une
lecture plus rapide.
→ Ses principaux éléments sont les channels et les buffers, utilisés pour gérer et
manipuler les données de manière efficace.

Pr. S. BAKKOURI Programmation Orientée Objet: Java 128


Les flux d’entrées/sorites

→ Le package: [Link]

Pr. S. BAKKOURI Programmation Orientée Objet: Java 129


Les flux d’entrées/sorites

→ Exceptions liées aux Entrées/Sorties (E/S)

Exemple : Ce code effectue la lecture d'un fichier texte en utilisant deux méthodes
distinctes : FileInputStream pour lire les données sous forme d'octets (byte[]), puis
avec BufferedReader pour lire les lignes de texte.

En cas d'incident lors de l'accès ou de la lecture du


fichier, les exceptions FileNotFoundException
et IOException sont capturées. Leurs traces sont
ensuite affichées à l'aide de [Link]().

Pr. S. BAKKOURI Programmation Orientée Objet: Java 130

Vous aimerez peut-être aussi