Vous êtes sur la page 1sur 57

Outline

Modélisation et programmation orientée objet

GSTR1 - GM1

R.J.

Printemps 2023

R.J. Modélisation et programmation orientée objet 1/57


Outline

4 Java (suite)

R.J. Modélisation et programmation orientée objet 2/57


POO en Java
Java
Aller plus loin avec Java

POO en Java
(suite)

R.J. Modélisation et programmation orientée objet 3/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 10

Valeur carte.java :
public enum Valeur carte {
AS, DEUX, TROIS, QUATRE, CINQ, SIX, SEPT, HUIT, NEUF, DIX, VALET,
DAME, ROI;
}
Enseigne carte.java :
public enum Enseigne carte {
TREFLE, CARREAU, COEUR, PIQUE;
}
Carte.java :
public class Carte {
private Valeur carte vc;
private Enseigne carte ec;
public Carte() {}
public Carte(Valeur carte i vc, Enseigne carte i ec) {vc = i vc; ec = i ec;}
private String majuscule minuscules(String ch) {
String s1, s2;

R.J. Modélisation et programmation orientée objet 4/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 10

s1 = ch.substring(0, 1); s2 = ch.substring(1);


return s1.concat(s2.toLowerCase());
}
public void afficher carte() {
System.out.println(majuscule minuscules(vc.name()) + ” de ” + majus-
cule minuscules(ec.name()) + ”.”);
}
public void set Valeur carte(Valeur carte v vc) {vc = v vc;}
public void set Enseigne carte(Enseigne carte v ec) {ec = v ec;}
}
Exercice10.java :
import java.util.Scanner;
public class Exercice10 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s;
System.out.print(”Veuillez choisir une valeur de carte parmi : ”);
for (Valeur carte vc : Valeur carte.values()) System.out.print(vc + ” ”);
R.J. Modélisation et programmation orientée objet 5/57
POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 10

System.out.print(”: ”); s = sc.nextLine();


Valeur carte at1 = Valeur carte.valueOf(s);
System.out.print(”Veuillez choisir une enseigne de carte parmi : ”);
for (Enseigne carte ec : Enseigne carte.values()) System.out.print(ec + ” ”);
System.out.print(”: ”); s = sc.nextLine();
Enseigne carte at2 = Enseigne carte.valueOf(s);
Carte c1 = new Carte(at1, at2);
/*Notez bien qu’on doit créer ici c0 et c2 en utilisant le constructeur par défaut.
Sinon si à la place on veut créer directement c0 et c2 avec le constructeur
normal à l’intérieur d’un des blocs if, else if, ou else qui suivent, alors le com-
pilateur générera après deux erreurs par rapport à l’affichage de c0 et de c2.*/
Carte c0 = new Carte();
Carte c2 = new Carte();
Valeur carte[] tvc = Valeur carte.values();
Enseigne carte[] tec = Enseigne carte.values();
if(at1 == Valeur carte.AS) {
c0.set Valeur carte(Valeur carte.ROI);
c0.set Enseigne carte(tec[(at2.ordinal() - 1 + tec.length) % tec.length]);/*On

R.J. Modélisation et programmation orientée objet 6/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 10

traite le cas où at2 est Enseigne carte.TREFLE.*/


c2.set Valeur carte(tvc[at1.ordinal() + 1]);
c2.set Enseigne carte(at2);
}
else if(at1 == Valeur carte.ROI) {
c0.set Valeur carte(tvc[at1.ordinal() - 1]);
c0.set Enseigne carte(at2);
c2.set Valeur carte(Valeur carte.AS);
c2.set Enseigne carte(tec[(at2.ordinal() + 1) % tec.length]);/*On traite le cas
où at2 est Enseigne carte.PIQUE.*/
}
else {
c0.set Valeur carte(tvc[at1.ordinal() - 1]);
c0.set Enseigne carte(at2);
c2.set Valeur carte(tvc[at1.ordinal() + 1]);
c2.set Enseigne carte(at2);
}
c0.afficher carte();

R.J. Modélisation et programmation orientée objet 7/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 10

System.out.print(”===>> ”); c1.afficher carte();


c2.afficher carte();
}
}

R.J. Modélisation et programmation orientée objet 8/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 10

Voici un exemple d’exécution :

R.J. Modélisation et programmation orientée objet 9/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 11

Jour.java :
public enum Jour {
LUNDI (true, 8),
MARDI (true, 8),
MERCREDI (true, 4),
JEUDI (true, 8),
VENDREDI (true, 8),
SAMEDI (false, 0),
DIMANCHE (false, 0);
private boolean etudier;
private int volume horaire;
Jour(boolean i etudier, int i volume horaire) {
etudier = i etudier; volume horaire = i volume horaire;
}
public void afficher jour() {
System.out.print(name() + ” est un jour ”);
if(etudier) System.out.println(”d’étude ; ” + volume horaire + ” heures sont pro-
grammées en ce jour.”); else System.out.println(”de repos, comportant ” + (24-
volume horaire) + ” heures libres.”);
R.J. Modélisation et programmation orientée objet 10/57
POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 11

}
}
Exercice11.java :
import java.util.Scanner;
public class Exercice11 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Jour[] tj = Jour.values();
int i;
System.out.print(”Veuillez choisir entre ”);
for (i=0; i<tj.length; i++) System.out.print(tj[i] + ” ”);
System.out.print(”: ”); String s = sc.nextLine();
Jour j = Jour.valueOf(s);
for (i=j.ordinal(); i<tj.length; i++) tj[i].afficher jour();
for (i=0; i<j.ordinal(); i++) tj[i].afficher jour();
}
}

R.J. Modélisation et programmation orientée objet 11/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 11

Voici un exemple d’exécution :

R.J. Modélisation et programmation orientée objet 12/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 12

Ensemble.java :
public class Ensemble<TypeG> {
private TypeG val 1;
private TypeG val 2;
private TypeG val 3;
private TypeG val 4;
public Ensemble(TypeG i val 1, TypeG i val 2, TypeG i val 3, TypeG i val 4) {
val 1 = i val 1; val 2 = i val 2;
val 3 = i val 3; val 4 = i val 4;
}
public void afficher ensemble() {
System.out.println(”{” + val 1 + ”, ” + val 2 + ”, ” + val 3 + ”, ” + val 4 + ”}”);
}
public void set val 1(TypeG v val 1) {val 1 = v val 1;}
public void set val 2(TypeG v val 2) {val 2 = v val 2;}
public void set val 3(TypeG v val 3) {val 3 = v val 3;}
public void set val 4(TypeG v val 4) {val 4 = v val 4;}
public void melanger ensemble() {

R.J. Modélisation et programmation orientée objet 13/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 12

if ((val 1 == val 2) && (val 1 == val 3) && (val 1 == val 4)) Sys-
tem.out.println(”L’ensemble est homogène ; il n’y a rien à mélanger.”); else
{
TypeG tmp;
tmp = val 1; val 1 = val 4; val 4 = tmp;
tmp = val 2; val 2 = val 3; val 3 = tmp;
System.out.println(”L’ensemble est hétérogène ; il vient d’être mélangé.”);
}
}
}
Exercice12.java :
public class Exercice12 {
public static void main(String[] args) {
Ensemble<Integer> e1 = new Ensemble<Integer>(7,7,7,7);
Ensemble<Float> e2 = new Ensemble<Float>(0.5f,8.0f,66.43f,9.7f);
Ensemble<Boolean> e3 = new Ensemble<Boolean>(false,true,false,true);
Ensemble<Character> e4 = new Ensemble<Character>(’W’,’W’,’W’,’W’);

R.J. Modélisation et programmation orientée objet 14/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 12

Ensemble<String> e5 = new Ensemble<String>(”bonjour”,”bonsoir”,”bonjour”


,”bonjour”);
e1.afficher ensemble(); e1.melanger ensemble(); e1.afficher ensemble();
System.out.println();
e2.afficher ensemble(); e2.melanger ensemble(); e2.afficher ensemble();
System.out.println();
e3.afficher ensemble(); e3.melanger ensemble(); e3.afficher ensemble();
System.out.println();
e4.afficher ensemble(); e4.melanger ensemble(); e4.afficher ensemble();
System.out.println();
e5.afficher ensemble(); e5.melanger ensemble(); e5.afficher ensemble();
System.out.println();
e5.set val 1(”salut”); e5.set val 2(”salut”);
e5.set val 3(”salut”); e5.set val 4(”salut”);
e5.afficher ensemble(); e5.melanger ensemble(); e5.afficher ensemble();
}
}

R.J. Modélisation et programmation orientée objet 15/57


POO en Java
Java
Aller plus loin avec Java

Solution de l’exercice 12

Voici le résultat de l’exécution :

R.J. Modélisation et programmation orientée objet 16/57


POO en Java
Java
Aller plus loin avec Java

Aller plus loin avec Java

R.J. Modélisation et programmation orientée objet 17/57


POO en Java
Java
Aller plus loin avec Java

La comparaison des chaı̂nes de caractères

Rappelez-vous qu’une variable de type chaı̂ne de caractères peut être


créée dans une classe selon deux syntaxes différentes :
– – String nom variable;
– – String nom variable = new String();
La première syntaxe est dite littérale. La deuxième syntaxe utilise
l’opérateur new.
Lorsqu’on crée une variable de type chaı̂ne de caractères selon la syn-
taxe littérale et qu’on veut lui attribuer une valeur, la JVM recherche
dans une zone mémoire spéciale appelée pool de chaı̂nes de caractères
(string pool) si cette valeur existe déjà ou pas dans celle-ci.
Si la valeur existe, alors la JVM fera en sorte que la variable ”pointe” vers
cette valeur. Si elle n’existe pas, alors la valeur sera ajoutée au pool de
chaı̂nes de caractères et la variable pointera vers elle.
En stockant une seule copie de toute valeur dans le pool de chaı̂nes de
caractères, la JVM optimise la quantité de mémoire allouée aux chaı̂nes
de caractères.

R.J. Modélisation et programmation orientée objet 18/57


POO en Java
Java
Aller plus loin avec Java

La comparaison des chaı̂nes de caractères

Le pool de chaı̂nes de caractères est donc une région spéciale de la


mémoire qui sert à stocker les chaı̂nes de caractères littérales, qui pour-
ront éventuellement être réutilisées après dans notre programme. Plus
précisément, le pool de chaı̂nes de caractères se trouve dans une partie
de la mémoire utilisée par la JVM qui s’appelle la mémoire heap (heap
memory). Cette dernière est utilisée pour les opérations d’exécution.
Notez bien que la comparaison de deux variables de type chaı̂ne de car-
actères créées selon la syntaxe littérale, peut être faite avec l’opérateur
== (comme ça été fait dans la solution de l’exercice 12).
Sinon lorsqu’on crée une variable de type chaı̂ne de caractères avec
l’opérateur new, la JVM ne stockera pas la valeur de la variable dans le
pool de chaı̂nes de caractères, elle utilisera plutôt un espace mémoire
réservé à part, comme on peut voir dans l’exemple suivant :

R.J. Modélisation et programmation orientée objet 19/57


POO en Java
Java
Aller plus loin avec Java

La comparaison des chaı̂nes de caractères

R.J. Modélisation et programmation orientée objet 20/57


POO en Java
Java
Aller plus loin avec Java

La comparaison des chaı̂nes de caractères

Notez bien que deux variables de type chaı̂ne de caractères créées avec
l’opérateur new et stockant une même valeur, pointeront vers deux em-
placements mémoire différents.
De ce fait, le code Java suivant affichera false dans l’écran :
String t1 = new String(”Salut”);
String t2 = new String(”Salut”);
System.out.println(t1 == t2);
Donc l’opérateur == ne peut pas être utilisé dans ce cas là pour faire une
comparaison de valeurs.

R.J. Modélisation et programmation orientée objet 21/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – Préambule

Comme vous le savez, pour pouvoir utiliser un tableau il faut le créer


au préalable en définissant sa taille. Les tailles des tableaux sont des
valeurs fixes qu’on ne peut pas modifier après. Si on ne connait pas à
l’avance le nombre de valeurs à stocker, il se pourra donc qu’on déclare
un tableau ayant une taille beaucoup plus grande ou beaucoup plus pe-
tite que ce dont on a besoin. Par conséquent, soit on gaspillera de
l’espace de mémoire, ou soit on sera incapable d’accomplir ce qui est
attendu.
Java nous permet heureusement d’utiliser des collections d’objets à la
place des tableaux. Une collection d’objets est une structure de données
dynamique, i.e., sa taille n’est pas prédéfinie à l’avance, dans laquelle on
peut stocker n’importe quelles informations.
Il y a plusieurs types et sous-types de collection d’objets. On verra dans
cette partie du cours les sous-types les plus utilisés.

R.J. Modélisation et programmation orientée objet 22/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – Préambule

Les collections d’objets du type List peuvent contenir :


– – n’importe quel types de valeurs (les nombres entiers, les nombres
réels, les booléens, les caractères, les chaı̂nes de caractères, les objets
des classes),
– – des valeurs null,
– – des éléments dupliqués.
Ce sont des structures de données ordonnées, dans lesquelles les
éléments ont chacun un indice qui indique la position de l’élément dans
la structure. L’indice du premier élément d’une liste est 0. On peut
accéder aux éléments d’une liste à travers leurs indices.
LinkedList, ArrayList et Vector sont des sous-types de List.
Les collections d’objets du type Set sont restrictives, i.e., un élément ne
peut pas être dupliqué dans la collection. Un Set est donc une collection
d’éléments uniques.
Les Set sont particulièrement adaptés pour manipuler une grande quan-
tité de données. Si on a donc une grande quantité de données à traiter,
alors on optera pour un Set.

R.J. Modélisation et programmation orientée objet 23/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – Préambule

HashSet, TreeSet, et LinkedHashSet sont des sous-types de Set.


Les collections d’objets du type Map associent à chacune des valeurs
stockées une clé. Les clés permettent de ranger et de retrouver les
valeurs de la Map.
Une Map ne peut pas contenir deux fois une même clé. Par contre elle
peut contenir plusieurs fois une valeur donnée.
On utilise une MAP quand on veut avoir une structure de données qui
permet d’accéder aux valeurs via des clés de recherche.
HashMap, TreeMap, LinkedHashMap, Hashtable et WeakHashMap sont
des sous-types de Map.

R.J. Modélisation et programmation orientée objet 24/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – LinkedList

Une liste chaı̂née (linked list) est une liste dont chaque élément est lié à
ses deux éléments adjacents par une référence. Chaque élément de la
liste possède en effet une référence vers l’élément qui le précède et une
référence vers l’élément qui le suit, à l’exception du premier élément de
la liste (dont l’élément précédent vaut null) et du dernier élément de la
liste (dont l’élément suivant vaut null).
LinkedList est dotée de plusieurs méthodes prédéfinies. On va en
découvrir les plus utiles dans l’exemple qui suit :

R.J. Modélisation et programmation orientée objet 25/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – LinkedList

R.J. Modélisation et programmation orientée objet 26/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – LinkedList

R.J. Modélisation et programmation orientée objet 27/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – LinkedList

R.J. Modélisation et programmation orientée objet 28/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – LinkedList

Si par défaut une liste peut contenir n’importe quel type de valeurs,
sachez qu’on peut la limiter à uniquement un seul type donné.
Prenons un exemple d’illustration :

R.J. Modélisation et programmation orientée objet 29/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – LinkedList

R.J. Modélisation et programmation orientée objet 30/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – LinkedList

R.J. Modélisation et programmation orientée objet 31/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – ArrayList

Un ArrayList est une liste qui est implémentée en utilisant un tableau


extensible. Un ArrayList s’utilise presque pareillement qu’une LinkedList,
comme en témoigne l’exemple suivant :

R.J. Modélisation et programmation orientée objet 32/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – ArrayList

R.J. Modélisation et programmation orientée objet 33/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – ArrayList

R.J. Modélisation et programmation orientée objet 34/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – ArrayList

Attention : Les complexités en temps des méthodes de ArrayList et de


LinkedList diffèrent :
– – Les méthodes add de LinkedList sont plus rapides que les méthodes
add de ArrayList,
– – les méthodes remove de LinkedList sont plus rapides que les
méthodes remove de ArrayList,
– – les méthodes get de ArrayList sont plus rapides que les méthodes
get de LinkedList,
– – la méthode set de ArrayList est plus rapide que la méthode set de
LinkedList.
Donc si on a besoin de faire beaucoup d’ajout et/ou de suppression
de données dans notre programme, alors il faudra opter pour une
LinkedList. Si par contre on a besoin de beaucoup récupérer et/ou mod-
ifier des données dans notre programme, alors il faudra opter pour un
ArrayList.
Notez bien sinon qu’une LinkedList nécessite beaucoup plus d’espace
mémoire pour stocker ses informations qu’un ArrayList.

R.J. Modélisation et programmation orientée objet 35/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – Hashtable

Une table de hachage (hash table) est une Map où on peut stocker
n’importe quelle valeur non-nulle. Les clés ne peuvent pas elles aussi
valoir null.
Sachez qu’une Hashtable peut être utilisée dans plusieurs threads a
sans qu’il y ait un risque de conflit de données.
Comme tout autre sous-type de collections, Hashtable est dotée de
plusieurs méthodes prédéfinies. On va en découvrir les plus utiles dans
l’exemple qui suit :
a
Les threads constituent un mécanisme de Java, qui permet de répartir différents
traitements d’un même programme en plusieurs parties distinctes qui vont s’exécuter
simultanément.

R.J. Modélisation et programmation orientée objet 36/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – Hashtable

R.J. Modélisation et programmation orientée objet 37/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – Hashtable

R.J. Modélisation et programmation orientée objet 38/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – Hashtable

R.J. Modélisation et programmation orientée objet 39/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – Hashtable

Remarque : HashMap est similaire à Hashtable ; elles sont équivalentes


à peu de choses près. En fait, on peut avoir dans une HashMap une
seule clé nulle et autant de valeurs nulles qu’on voudra, et HashMap ne
s’utilise pas dans plusieurs threads.

R.J. Modélisation et programmation orientée objet 40/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – HashSet

HashSet est le sous-type de Set qui est le plus utilisé, car généralement
il est le plus performant en temps d’accès. Un ensemble de hachage
(hash set) est un ensemble qui peut contenir une valeur nulle.
Notez bien que si on ajoute dans un HashSet une valeur qui y existe
déjà, alors l’ancienne occurrence de cette valeur sera écrasée par la
nouvelle occurrence. Notez bien également que l’ordre d’affichage des
valeurs d’un HashSet peut ne pas coı̈ncider avec leur ordre d’ajout.
Voici un exemple d’utilisation d’un HashSet :

R.J. Modélisation et programmation orientée objet 41/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – HashSet

R.J. Modélisation et programmation orientée objet 42/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – HashSet

R.J. Modélisation et programmation orientée objet 43/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – HashSet

R.J. Modélisation et programmation orientée objet 44/57


POO en Java
Java
Aller plus loin avec Java

Les collections d’objets – HashSet

Remarque : Si on a besoin d’avoir un ensemble qui soit constamment


trié, alors il faudra opter pour un TreeSet.

R.J. Modélisation et programmation orientée objet 45/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

Les fichiers permettent de stocker des informations d’une manière per-


manente sur les supports de stockage (disques durs et clés USB) pour
les exploiter ultérieurement ; alors que les variables (espaces dans la
mémoire vive) disparaissent à la fin des programmes.
Avant de lire/écrire d’/dans un fichier, on se doit de l’ouvrir bien entendu.
Et quand on aura fini d’utiliser le fichier, on se devra de le fermer.
Nous allons prendre un premier exemple illustratif qui montre comment
est-ce qu’on peut ouvrir et lire le contenu d’un fichier textuel :

R.J. Modélisation et programmation orientée objet 46/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

R.J. Modélisation et programmation orientée objet 47/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

R.J. Modélisation et programmation orientée objet 48/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

R.J. Modélisation et programmation orientée objet 49/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

L’exemple suivant montre comment est-ce qu’on peut créer un nouveau


fichier textuel et y écrire un contenu :

R.J. Modélisation et programmation orientée objet 50/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

R.J. Modélisation et programmation orientée objet 51/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

R.J. Modélisation et programmation orientée objet 52/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

Ce dernier exemple montre comment est-ce qu’on peut ajouter un nou-


veau contenu à la fin d’un fichier textuel et comment modifier une partie
de son contenu original :

R.J. Modélisation et programmation orientée objet 53/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

R.J. Modélisation et programmation orientée objet 54/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

R.J. Modélisation et programmation orientée objet 55/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

R.J. Modélisation et programmation orientée objet 56/57


POO en Java
Java
Aller plus loin avec Java

Les fichiers

Remarque : Notez bien que la tête de lecture-écriture se déplace après


chaque lecture du fichier traité et après chaque écriture dans celui-ci.

R.J. Modélisation et programmation orientée objet 57/57

Vous aimerez peut-être aussi