Poo2 1
Poo2 1
Poo2 1
A. GUEDDES
Université de Sousse
ISITCom
Sousse 2023/2024
Objectifs : Cet enseignement est conçu pour les étudiants qui n’ont pas encore eu
l’occasion d’explorer la Programmation Orientée Objet. Il vise à introduire les
concepts fondamentaux de ce paradigme de programmation et à illustrer leur mise
en pratique en utilisant le langage Java.
Contenus abordés :
Introduction aux concepts fondamentaux : modularité, réutilisation, langages
orientés objet.
Compréhension des notions d’objet et de classe : création d’instances,
utilisation ; utilisation des constructeurs et destructeurs ; gestion des attributs
et des méthodes, surcharge des méthodes ; copie et comparaison d’objets.
Exploration des concepts d’encapsulation, de droits d’accès, de paquetages ;
approfondissement de la composition et de l’héritage.
Premiers pas dans l’apprentissage du langage Java POO.
Langages utilisés : Java
Introduction
5 L’implémentation
Traduction de la conception en code dans un langage de programmation, en
une base de données, etc.
6 Les tests
Vérification de la correctitude de l’implémentation.
7 La validation
Vérification que le système correspond aux besoins.
8 La maintenance et l’évolution pendant la phase d’exploitation
La qualité d’un logiciel peut être évaluée en fonction des critères suivants :
1 Exactitude : la capacité d’un programme à produire les résultats souhaités
conformément aux spécifications.
2 Robustesse : la capacité à maintenir un comportement adéquat même lorsque
l’utilisateur s’éloigne des conditions d’utilisation normales.
3 Extensibilité : la facilité avec laquelle un programme peut être adapté pour
répondre à l’évolution des spécifications.
4 Réutilisabilité : la possibilité d’utiliser des parties du logiciel pour résoudre
d’autres problèmes similaires.
5 Portabilité : la facilité avec laquelle le logiciel peut être déployé et utilisé dans
différentes configurations.
6 Efficacité : la mesure du temps d’exécution et de la consommation des
ressources.
Important
Lors de l’extension et de la réutilisation du code, des modifications peuvent être
nécessaires ⇒ peut potentiellement perturber les modules existants.
L’approche objet
Avantage
=⇒ L’évolution du système ne remet en cause que l’aspect dynamique, sans
affecter la structure des objets.
1 En programmation procédurale :
Décomposition des tâches en sous-tâches.
2 En programmation orientée objet :
Identification des acteurs (les entités comportementales) du problème.
Détermination de la façon dont ces acteurs doivent interagir pour résoudre le
problème.
Définition
Objet = Etat + Comportement [+ Identité]
- BMW - Foulen
- iX3 Etat - Foulani Etat
- 51 Km/H - 25 ans
… …
Pour résumé
Pour résumé
Un objet est une entité autonome regroupant un état et les fonctions
permettant de manipuler cet état.
Un attribut est l’une des variables de l’état d’un objet.
Regroupement en Classes
Classe et Instance
Définition
Une classe définit un ensemble d’objets ayant des propriétés communes. Les
objets d’une même classe partagent des attributs et des méthodes.
Une classe peut être considérée comme un modèle d’objet.
Une instance d’une classe est l’un des objets représentant la classe.
Nom de la classe
- Attribut1 : type
- Attribut2 : type
- Attribut3 : type
Représentation gra-
…
phique d’une classe
+ Mèthode1(...) : type
+ Mèthode2(...) : type
+ Mèthode3(...) : type
…
1 À partir d’un cahier des charges, commencez par établir une liste de
mots-clés. Chaque mot-clé peut potentiellement être une classe.
2 Réduisez la liste en supprimant les synonymes et les classes non
pertinentes pour votre application.
3 Gardez à l’esprit que les classes peuvent évoluer au fur et à mesure de
l’implémentation. Vous pouvez ajouter de nouvelles classes au besoin pour
affiner votre liste de classes.
Exemple :
Les Administrateurs doivent pouvoir créer un nouvel emploi du temps en
spécifiant un nom (par exemple, ”Semestre 1”, ”Semaine de travail”, etc.). Ils
doivent également pouvoir définir la période de validité de l’emploi du temps
(dates de début et de fin). L’utilisateur peut choisir les jours de la semaine
pour lesquels l’emploi du temps sera valable (par exemple, du lundi au vendredi).
Les utilisateurs doivent avoir la possibilité d’exporter leur emploi du temps sous
forme de fichier (par exemple, format CSV ou JSON) pour sauvegarde.
Java a été conçu par les concepteurs James Gosling et Bill Joy de Sun
Microsystems avec les caractéristiques suivantes :
1 Indépendant de la machine et du système d’exploitation sous-jacent (Portable).
2 Complet :
Programmation réseau avancée.
Programmation d’interface utilisateur graphique.
...
3 Simple :
Orienté objet (syntaxe proche du C/C++).
La gestion de la mémoire n’est pas à la charge de l’utilisateur.
Fichiers
sources (.java)
Compilation
(javac)
OS (Mac OS,
Code exécutable Java Virtual
Windows,
(byte-code) (.class) Machine
Linux, ...)
Librairies externes
(byte-code) (.class)
p u b l i c c l a s s HelloWorld { Étapes :
p u b l i c s t a t i c v o i d main ( 1 Code source : HelloWorld.java
String [ ] args ) {
System . out . p r i n t l n ( ”
2 Compilation : javac
H e l l o World ” ) ; HelloWorld.java produisant le
} fichier HelloWorld.class
} 3 Exécution (interprétation) : java
HelloWorld
Java offre des instructions conditionnelles pour prendre des décisions dans un
programme :
if ... else : Permet d’exécuter un bloc de code si une condition est vraie,
sinon un autre bloc est exécuté.
switch : Utilisé pour gérer des situations où une variable peut avoir plusieurs
valeurs possibles et exécuter différentes actions en fonction de la valeur de la
variable.
En Java, l’instruction d’affectation (=) est utilisée pour attribuer une valeur à une
variable.
Les instructions de répétition permettent d’itérer à travers un bloc de code
plusieurs fois :
for : Utilisé pour exécuter un bloc de code un nombre spécifique de fois.
while : Permet de répéter un bloc de code tant qu’une condition est vraie.
do...while : Similaire à while, mais garantit au moins une exécution du
bloc de code avant de vérifier la condition.
En Java, toute variable locale à une méthode doit être initialisée avant d’être
utilisée. Voici un exemple :
void illustration () {
int i, j;
i++; // Erreur de compilation : i n'est pas initialisée
j = 0;
if (j == 1) i = 0;
i++; // Erreur : i n'est toujours pas initialisée
}
Dans cet exemple, la variable ‘i‘ n’est pas initialisée avant son utilisation, ce qui
provoque des erreurs de compilation. Il est essentiel d’initialiser correctement les
variables locales en Java pour éviter de tels problèmes.
Dans cet exemple, nous avons déclaré un tableau d’entiers ‘notes‘, dimensionné le
tableau pour contenir 5 notes (Allocation de la mémoire), initialisé les notes avec
des valeurs, calculé la moyenne, et affiché le résultat.
A. GUEDDES (abdelwaheb.gueddes@isitc.u-sousse.tn) POO 23/24 32 / 159
POO & Java La syntaxe et les éléments de bases de Java
3 Concaténation de chaînes :
chaine = chaine + " ISITCom";
Les chaînes de caractères en Java sont des objets de type ‘String‘ qui offrent de
nombreuses méthodes pour la manipulation de texte.
A. GUEDDES (abdelwaheb.gueddes@isitc.u-sousse.tn) POO 23/24 33 / 159
POO & Java La syntaxe et les éléments de bases de Java
Nous avons dans cette classe ???? attributs (‘abscisse‘, ‘ordonnee‘, ‘label‘) et
???? méthodes (‘Initialisation‘ et ‘translation‘) pour manipuler ses objets.
A. GUEDDES (abdelwaheb.gueddes@isitc.u-sousse.tn) POO 23/24 34 / 159
Les Classes en Java
Nous avons dans cette classe trois attributs (‘abscisse‘, ‘ordonnee‘, ‘label‘) et
deux méthodes (‘Initialisation‘ et ‘translation‘) pour manipuler ses objets.
A. GUEDDES (abdelwaheb.gueddes@isitc.u-sousse.tn) POO 23/24 36 / 159
Les Classes en Java Création et manipulation d’un Objet en Java
Dans cette séquence, nous déclarons d’abord un objet ‘a‘ de type ‘Point‘, puis
nous allouons l’espace mémoire nécessaire à cet objet en utilisant l’opérateur new.
Pour manipuler un objet en Java, vous pouvez effectuer les actions suivantes :
1 Accès à un attribut :
Pour accéder à un attribut d’un objet, utilisez le nom de l’objet suivi du nom
de l’attribut.
Exemple :a.abscisse;
2 Appel d’une méthode :
Pour appeler une méthode d’un objet, utilisez le nom de l’objet suivi du nom
de la méthode, suivi éventuellement des arguments entre parenthèses.
Exemple : a.translation(1, 5);
=⇒ Manipuler les objets et d’interagir avec leurs attributs et méthodes.
Exercice : Écrivez une classe Java nommée ‘Rectangle‘ qui a les attributs
suivants :
Longueur (‘longueur‘) de type double.
Largeur (‘largeur‘) de type double.
La classe doit avoir une méthode ‘initialiser‘ qui prend deux paramètres
(‘longueur‘ et ‘largeur‘) pour initialiser les attributs.
Ensuite, elle doit avoir une méthode ‘calculerAire‘ qui calcule et renvoie l’aire du
rectangle en multipliant la longueur par la largeur.
// Pour afficher un message à l'écran
System.out.println("L'aire du rectangle est : " + aire);
class Rectangle {
// Attributs de la classe
double longueur;
double largeur;
// Méthode pour initialiser les attributs
public void initialiser(double a, double b) {
longueur = a;
largeur = b;
}
// Méthode pour calculer l'aire
public double calculerAire ()
{return longueur * largeur ;}
}
Remarque
Une classe ne peut pas avoir deux méthodes qui possèdent la même signature. ⇒
Il n’est pas possible d’avoir dans une classe deux méthodes portant le même nom
et prenant les mêmes paramètres, mais ayant des types de retour différents.
En Java, plusieurs méthodes peuvent avoir le même nom, mais elles doivent se
différencier par la liste de leurs arguments. Ce concept est appelé la surcharge
de méthodes.
Exemple :
void methode(int i, int j) {...};
void methode(int i, char j) {...};
Le choix de la méthode à appeler se fait au moment de la compilation. La
méthode qui correspond le mieux à l’appel spécifique est choisie.
Constructeurs en Java
Définition
Un constructeur est une méthode particulière qui porte le même nom que
la classe qui la contient. Le constructeur est appelé automatiquement lors de
la création de l’objet à l’aide de la méthode new.
La syntaxe d’un constructeur est la même que celle d’une méthode ordinaire,
mais il n’indique aucun type de paramètre de retour.
Exemple :
class Exemple {
// Constructeur
Exemple () {
// Initialisation de l'objet
}
}
Constructeurs en Java
Un constructeur est utile pour initialiser les attributs de l’objet qu’il crée. Il
permet de configurer l’objet dès sa création.
Exemple :
Dans la classe ‘Point‘, nous pouvons avoir un constructeur comme suit :
class Point {
int abscisse;
int cordonnee;
String label;
// Constructeur
Point(int x, int y, String l) {
abscisse = x;
cordonnee = y;
label = l;
}
}
this est utilisé pour distinguer les attributs de la classe des paramètres
passés.
Voiture(String marque) appelle le premier constructeur (this(marque, 5)) pour
initialiser une voiture avec une marque et un nombre de portes par défaut.
A. GUEDDES (abdelwaheb.gueddes@isitc.u-sousse.tn) POO 23/24 49 / 159
Les Classes en Java Surcharge et constructeurs
En Java, les attributs d’un objet sont toujours initialisés par défaut selon les règles
suivantes :
Les attributs de type numérique (comme ‘int‘, ‘float‘, ‘double‘, etc.) sont
initialisés à 0 par défaut.
Les attributs de type référence (comme les objets) sont initialisés à null par
défaut.
Vous pouvez également effectuer une initialisation explicite de la valeur d’un
attribut lors de sa déclaration, comme suit :
int abscisse = 5;
En Java, la libération des ressources mémoire acquises avec l’opérateur ‘new‘ est
automatique grâce au ramasse-miettes (garbage collector). Cela signifie que la
mémoire d’un objet qui n’est plus référencé peut être récupérée à tout moment.
Exemple :
Voiture citroen = new Voiture ();
Voiture peugeot = new Voiture ();
citroen = null; // La première voiture n'est plus référencée
Dans cet exemple, lorsque ‘citroen‘ est défini à ‘null‘, la première voiture n’est
plus référencée, ce qui signifie que le ramasse-miettes peut récupérer la mémoire
associée à cet objet.
Vous pouvez redéfinir ces méthodes dans vos propres classes pour
personnaliser leur comportement.
Par exemple, redéfinir ‘toString()‘ pour fournir une description personnalisée
de votre objet.
A. GUEDDES (abdelwaheb.gueddes@isitc.u-sousse.tn) POO 23/24 53 / 159
Éléments Statiques en Java
Un élément statique est attaché à la classe plutôt qu’à une de ses instances.
Il peut exister, être référencé et s’exécuter même si aucune instance de cette
classe n’existe.
Les éléments statiques ne peuvent pas référencer ‘this‘.
Il existe quatre types d’éléments statiques :
Attributs statiques : La valeur de ce champ est la même pour tous les objets
instances de la classe.
Méthodes statiques : Des méthodes qui peuvent être appelées sur la classe
elle-même, indépendamment de toute instance.
Blocs statiques : Des blocs de code qui s’exécutent lors du chargement de la
classe, souvent utilisés pour initialiser des champs statiques.
Classes membres statiques : Des classes définies à l’intérieur d’une autre
classe, mais qui sont indépendantes de toute instance de la classe externe.
Par défaut, chaque instance de chaque classe occupe son propre espace mémoire.
Deux objets instances d’une même classe occupent donc deux espaces mémoire
qui ne se recouvrent pas.
Membres Statiques :
Lorsque l’on déclare un membre statique (static), il est placé dans un espace
mémoire commun à tous les objets de la classe. Si l’un des objets modifie la
valeur d’un champ statique, tous les objets verront la valeur de ce champ modifiée.
public Compteur(int j) {
val = j; Compteur C1
}
val = 1
public static void main(String
[] args) {
Compteur C1 = new Compteur
(1); Compteur C2
Compteur C2 = new Compteur
(2); val = 2
}
}
⇒ L’utilisateur doit ajouter la valeur manuellement (ce qui peut ne pas être
pratique pour les systèmes complexes).
Membres Statiques :
La déclaration d’un membre en tant que static permet de le partager entre
toutes les instances d’une classe.
// affiche 2
System.out.println("Nombre de Compteurs = " + Compteur.cpt) ;
Constantes en Java
La bonne pratique pour définir une constante en Java est de la déclarer dans un
champ public static final .
public class Math {
public static final double PI = 3.14159265358979323846;
}
Vous pouvez ainsi utiliser la constante Math.PI dans n’importe quel programme
Java.
Évolution de la gestion des constantes :
La gestion des constantes a évolué entre Java 1.4 et Java 5. Dans Java 5, une
nouvelle notion appelée ”import statique” a été introduite : import static
MaClasse.MaConstante .
Définition
En Java, les blocs statiques sont des ensembles d’instructions exécutés lors du
chargement de la classe, avant la création d’objets.
Définir une classe Voiture avec les attributs suivants : Id, Marque, Vitesse,
Puissance.
Écrire un constructeur permettant d’initialiser les attributs d’un objet voiture
par des valeurs passées en paramètre. Notez que Id doit être auto-incrémenté.
Créer une méthode getCptMax qui retourne le numéro du dernier objet créé.
Écrire la méthode toString() permettant d’afficher les informations d’une
voiture.
Fournir la représentation graphique de la classe Voiture.
Écrire un programme de test pour la classe Voiture avec les données
suivantes :
id=1, marque=BMW, vitesse=220.0, puissance=8
id=2, marque=Ford, vitesse=200.0, puissance=6
id=3, marque=Audi, vitesse=240.0, puissance=8
Afficher le nombre de voitures créées à la fin du programme.
Agrégation
L’agrégation est une relation de type ”composé/composant”.
Elle exprime que l’un des objets est composé des autres objets.
C’est une relation du type ”est partie de” ou ”est composé de”.
L’agrégation implique un couplage fort entre les classes.
La durée de vie des composants est liée à celle de l’agrégat.
Paquetage
package MonProjet.banque;
Notes :
Par défaut, un membre est accessible depuis des classes sauvegardées dans
des fichiers différents du même package.
Les champs sans modificateur de visibilité (public, private, protected) ne sont
pas accessibles depuis un autre package. ⇒ Utilisation d’un package : import.
Encapsulation
Principe de l’Encapsulation
Définition
L’encapsulation est un concept clé en programmation orientée objet qui consiste à
masquer le plus possible les détails d’implémentation et le fonctionnement interne
des objets.
En Java, il est possible de restreindre l’accès aux classes, aux méthodes et aux
attributs. Cette restriction empêche leur référencement en dehors de leurs niveaux
d’accès.
Concernant les membres (méthodes et attributs) des classes, il existe 4 niveaux
d’accès :
Public : Accessible de n’importe où.
Private : Accessible uniquement à l’intérieur de la classe.
Protected : Accessible à l’intérieur de la classe, des sous-classes et du même
paquetage.
Default (privé paquetage) : pas de mot-clé, accessible uniquement à
l’intérieur du même paquetage.
En définissant les niveaux d’accès appropriés, on peut contrôler la visibilité et
l’accessibilité des éléments d’une classe, ce qui contribue à l’encapsulation et à la
sécurité du code.
Méthodes d’Accès
Pratique à Éviter
Un exemple de pratique à éviter est de déclarer directement des attributs dans une
classe sans utiliser de méthodes d’accès. Par exemple :
class A {
X x;
Y y;
void f(...) {
x = ...
}
int g(...) {
int a = y;
...
}
}
Remareque
Ce genre de pratique peut entraîner des problèmes, car si vous modifiez les
attributs, vous devrez également modifier toutes les classes qui les utilisent.
A. GUEDDES (abdelwaheb.gueddes@isitc.u-sousse.tn) POO 23/24 85 / 159
Encapsulation
Pratiques Recommandées
Pour éviter les problèmes, il est recommandé de déclarer les attributs comme
privés et d’utiliser des méthodes d’accès. Voici un exemple de bonne pratique :
class A {
private X x;
private Y y;
X getX () { return x; }
void setX(X x) { this.x = x; }
Y getY () { return y; }
void setY(Y y) { this.y = y; }
void f(...) {
x = ...}
int g(...) {
int a = y;
...}
}
Remareque
En suivant cette approche, si vous modifiez les attributs, vous n’aurez pas besoin
de changer toutes les méthodes de la classe.
A. GUEDDES (abdelwaheb.gueddes@isitc.u-sousse.tn) POO 23/24 86 / 159
Encapsulation
Bonnes Pratiques
En adoptant cette méthode, si vous modifiez les attributs, il vous suffira de mettre
à jour les méthodes d’accès de la classe, ce qui simplifie considérablement la
maintenance.
Généralisation et spécialisation
Généralisation
Vehicule
Héritage
Héritage
VoitureDiesel VoitureEssence
Héritage
PixelCouleur
Pixel
Héritage
PixelCouleur
Héritage en Java
Héritage en Java
Exemple :
class Vehicule {
String marque;
int annee;
void demarrer () {
System.out.println("Le véhicule démarre.");
}
}
Ici, ‘Voiture‘ généralise les attributs et méthodes communs à tous les véhicules.
Inaccessible
(Privée)
Pixel PixelCouleur
Publique
PixelCouleur
Pixel
public void deplacer(int dx , int dy
protected int x, y; ) {
public Pixel(int a, int b) {...} x = x + dx;
public void affiche () {...} y = y + dy;
}
À retenir
Les membres privés de la classe de base sont inaccessibles dans la classe
dérivée .
Les membres publics de la classe de base sont accessibles dans la classe
dérivée.
Un membre avec accès par défaut (sans modificateur) est accessible dans les
classes du même package.
Un membre protégé (protected) est accessible dans une classe fille du
même package ou d’un package différent(avec import).
Classe Score
Classe ScoreEssai
Classe Jeu
Classe Score
Le polymorphisme
Le polymorphisme
Définition
Le polymorphisme signifie que le même message adressé à deux objets
différents peut produire des résultats différents.
Par exemple, dire ”Bonne nuit” à un enfant signifie ”Commence à te préparer
pour le lit.”
Dire ”Bonne nuit” à un parent signifie ”Lis une histoire avant de dormir.”
En Java, cela signifie que la même méthode est implémentée différemment
par différentes classes.
En substance : Le polymorphisme consiste à changer le comportement d’une
classe grâce à l’héritage, en adaptant le comportement des objets, tout en
continuant à l’utiliser comme une classe de base.
Le polymorphisme
public class Pixel{
//...
public Pixel (){ ... }
public void affiche () {...}
// ...
}
Résultat attendu :
Jouer Piano
Jouer Trompette
Jouer Violon
Polymorphisme en Java
Un objet de la classe dérivée (B) peut être référencé par un objet de la classe
de base (A).
Le type de référence (a) est devenu dynamiquement le type de l’objet
référencé (B).
Pour appeler une méthode spécifique de la classe fille (B), il faut effectuer un
downcast :
((B)a).maMethode (); // Downcast pour appeler la méthode de B
Polymorphisme - Exemple
Upcasting en Java
Upcasting : Conversion d’une référence d’une classe dérivée vers une référence de
la classe de base.
// Upcasting
Instrument piano = new Piano ();
Downcasting en Java
Les classes abstraites sont des classes qui ne peuvent pas être
instanciées. Elles déclarent souvent des signatures de méthodes (méthodes
sans corps), appelées méthodes abstraites.
Les classes héritantes définiront concrètement les méthodes abstraites
public abstract class Forme {
abstract void dessiner (); // Méthode abstraite sans corps
}
En Java, la signature d’une méthode abstraite est préfixée par le mot-clé abstract.
De même, la signature d’une classe abstraite est préfixée par le mot-clé abstract.
Toute classe contenant une méthode abstraite est également abstraite, mais il
n’est pas nécessaire qu’une classe ait une méthode abstraite pour être déclarée
abstraite.
public abstract class Forme {
abstract void dessiner (); // Méthode abstraite sans corps
}
class Collection { s t a t i c v o i d a f f i c h e r S u r f a c e A s s i e t t e s ( U s t e n s i l e [ ] us ) {
do ub le somme = 0 ;
public static v o i d main ( S t r i n g [ ] a r g s ) { f o r ( i n t i = 0 ; i < us . l e n g t h ; i ++) {
Ustensile [ ] us = new U s t e n s i l e [ 5 ] ; // A c o m p l é t e r
us [ 0 ] = new A s s i e t t e R o n d e (1926 , 8 . 4 ) ; }
us [ 1 ] = new C u i l l e r e (1881 , 7 . 3 ) ; System . out . p r i n t l n ( ” S u r f a c e t o t a l e des a s s i e t t e s : ”
us [ 2 ] = new A s s i e t t e C a r r e e (1935 , 5 . 6 ) ; + somme) ;
us [ 3 ] = new C u i l l e r e (1917 , 8 . 8 ) ; }
us [ 4 ] = new A s s i e t t e R o n d e (1837 , 5 . 4 ) ;
s t a t i c v o i d a f f i c h e r V a l e u r T o t a l e ( U s t e n s i l e [ ] us ) {
a f f i c h e r C u i l l e r e s ( us ) ; do ub le somme = 0 ;
a f f i c h e r S u r f a c e A s s i e t t e s ( us ) ; f o r ( i n t i = 0 ; i < us . l e n g t h ; i ++) {
a f f i c h e r V a l e u r T o t a l e ( us ) ; // A c o m p l é t e r
} }
System . out . p r i n t l n ( ” V a l e u r t o t a l e de l a c o l l e c t i o n :
s t a t i c v o i d a f f i c h e r C u i l l e r e s ( U s t e n s i l e [ ] us ) { ” + somme) ;
int nbCuilleres = 0 ; }
f o r ( i n t i = 0 ; i < us . l e n g t h ; i ++) { }
// A c o m p l é t e r
}
System . out . p r i n t l n ( ” I l y a ” + n b C u i l l e r e s + ”
c u i l l è r e s . ”) ;
}
Hiérarchie de classes
Il convient de modéliser les objets de la collection avec une hiérarchie de 5 classes
comme indiqué dans la liste ci-dessous. Ecrivez le code de cette hiérarchie de
classes, y compris les variables d’instance et les constructeurs.
Evitez de dupliquer inutilement des instructions. La méthode main du programme
Collection ci-dessus vous montre la façon d’appeler les constructeurs des classes
qui sont instanciables.
1 Chaque Ustensile a une année de fabrication qui est une valeur int. Un
Ustensile est soit une Assiette, soit une Cuillère. Il n’est pas possible
d’instance la classe Ustensile.
2 Une Assiette est soit une AssietteRonde, soit une AssietteCarree. Il n’est pas
possible d’instancier la classe Assiette.
3 Chaque AssietteRonde à un rayon qui est une valeur double.
4 Chaque AssietteCarree à un cote qui est une valeur double.
5 Chaque Cuillere à une longueur qui est une valeur double.
Diagramme de Classe
Ustensile
- annee : int
Assiette Cuillere
- longueur : double
+ calculerSurface() : double + toString() : String
AssietteRonde AssietteCarree
p u b l i c a b s t r a c t do uble c a l c u l e r S u r f a c e ( ) ;
p u b l i c do ub le c a l c u l e r S u r f a c e ( ) {
r e t u r n ( getCote ( ) ∗ getCote ( ) ) ;
}
p u b l i c do ub le c a l c u l e r V a l e u r ( i n t a n n e e A c t u e l l e ) {
do ub le v a l e u r = 5 ∗ s u p e r . c a l c u l e r V a l e u r (
anneeActuelle ) ;
return valeur ;
}
p u b l i c do ub le getCote ( ) {
return cote ;
}
}
c l a s s C u i l l e r e extends U s t e n s i l e {
p r i v a t e do ub le l o n g u e u r ;
p u b l i c C u i l l e r e ( i n t annee , do ub le l o n g u e u r ) {
s u p e r ( annee ) ;
t h i s . longueur = longueur ;
}
p u b l i c do ub le getLongueur ( ) {
return longueur ;
}
}
Les Interfaces
Interfaces en Java
Écrire une interface équivaut presque à écrire une classe abstraite ne déclarant que
des méthodes abstraites, sauf qu’une classe peut hériter de plusieurs interfaces.
interface I {
void f();
int g(float x);
}
p u b l i c v o i d method2 ( ) {
// I m p le m e nt a t i o n
}
p u b l i c v o i d method3 ( ) {
// I m p le m e nt a t i o n
}
}
Une interface sert de relais entre une classe qui implémente et une classe qui
l’utilise. Une interface indique les méthodes qu’une classe met à la disposition des
autres classes sans indiquer son implémentation ni sa structure interne. Lorsqu’une
application nécessite de définir de nombreuses classes qui vont interagir et qui
seront écrites par des programmeurs différents, chaque programmeur n’a besoin de
connaître que les interfaces des autres classes.
interface Calcul {
int addition ( in t a , in t b) ;
int soustraction ( int a , int b) ;
}
c l a s s C a l c u l a t r i c e implements C a l c u l {
public int addition ( int a , int b) {
return a + b ;
}
public in t soustraction ( in t a , in t b) {
return a − b ;
}
}
// C l a s s e B u t i l i s a n t l ’ i n t e r f a c e IA
public class B {
p r i v a t e IA i a ;
// C o n s t r u c t e u r p r e n a n t un o b j e t IA ( polymorphisme )
p u b l i c B( IA i a ) {
this . ia = ia ;
}
// Méthode de B u t i l i s a n t l a méthode fA de l ’ i n t e r f a c e ( polymorphisme )
p u b l i c v o i d fB ( ) {
i a . fA ( ) ;
}
}
// I n t e r f a c e // Deuxième c l a s s e
public i n t e r f a c e Vehicule { p u b l i c c l a s s Moto implements V e h i c u l e {
v o i d demarrer ( ) ; @Override
void a r r e t e r () ; p u b l i c v o i d demarrer ( ) {
} System . out . p r i n t l n ( ”La moto démarre . ” ) ;
}
// Première c l a s s e
p u b l i c c l a s s V o i t u r e implements V e h i c u l e { @Override
@Override public void a r r e t e r () {
p u b l i c v o i d demarrer ( ) { System . out . p r i n t l n ( ”La moto s ’ a r r ê t e . ” ) ;
System . out . p r i n t l n ( ”La v o i t u r e démarre . ” ) }
; }
}
// U t i l i s a t i o n
@Override public c l a s s TestVehicules {
public void a r r e t e r () { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
System . out . p r i n t l n ( ”La v o i t u r e s ’ a r r ê t e . ” V e h i c u l e v o i t u r e = new V o i t u r e ( ) ;
); V e h i c u l e moto = new Moto ( ) ;
}
} // Appels des méthodes
v o i t u r e . demarrer ( ) ;
voiture . arreter () ;
moto . demarrer ( ) ;
moto . a r r e t e r ( ) ;
}
}
Les exceptions
Définition
Une exception est un événement qui se produit lors de l’exécution d’un
programme, interrompant le flux normal des instructions.
L’objet Exception :
Lorsqu’une erreur survient, une méthode crée un objet Exception.
Contient des informations sur l’erreur, telles que le type de l’erreur (objet
null, dépassement de tableau, etc.).
La trace d’exécution du programme est également incluse (la stack trace).
L’action de créer un objet Exception et de le passer au système d’exécution est
appelée lever/lancer une exception (throwing an exception).
Les exceptions sont gérées par le mécanisme de gestion des erreurs intégré
dans Java.
Lorsqu’une exception survient, le programme cherche le gestionnaire
d’exceptions approprié.
La trace d’exécution (stack trace) fournit des informations sur la séquence
d’appels de méthodes menant à l’exception.
Les exceptions peuvent être levées explicitement (throw) ou détectées
implicitement lors de l’exécution.
Le bloc try est utilisé pour encadrer le code susceptible de lever une
exception.
Le bloc catch spécifie le type d’exception à intercepter et le code à exécuter
en cas d’exception.
On peut avoir plusieurs blocs catch pour traiter différents types d’exceptions.
Utiliser finally pour spécifier du code qui doit être exécuté, que l’exception
soit levée ou non.
// Appel de la méthode
try {
lancerException ();
} catch (CustomException e) {
// Gestion de l'exception
System.out.println("Erreur personnalisée: " + e.getMessage ());
}
Le mot-clé throws est utilisé pour indiquer que la méthode peut lancer
certaines exceptions, mais qu’elles ne sont pas traitées à cet endroit.
Les exceptions doivent être gérées par le code appelant la méthode ou par
des blocs try-catch ultérieurs.
Utile pour les méthodes qui ne peuvent pas gérer l’exception localement, mais
doivent informer les appelants potentiels de la possibilité d’une exception.
try {
// Code susceptible de lever une exception
int resultat = diviser (10, 0);
System.out.println("Résultat: " + resultat);
} catch ( ArithmeticException e) {
// Gestion de l'exception
System.out.println("Erreur: Division par zéro");
} finally {
// Code exécuté quels que soient les résultats
System.out.println("Fin du programme");
}
Le bloc finally contient du code qui sera exécuté quels que soient les
résultats des blocs try et catch.
Utile pour libérer des ressources (comme la fermeture de fichiers ou de
connexions) ou exécuter un code de nettoyage.
Le bloc finally est facultatif.
Java offre une variété d’exceptions prédéfinies pour gérer différents types
d’erreurs.
Exemples : NullPointerException, ArrayIndexOutOfBoundsException,
ArithmeticException, etc.
Vous pouvez définir vos propres exceptions personnalisées en étendant la
classe Exception.
try {
// Code susceptible de lever une exception
String chaine = null;
int longueur = chaine.length (); // NullPointerException
} catch ( NullPointerException e) {
// Gestion de l'exception
System.out.println("Erreur: " + e.getMessage ());
}
Conclusion
Conclusion
Thank you !