0% ont trouvé ce document utile (0 vote)
181 vues149 pages

OCaml et Hashmap en POO

Transféré par

Hadrich Med Amin
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)
181 vues149 pages

OCaml et Hashmap en POO

Transféré par

Hadrich Med Amin
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

Programmation Orientée Objet

(Java)

Saïd Taktak
[Link]@[Link]
[Link]@[Link]
• Introduction
• Classes et Objets
• Encapsulations
• Héritage et polymorphisme
• Les classes Abstraites et les Interfaces
• Les collections
• Les Exceptions

21/04/2022 Saïd Taktak 2


Les langages de programmation
• Il existe de nombreux langages de programmation :
– Langages impératifs et procéduraux (C, Pascal, Fortran...)
– Langages logiques (Prolog...)
– Langages fonctionnels (OCaml, Haskell, Erlang...)
– Langages à pile (PostScript...)
– Langages à objets (Java, C++, C#...)

• L’exécution se fait soit par :


– Interprétation (Python, PHP, JavaScript, Ruby...)
– Compilation et exécution (C++, C, Pascal...)
– Semi-compilation et exécution sur machine virtuelle
(Java...)

21/04/2022 Saïd Taktak 3


La programmation orientée objet
(POO)
• Les objectifs :
– Faciliter le développement et l’évolution des
applications ;
– Permettre le travail en équipe ;
– Augmenter la qualité des logiciels (moins de bugs).
• Solutions proposées :
– Découpler (séparer) les parties des projets ;
– Limiter (et localiser) les modifications lors des
évolutions ;
– Réutiliser facilement du code.

21/04/2022 Saïd Taktak 4


La programmation orientée objet
(POO)
• Java
• C++ : très utilisé
• C# : langage de Microsoft (appartient à .NET)
• Objective C : langage utilisé par Apple
• PHP : langage très utilisé sur le Web
• Python
• Ruby
• Eiffel
• Ada
• Smalltalk
• ...

21/04/2022 Saïd Taktak 5


Java c’est quoi ?
• Un langage : Orienté objet fortement typé
avec classes
• Un environnement d’exécution (JRE) : Une
machine virtuelle et un ensemble de
bibliothèques
• Un environnement de développement (JDK) :
Un compilateur et un ensemble d’outils

21/04/2022 Saïd Taktak 6


Java pourquoi ?
Java est devenu aujourd’hui l’un des langages de
programmation les plus utilisés.
Il est incontournable dans plusieurs domaines :
• Systèmes dynamiques : Chargement dynamique
de classes
• Internet : Les Applets java
• Systèmes communicants : RMI, Corba, EJB, etc.

21/04/2022 Saïd Taktak 7


Java versus C++
• Filiation historique :
– 1983 (AT&T Bell) : C++
– 1991 (Sun Microsystems) : Java
• Java est très proche du langage C++ (et donc du
langage C).
• Toutefois Java est plus simple que le langage C++, car
les points "critiques" du langage C++ (ceux qui sont à
l’origine des principales erreurs) ont été supprimés.
• Cela comprend :
– Les pointeurs
– La surcharge d’opérateurs
– L’héritage multiple

21/04/2022 Saïd Taktak 8


Java versus C++
• De plus,
– Tout est dynamique : les instances d’une classe sont
instanciées dynamiquement.
– La libération de mémoire est transparente pour
l’utilisateur. Il n’est pas nécessaire de spécifier de
mécanisme de destruction.
• La libération de l’espace mémoire est prise en
charge un gestionnaire appelé
garbage collector chargé de détecter les objets à
détruire.

21/04/2022 Saïd Taktak 9


Java versus C++
• Une fois achevée la production du logiciel, un choix
doit être fait entre fournir le source ou le binaire
pour la machine du client.

• Généralement, une entreprise souhaite protéger le


code source et distribuer le code binaire.

• Le code binaire doit donc être portable sur des


architectures différentes (processeur, système
d’exploitation, etc.).

21/04/2022 Saïd Taktak 10


Java versus C++
• À l’instar du compilateur C, le compilateur C++
produit du code natif, i.e., qu’il produit un exécutable
propre à l’environnement de travail ou le code source
est compilé.

• On doit donc créer les exécutables pour chaque type


d’architecture potentielle des clients.

21/04/2022 Saïd Taktak 11


Java versus C++
• En Java, le code source n’est pas traduit directement
dans le langage de l’ordinateur.
• Il est d’abord traduit dans un langage appelé
"bytecode", langage d’une machine virtuelle (JVM –
Java Virtual Machine) définie par Sun.

21/04/2022 Saïd Taktak 12


Java versus C++
• Le langage Java est :
– « C-like » : Syntaxe familière aux programmeurs de C
– Orienté objet : Tout est objet, sauf les types primitifs
(entiers, flottants, booléens, ...)
– Robuste : Typage fort, pas de pointeurs, etc.
– Code intermédiaire : Le compilateur ne produit que du
bytecode indépendant de l’architecture de la machine où
a été compilé le code source

21/04/2022 Saïd Taktak 13


L’environnement actuel Java 8
Standard Edition J2SE
• L’outil de base : le JDK (Java Development Kit) de SUN :
– [Link]
– gratuit.
– comprend de nombreux outils :
• le compilateur.
• le compilateur à la volé "JIT".
• le débogueur.
• le générateur de documentation
• Des environnements de développements gratuits
– NetBeans : [Link]
– Eclipse : [Link]

21/04/2022 Saïd Taktak 14


Mon premier programme en Java
• Le programme [Link]

• Compilation et exécution
>javac [Link]
>java HelloWorld
>HelloWorld !

21/04/2022 Saïd Taktak 15


Mon premier programme en Java
• Le programme [Link]

• Compilation et exécution
>javac [Link]
>java HelloWorld
>HelloWorld !

21/04/2022 Saïd Taktak 16


Commentaires

21/04/2022 Saïd Taktak 17


Instructions, Variables
et expressions

21/04/2022 Saïd Taktak 18


Les Variables

21/04/2022 Saïd Taktak 19


Les Types Primitifs

21/04/2022 Saïd Taktak 20


Les Opérateurs

21/04/2022 Saïd Taktak 21


Incrémentation et affectation

21/04/2022 Saïd Taktak 22


Les instructions conditionnelles if

21/04/2022 Saïd Taktak 23


Les instructions conditionnelles switch

21/04/2022 Saïd Taktak 24


Les boucles while et do/while

21/04/2022 Saïd Taktak 25


Les boucles for

21/04/2022 Saïd Taktak 26


Classes et Objets

21/04/2022 Saïd Taktak 27


Classe : Définition

21/04/2022 Saïd Taktak 28


Classe : Notations

21/04/2022 Saïd Taktak 29


Codage de la classe « voiture »

21/04/2022 Saïd Taktak 30


Classe : Attributs

21/04/2022 Saïd Taktak 31


Classe : Attributs et variables

21/04/2022 Saïd Taktak 32


Conventions en Java

21/04/2022 Saïd Taktak 33


Objet : Définition

21/04/2022 Saïd Taktak 34


Objet : Notations

21/04/2022 Saïd Taktak 35


Etats des objets

21/04/2022 Saïd Taktak 36


Affectation et comparaison

21/04/2022 Saïd Taktak 37


Affectation et comparaison

21/04/2022 Saïd Taktak 38


Cycle de vie d’un objet

21/04/2022 Saïd Taktak 39


Création d’objet

21/04/2022 Saïd Taktak 40


Création d’objet

21/04/2022 Saïd Taktak 41


Création d’objet

21/04/2022 Saïd Taktak 42


Constructeur de « Voiture »

21/04/2022 Saïd Taktak 43


Constructeur de « Voiture »

21/04/2022 Saïd Taktak 44


Construire une voiture de 7CV

21/04/2022 Saïd Taktak 45


Constructeur sans argument

21/04/2022 Saïd Taktak 46


Accès au attributs

21/04/2022 Saïd Taktak 47


Appel de méthodes

21/04/2022 Saïd Taktak 48


Appel de méthodes

21/04/2022 Saïd Taktak 49


Passage des paramètres

21/04/2022 Saïd Taktak 50


Passage des paramètres

21/04/2022 Saïd Taktak 51


Objet « courant »

21/04/2022 Saïd Taktak 52


Objet « courant » : Méthodes

21/04/2022 Saïd Taktak 53


Gestion des objets

21/04/2022 Saïd Taktak 54


Finalize()
• L'utilisation d'un garbage collector ne supprime pas l'intérêt d'utiliser un destructeur ( rappel
: un destructeur est une opération appelée automatiquement à la destruction d'une instance
).

• L'opération « finalize » est appelée automatiquement par la machine virtuelle au moment de


la destruction de l'instance par le garbage collector.

protected void finalize()


{
// Code de finalize
}
• Il n'est pas obligatoire de fournir une opération « finalize ».

• Deux opérations sont à connaître :


– [Link]();
– [Link](true);

21/04/2022 Saïd Taktak 55


static
• static: associé à une classe
– Attribut (variable) statique: si on le change, ça change
la valeur pour tous les objets de la classe
– Méthode statique: on la réfère à partir de la classe
• Classe.méthode
• E.g. [Link](2.6): Appel à la méthode sqrt de la classe
Math
• Constante: [Link]
– Dans une classe: static final float PI = 3.14159265358979;
– Une constante n’est pas modifiable

21/04/2022 Saïd Taktak 56


Les Tableaux

21/04/2022 Saïd Taktak 57


Les Tableaux

21/04/2022 Saïd Taktak 58


Les Tableaux

21/04/2022 Saïd Taktak 59


Les matrices

21/04/2022 Saïd Taktak 60


Les matrices

21/04/2022 Saïd Taktak 61


Encapsulation

21/04/2022 Saïd Taktak 62


Encapsulation

21/04/2022 Saïd Taktak 63


Définition : Encapsulation

21/04/2022 Saïd Taktak 64


Les packages

21/04/2022 Saïd Taktak 65


Les packages

21/04/2022 Saïd Taktak 66


Les packages

21/04/2022 Saïd Taktak 67


Encapsulation des classes

21/04/2022 Saïd Taktak 68


Encapsulation des classes

21/04/2022 Saïd Taktak 69


Encapsulation des classes

21/04/2022 Saïd Taktak 70


Encapsulation des attributs

21/04/2022 Saïd Taktak 71


Encapsulation des attributs

21/04/2022 Saïd Taktak 72


Encapsulation des attributs

21/04/2022 Saïd Taktak 73


Encapsulation des attributs

21/04/2022 Saïd Taktak 74


Encapsulation des méthodes

21/04/2022 Saïd Taktak 75


Encapsulation des méthodes

21/04/2022 Saïd Taktak 76


Encapsulation des méthodes

21/04/2022 Saïd Taktak 77


Encapsulation des méthodes

21/04/2022 Saïd Taktak 78


Les méthodes setter and getter

21/04/2022 Saïd Taktak 79


Exemple 1/2

21/04/2022 Saïd Taktak 80


Exemple 2/2

21/04/2022 Saïd Taktak 81


Héritage et polymorphisme

21/04/2022 Saïd Taktak 82


L’héritage (1) : Concept
• La modélisation du monde réel nécessite une
classification des objets qui le composent
• Classification = distribution systématique en
catégories selon des critères précis
• Classification = hiérarchie de classes
• Exemples :
– classification des éléments chimiques
– classification des êtres vivants

Saïd Taktak
21/04/2022 83
L’héritage (2) : exemple
Forme géométrique

Polygone Ellipse

Quadrilatère Triangle Cercle

Rectangle Triangle Triangle


equilateral Rectangle

Carré

Saïd Taktak
21/04/2022 84
L’héritage (3) : définition
• Héritage : mécanisme permettant le partage
et la réutilisation de propriétés entre les objets.
• La relation d’héritage est une relation de
généralisation / spécialisation.
• La classe parente est la superclasse.
• La classe qui hérite est la sous-classe.

Saïd Taktak
21/04/2022 85
L’héritage (3) : représentation
graphique

Superclasse

Lien d’héritage

Sous-classe

Représentation avec UML d’un héritage (simple)

Saïd Taktak
21/04/2022 86
L’héritage avec Java (1)
• Java implémente le mécanisme d'héritage simple
qui permet de "factoriser" de l'information grâce
à une relation de généralisation / spécialisation
entre deux classes.
• Pour le programmeur, il s'agit d'indiquer, dans la
sous-classe, le nom de la superclasse dont elle
hérite.
• Par défaut toutes classes Java hérite de la classe
Object
• L'héritage multiple n'existe pas en Java.
• Mot réservé : extends
Saïd Taktak
21/04/2022 87
L’héritage avec Java (2)
class Personne
{
private String nom;
private Date date_naissance;
// ...
}

class Employe extends Personne


{
private float salaire;
// ...
}

class Etudiant extends Personne


{
private int numero_carte_etudiant;
// ...
}
Saïd Taktak
21/04/2022 88
L’héritage en Java (3)
• Constructeurs et héritage
– par défaut le constructeur d’une sous-classe
appelle le constructeur "par défaut" (celui qui ne
reçoit pas de paramètres) de la superclasse.
Attention donc dans ce cas que le constructeur
sans paramètre existe toujours dans la
superclasse...
– Pour forcer l'appel d'un constructeur précis, on
utilisera le mot réservé super. Cet appel devra être
la première instruction du constructeur.

Saïd Taktak
21/04/2022 89
L’héritage en Java (4)

public class Employe extends Personne public class Personne


{ {
public Employe () {} public String nom, prenom;
public Employe (String nom, public int anNaissance;
String prenom, public Personne()
int anNaissance) {
{ nom=""; prenom="";
super(nom, prenom, anNaissance); }
} public Personne(String nom,
} String prenom,
int anNaissance)
Appel explicite à ce constructeur {
avec le mot clé super [Link]=nom;
[Link]=prenom;
[Link]=anNaissance;
}
Saïd Taktak
21/04/2022 90 }
L’héritage en Java (5)
public class Personne
{ public class Object
public String nom, prenom; {
public int anNaissance; public Object()
public Personne() {
{ … / ...
nom=""; prenom=""; }
} }
public Personne(String nom,
String prenom,
int anNaissance) Appel par défaut dans le constructeur
{ de Personne au constructeur
[Link]=nom; par défaut de la superclasse de
[Link]=prenom; Personne, qui est Object
[Link]=anNaissance;
}
}
Saïd Taktak
21/04/2022 91
Redéfinition de méthodes
• Une sous-classe peut redéfinir des méthodes
existant dans une de ses superclasses (directe ou
indirectes), à des fins de spécialisation.
– Le terme anglophone est "overriding". On parle aussi
de masquage.
– La méthode redéfinie doit avoir la même signature.
class Employe extends Personne class Cadre extends Employe
{ {
private float salaire; redéfinition public calculePrime()
public calculePrime( ) {
{ // ...
// ... }
} // ...
} }
Saïd Taktak
21/04/2022 92
Recherche dynamique des méthodes
(1)
• Le polymorphisme
– Capacité pour une entité de prendre plusieurs formes.
– En Java, toute variable désignant un objet est
potentiellement polymorphe, à cause de l'héritage.
– Polymorphisme dit « d’héritage »
• le mécanisme de "lookup" dynamique :
– déclenchement de la méthode la plus spécifique d’un
objet, c'est-à-dire celle correspondant au type réel de
l'objet, déterminé à l'exécution uniquement (et non le
type de la référence, seul type connu à la compilation, qui
peut être plus générique).
– Cette dynamicité permet d'écrire du code plus générique.

Saïd Taktak
21/04/2022 93
Recherche dynamique des méthodes
(2)
Employe jean = new Employe();
[Link]();

Employe
salaire : Double

calculePrime()

Employe jean = new Cadre();


Cadre
[Link]();

calculePrime()

Saïd Taktak
21/04/2022 94
Surcharge de méthodes (1)
• Dans une même classe, plusieurs méthodes
peuvent posséder le même nom, pourvu qu'elles
diffèrent en nombre et/ou type de paramètres.
– On parle de surdéfinition ou surcharge, on encore en
anglais d’overloading en anglais.
– Le choix de la méthode à utiliser est fonction des
paramètres passés à l'appel.
• Ce choix est réalisé de façon statique (c'est-à-dire à la
compilation).
– Très souvent les constructeurs sont surchargés
(plusieurs constructeurs prenant des paramètres
différents et initialisant de manières différentes les
objets)

Saïd Taktak
21/04/2022 95
Opérateur instanceof
• L'opérateur instanceof confère aux instances une
capacité d'introspection : il permet de savoir si une
instance est instance d'une classe donnée.
– Renvoie une valeur booléenne

if ( ... )
Personne jean = new Etudiant();
else
Personne jean = new Employe();

//...

if (jean instanceof Employe)


// discuter affaires
else
// proposer un stage
Saïd Taktak
21/04/2022 96
Forçage de type / transtypage (1)
• Lorsqu'une référence du type d'une classe désigne
une instance d'une sous-classe, il est nécessaire de
forcer le type de la référence pour accéder aux
attributs spécifiques à la sous-classe.
• 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.
• On utilise également le terme de transtypage
• Similaire au « cast » en C

Saïd Taktak
21/04/2022 97
Forçage de type / transtypage (2)
class Personne A ce niveau pour le
{ compilateur dans la
private String nom; variable « jean » c’est
private Date date_naissance; un objet de la classe
// ... Personne, donc qui
} n’a pas d’attribut
« salaire »
class Employe extends Personne
{
public float salaire; On « force » le type
// ... de la variable « jean »
} pour pouvoir accéder
à l’attribut « salaire ».
Personne jean = new Employe (); On peut le faire car c’est
float i = [Link]; // Erreur de compilation bien un objet Employe
float j = ( (Employe) jean ).salaire; // OK qui est dans cette
variable
Saïd Taktak
21/04/2022 98
L’autoréférence : this (1)
• Le mot réservé this, utilisé dans une méthode,
désigne la référence de l'instance à laquelle le
message a été envoyée (donc celle sur laquelle la
méthode est « exécutée »).
• Il est utilisé principalement :
– lorsqu'une référence à l'instance courante doit être
passée en paramètre à une méthode,
– pour lever une ambiguïté,
– dans un constructeur, pour appeler un autre
constructeur de la même classe.

Saïd Taktak
21/04/2022 99
L’autoréférence : this (2)
class Personne
{ Pour lever l’ambiguïté sur le mot « nom »
public String nom;
Personne (String nom) et déterminer si c’est le nom du paramètre
{ ou de l’attribut
[Link]=nom;
}
}
public MaClasse(int a, int b) {...}
Appelle le constructeur
public MaClasse (int c) MaClasse(int a, int b)
{
this(c,0);
}
Appelle le constructeur
public MaClasse () MaClasse(int c)
{
this(10);
}
Saïd Taktak
21/04/2022 100
Référence à la superclasse
• Le mot réservé super permet de faire référence au constructeur
de la superclasse directe mais aussi à d’autres informations
provenant de cette superclasse.

class Employe extends Personne


{ Appel à la méthode calculPrime()
private float salaire; de la superclasse de Cadre
public float calculePrime()
{
return (salaire * 0,05);
}
// ...
} class Cadre extends Employe
{
public float calculePrime()
{
return ([Link]() / 2);
}
// ...
}
Saïd Taktak
21/04/2022 101
Les classes Abstraites et les Interfaces

21/04/2022 Saïd Taktak 102


1. Idée de base d’une classe abstraite
◼ Par opposition à une classe concrète, une classe abstraite ne peut pas être instancier
◼ L'utilité d'une classe abstraite est de définir un type abstrait qui regroupe des
caractéristiques communes à d'autres types. En effet, elle sert :
 Comme racine pour un sous-arbre d’héritage :
◼ Dans lequel les sous-classes apporteront leurs particularités

◼ Favorise le polymorphisme

 Au partage de certaines descriptions :


◼ Variables d’instances (ou de classes) communes

◼ Méthodes définissant un comportement par défaut

◼ Une classe est définie abstraite par obligation (présence d’au moins une
méthode abstraite) ou par choix pour interdire la création d’objet

21/04/2022 Saïd TaktakOrientée Objet


Cours de Programmation 103
103
2. Définition d’une classe abstraite en JAVA
◼ Une classe abstraite est déclarée avec le mot clé abstract
Exemple : abstract class Document {….}
◼ Une classe abstraite ne peut jamais être instanciée par l'opérateur new
◼ On peut déclarer des références de type classe abstraite
◼ La méthode abstraite est aussi déclarée avec le mot clé abstract.
Exemple : abstract class ObjetGraphique
{abstract float surface ();

}

21/04/2022 Saïd TaktakOrientée Objet


Cours de Programmation 104
104
◼ Si une classe comporte une méthode abstraite elle doit être déclarée abstraite

◼ Une classe abstraite peut ne pas comporter de méthodes abstraites

◼ Toute classe concrète dérivée à partir d'une classe abstraite doit donner un code aux
méthodes abstraites héritées, si non elle doit être déclarée abstraite (l'abstraction
continue)

◼ On ne peut pas combiner les modificateurs abstract et final

21/04/2022 Saïd TaktakOrientée Objet


Cours de Programmation 105
105
3. Les interfaces
• Une interface est une forme particulière de classe qui comporte
uniquement des propriétés abstraites

• Le concept d'interface est proposé par le langage JAVA pour


résoudre le problème de l'héritage multiple

• Une interface peut hériter de plusieurs interfaces en même


temps en utilisant le mot clé extends (héritage multiple)

• Comparée à une classe, une interface correspond à un type


comportant uniquement des méthodes abstraites et des
constantes statiques (on a pas à préciser les modificateurs
abstract, final et static)

• Les interfaces ne sont pas instanciables


21/04/2022 Saïd TaktakOrientée Objet
Cours de Programmation 106
106
• L’utilisation des interfaces permet de :

– Définir (regrouper) des propriétés qui peuvent être


transférées aux classes par un mécanisme particulier
(l’implémentation)
– Garantir aux clients d’une classe que ses instances peuvent
assurer certains services, ou qu’elles possèdent certaines
propriétés (par exemple, être comparables à d’autres
instances)
– Faire du polymorphisme avec des objets dont les classes
n’appartiennent pas à la même hiérarchie d’héritage
(l’interface joue le rôle de la classe mère)

21/04/2022 Saïd TaktakOrientée Objet


Cours de Programmation 107
107
• Une interface est définie d'une manière similaire à une classe
mais en utilisant le mot clé interface

• La syntaxe de déclaration d'une interface est la suivante :


interface NomInterface { … }

Exemples :
interface Edition
{void editer();}
interface Affichage
{int MIN = 0;
int MAX=100;
void afficher();
}

21/04/2022 Saïd TaktakOrientée Objet


Cours de Programmation 108
108
4. Interfaces et héritage

• Une interface peut hériter d'une ou de plusieurs autres


interfaces. Il s'agit d'une extension de propriétés sous forme de
méthodes abstraites et de constantes statiques.
Exemple :
interface InputStream // propriété d'accepter des caractères
{public int read(); }
interface OutputStream // propriété de fournir des caractères
{public void write(int n); }
interface DataStream extends InputStream, OutputStream
{public double readDouble();
public void writeDouble(double x);
}
21/04/2022 Saïd TaktakOrientée Objet
Cours de Programmation 109
109
[Link]émentation d’une interface

• Une classe peut implémenter plusieurs interfaces, c'est à dire


avoir les même caractéristiques (ou propriétés) définies au
niveau de ces interfaces. Réciproquement, la même interface
peut être implémentée par plusieurs classes

• L'implémentation est une forme d'héritage multiple

• Il est possible de combiner, lors de la définition d'une classe,


l'héritage et l'implémentation d'interfaces

21/04/2022 Saïd TaktakOrientée Objet


Cours de Programmation 110
110
Exemple :

interface Printable // propriété d'être imprimé


{public void print(); }
class MonStream implements DataStream, Printable
{
public void print() { …}
public int read() { …}
public void write(int n) { …}
public double readDouble(){ …}
public void writeDouble(double x) { …}
}

21/04/2022 Saïd TaktakOrientée Objet


Cours de Programmation 111
111
[Link] références de type interface
• Il est possible de déclarer des références de type interface afin
de désigner des objets qui implémentent l'interface en
question. Les objets désignés peuvent être de types différents

• L'opérateur instanceof peut être utilisé pour savoir si un objet


implémente une interface donnée

21/04/2022 Saïd TaktakOrientée Objet


Cours de Programmation 112
112
Les collections

21/04/2022 Saïd Taktak 113


Collection de données
• Définition: « Une collection de données est un conteneur
d’éléments de même type qui possède un protocole particulier
pour l’ajout, le retrait et la recherche d’éléments »

• Exemples: pile, queue (file d’attente), séquence, ensemble et


multi-ensemble, fonction (tableau associatif, dictionnaire ou map
en anglais)

• Ordre dans les collections:


– Les ensembles et les multi-ensembles n’ont pas d’ordre
– Les autres collections ont un ordre « naturel » lié à l’ordre
dans lequel les éléments ont été insérés dans la collection

• Les classes collection sont définies dans le package [Link]


• Définies à partir de deux Interfaces Java
– Collection
– Map
21/04/2022 Saïd Taktak 114
Les collections en Java - Collection
• Définies à partir de la racine Interface Collection <E>
ou E est le type des éléments de la collection

• Les classes collection (qui implémentent l’interface Collection) sont


nombreuses dans l’API Java:
AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList,
AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList,
BeanContextServicesSupport, BeanContextSupport,
ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList,
CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet,
JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue,
LinkedHashSet, LinkedList, PriorityBlockingQueue, PriorityQueue, RoleList,
RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector

• Nous verrons la classe collection suivante


– ArrayList (Vector)

21/04/2022 Saïd Taktak 115


Les collections en Java – Map
• Les collections de type fonction (map), tableau associatif ou dictionnaire en
Java, sont définies à partir de la racine Interface Map <K, V> (et non
Collection <E> )

• La raison est qu’une telle collection est un ensemble de paires d’objets,


chaque paire associant un objet de l’ensemble de départ K à un objet de
l’ensemble d’arrivée V ; on parle de paires (clé, valeur)

• Application: chaque fois qu’il faut retrouver une valeur en fonction d’une clé,
p.e. dans un dictionnaire: mot -> définition du mot; dans un annuaire: nom
de personne -> adresse et n de tél; localisation: avion -> aéroport, etc.

• Les classes Map: AbstractMap, Attributes, AuthProvider,


ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap,
Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons,
Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport,
TreeMap, UIDefaults, WeakHashMap

21/04/2022 Saïd Taktak 116


la généricité en Java
• A partir de JDK 5.0, les collections sont définies par le biais de
classes génériques

• Une classe générique est une classe qui définit ses méthodes de
manipulation de structure de données sans préciser le type de ses
éléments. Idée: un ensemble de X, une liste d’Y, ...

• Par exemple, on pourrait définir une classe Pile<E> qui définit les
méthodes void empile(E e), E sommet(), void depile()

• Le type E est définit un moment de la déclaration d’un objet de la


classe Pile, p.e.
– Pile<int> p1 // une pile d’entiers
– Pile<String> p2 // une pile de chaîne de caractères
– Instanciation
– p1 = new Pile<int>;
– p2 = new Pile<String>;
21/04/2022 Saïd Taktak 117
ArrayLists

21/04/2022 Saïd Taktak 118


21/04/2022 Saïd Taktak 119
21/04/2022 Saïd Taktak 120
21/04/2022 Saïd Taktak 121
21/04/2022 Saïd Taktak 122
21/04/2022 Saïd Taktak 123
21/04/2022 Saïd Taktak 124
21/04/2022 Saïd Taktak 125
21/04/2022 Saïd Taktak 126
21/04/2022 Saïd Taktak 127
Les itérateurs
• Les itérateurs sont des objets qui permettent
de "parcourir" un par un les différents éléments
d’une collection.
• Il existe deux sortes d’itérateurs :
– monodirectionnels : le parcours de la collection se fait d’un
début vers une fin ; on ne passe qu’une seule fois sur
chacun des éléments ;
– bidirectionnels : le parcours peut se faire dans les deux sens
; on peut avancer et reculer à sa guise dans la collection.
L’itérateur unidirectionnel

• L’itérateur unidirectionnel s’obtient par l’appel


de la méthode iterator ():
Iterator<E> it= [Link]()

Collection d’objets Point

Ordre de parcours
Position de lecture
initiale
• Iterator<E> est une interface définie dans le
package [Link]
public interface Iterator<E> { E next();
boolean hasNext();
void remove(); }// Optional

• E next() revoie l’objet se trouvant devant la


position de lecture puis avance l’itérateur à la
position de lecture suivante
Point p= [Link]();
Elle permet d’effectuer une lecture séquentielle de
la collection.
• boolean hasNext() renvoie true s’il y a encore au
moins un élément devant la position de lecture.
Exemple :

Iterator<Point> it= [Link]();


while ([Link]()) { Point p= [Link]();
[Link](p);}

• void remove() supprime de la collection le


dernier objet renvoyé par next().
Exemple :

Iterator<Point> it= [Link]();


while ([Link]()) { if( [Link]().getY()==10)
[Link]();}
L’itérateur bidirectionnel
• Il est applicable à certains types de collections tels que les
listes chaînées et les vecteurs dynamiques
• C’est un objet de type ListIterator<E>, une interface qui
hérite de Iterator<E>.
 Il dispose des méthodes next(), hasNext() et remove().
• Il dispose aussi des méthodes :
– E previous() : renvoie l’élément précédant la position de lecture
courante et recule l’térateur sur la position précédente.
– boolean hasPrevious() : permet de savoir si l’on est ou non en
début de collection, c.-à-d. si la position courante dispose ou
non d’une position précédente.
– void add (E ob) : ajoute l’objet en paramètre devant la position
de lecture courante et avance l’itérateur d’une position.
– void set (E ob) : remplace par l’objet en paramètre l’élément qui
se trouve devant la position de lecture courante. Cette position
n’est pas modifiée.
Les Exceptions

21/04/2022 Saïd Taktak 133


[Link]ématique
◼ Avec une programmation classique, une grande partie du code
est réservée à la détection et à la gestion des erreurs ou au
traitement de cas exceptionnels (division par zéro, impossibilité
d'ouvrir un fichier, mauvaise saisie de données,…)

◼ Ces portions de code sont toujours fortement imbriquées dans le


reste du code et le programmeur a souvent des difficultés à
déterminer ce qu'il doit faire dans tel ou tel cas

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 134
◼ Plusieurs inconvénients sont alors constatés :
 La lisibilité du code diminue

 Certains cas exceptionnels sont oubliés ou mal traités

 Certaines erreurs d'exécution causent des résultats erronés ou


provoquent des interruptions non avisées

◼ Solution : séparer les instructions qui traitent les exceptions du


reste du code

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 135
[Link] de la gestion des exceptions en JAVA
• Définir chaque type d'exception sous forme d'une classe (en
respectant une hiérarchie entre les classes)
• Chaque méthode pouvant rencontrer un ou plusieurs types
d'exception, doit annoncer, au niveau de son entête, la ou les classes
d'exception appropriées
• Lors de la rencontre d'un cas d'exception, la méthode en question
lance (crée et diffuse) un objet de la classe d'exception appropriée
• Chaque bloc d'instructions comportant l'appel d'une méthode
susceptible de lancer un objet exception doit être surveillé
• Chaque bloc surveillé est suivi par des blocs qui captent et traitent les
objets exception à raison d'un bloc de traitement par type
d'exception attendue

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 136
[Link] d’exception

• Certaines exceptions sont prédéfinies par JAVA selon une hiérarchie


de classes. Cependant, le programmeur peut définir ses propres
classes d'exception. Toute classe définissant une exception doit être
dérivée de la classe [Link]

• Il existe des exceptions d'erreurs prédéfinies par JAVA. Leurs classes


sont dérivées de la classe [Link]. Ces exceptions concernent
des erreurs internes de la Machine Virtuelle Java : il est fortement
déconseillé de les intercepter

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 137
Object

Throwable

Error Exception

LinkageError NoSuchMethodException IOException

ThreadDeath IllegalAccessException

VirtualMachineError RuntimeException

ArithmeticException IndexOutOfBoundsException

NullPointerException

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 138
[Link] d’une exception

• Une exception est déclenchée avec le mot clé throw qui lance un objet
de la classe exception indiquée après l'avoir crée par new
Exemple :
class MonException extends Exception
{ }
class TestException
{

if ( erreurDétectée ) throw new MonException();

}

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 139
[Link] d’une exception
• Toute méthode qui peut propager des exceptions doit contenir dans
la déclaration de son entête, le mot clé throws suivi des noms de ces
exceptions
Exemple :
public class Temps
{private int heures, minutes, secondes;
public Temps (int h, int m, int s)
{heures = h; minutes = m; secondes = s; }
public static void main(String args[])
{int h,m,s;
h=[Link](); m=[Link](); s=[Link]();
Temps t = new Temps (h, m, s); }
}
Cours de Programmation Orientée Objet
21/04/2022 Saïd Taktak 140
• Soit la classe d’exception suivante :
class TempsException extends Exception
{
public String message;
public TempsException ( String m)
{ message = m;}
}

• Modification du constructeur de la classe Temps de manière à ce qu'il


lance et propage une exception de type TempsException si les heures,
les minutes ou les secondes rendent le temps valide :

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 141
public Temps (int h, int m, int s) throws TempsException
{if (h>= 0 && h<=23)
heures = h;
else
throw new TempsException(Heures erronées);
if (m>= 0 && m<=59)
minutes = m;
else
throw new TempsException(Minutes erronées);
if (s>= 0 && s<=59)
secondes = s;
else
throw new TempsException(Secondes erronées);
}

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 142
6. Capture et traitement d’une exception
• La gestion d'une exception (ou d'un objet exception déjà lancé)
nécessite :
• La surveillance des instructions susceptibles de lancer des objets
exception en les mettant dans un bloc try{ }
• La capture de chaque objet exception lancé dans un bloc catch { }
approprié au type de l'exception

Exemple :
• Modification du code de la méthode main() de manière à ce que
l'exception TempsException soit traitée en affichant le message
suivant : "Temps Invalide" suivi par la raison de l’erreur

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 143
public static void main(String args[])
{ int h, m, s;
try
{h=[Link]();
m=[Link]();
s=[Link]();
Temps t = new Temps(h,m,s);
}
catch (TempsException e)
{ [Link]("Temps Invalide : " +
+[Link]);
}
}

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 144
• Il est possible de capturer dans un seul bloc catch plusieurs
exceptions, si la classe d'exception indiquée est une classe mère de
toutes les exceptions concernées
Exemple :
try { … }
catch (Exception e) //capturer tout type d'exception
{… }

• Les blocs catch{ } doivent être présentés selon la hiérarchie des


classes d'exception en question : du type élémentaire vers le type
général (sinon il y aura une erreur de compilation)

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 145
Exemple :

try { … }
catch (IOException e)
//capturer toutes les exceptions I/O
{…}
catch ( PasDeSolution e )
{…}

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 146
• Une méthode qui relance un objet exception, doit déclarer la
propagation de cet objet dans son entête

Exemple :
void methode() throws IOException
{
try
{ … }
catch ( IOException e )
{ … throw e; }
}

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 147
• Il est possible de définir un bloc finally { } qui, contrairement au
catch, n'est pas obligatoire, et qui permet de spécifier du code qui
sera exécuté dans tous les cas, qu'une exception survienne ou pas.

• Ce code sera exécuté même si une instruction return est exécutée


dans le catch ou le try !

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 148
Exemple :

try {
// Ouvrir un fichier
// Lire et écrire des données
}
catch ( IOException e )
{
[Link](e) ;
}
finally
{
// Fermeture du fichier
}

Cours de Programmation Orientée Objet


21/04/2022 Saïd Taktak 149

Vous aimerez peut-être aussi