SlideShare une entreprise Scribd logo
1  sur  95
Classes et objets
Pr. Abdelalim SADIQ
CHAPITREII
Programmation Structurée VS POO
• Objectifs de la POO
• Facilité la réutilisation de code, encapsulation et abstraction
• Facilité de l’évolution du code
• Améliorer la conception et la maintenance des grands systèmes
• Programmation par « composants ».
• Conception d’un logiciel à la manière de la fabrication d’une voiture
• Programmation Structurée
• Unité logique : le module
• Une zone pour les variables
• Une zone pour les fonctions
• Chaque fonction résout une partie du problème
• Structuration « descendante » du programme
Classeset Objets
CHAPITREII
Pr. A.SADIQ 2
Pr. A.SADIQ
Programmation Procédurale (PP)
• Principe: Repose sur l’équation suivante :
Programme = Structures de données + Algorithmes
• Dans la PP, la conception d’un programme est conduite par traitements :
• Consiste à décomposer le programme en fonctions (modules) simples.
3
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Programmation Orientée Objet (POO)
• Basée sur les données :
• Déterminer les données à traiter.
• Réaliser les fonctions qui permettent de les manipuler.
4
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Programmation Orientée Objet (POO)
OBJET = Données + Méthodes.
• Un objet est une association de données et de fonctions (méthodes) qui agissent sur ces
données.
• POO: Programmation dans laquelle un programme est organisé comme un ensemble
d'objets coopérant ensemble.
5
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Principe POO
• Programmation par Objet:
• Unité logique : Objet
• Objet défini par :
• Un état
• Un comportement
• Une identité
• État : représenté par des attributs(variable) qui stockent des valeurs.
• Comportement : défini par des méthodes qui modifient un état.
• Identité : permet de distinguer un objet d’un autre objet.
6
Classeset Objets
CHAPITREII
Personne
Variable: Age=32
Methode: getAge()
Identité
État
Comportement
Pr. A.SADIQ
Les Concepts de base de la POO…
• Les objets communiquent entre eux par des envoies de messages.
• Un objet peut recevoir un message qui déclenche
• une méthode qui modifie son état
et/ou
• une méthode qui envoie un message à un autre objet
7
Classeset Objets
CHAPITREII
Classe Voiture
-modèle, couleur
Classe Personne
-nom, prénom, statut
Classe Lecteur
-nom, prénom
Pr. A.SADIQ
Principe POO: Notion de classe
• Des objets similaires peuvent être informatiquement décrits par une même abstraction :
une classe
• même structure de données et méthodes de traitement
• valeurs différentes pour chaque objet
8
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Les Concepts de base de la POO…
• Les classes servent de « moules » pour la création des objets.
• Un objet est une instance (exemplaire) d’une classe.
• Un programme OO est constitué de classes qui permettent de créer des objets qui s’envoient
des messages.
9
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Les Concepts de base de la POO…
• Classe :
• généralisation de la notion de type.
• décrit les caractéristiques générales d’un ensemble (famille) d’objets similaires :
• Les objets similaires sont des instances (exemplaires) de la même classe.
• Une classe possède des membres :
• Attributs : les éléments données de la classe
• Méthodes : fonctions qui donne accès ou modifie les attributs.
• Exemple :
10
Classeset Objets
CHAPITREII
Attributs
Méthodes
Classe: CompteBancaire
Proprietaire;
Solde;;
credite(val)
getSolde()
Pr. A.SADIQ
Contenu d’une classe
• Une classe est composée de plusieurs membres dont chacun est soit :
• un attribut : variable typée
• une méthode (ou opération) : ensemble d'instructions de traitement
11
Classeset Objets
CHAPITREII
Encapsulation
L'encapsulation est la pratique consistant à regrouper des attributs au sein d'une même classe. (pas
d’attributs sans classe)
• Exemple :
la classe CompteBancaire encapsule les attributs propriétaire et solde
• Pour améliorer la lisibilité des programmes, les attributs encapsulés sont souvent privés (inaccessibles
aux autres classes).
• Les données et méthodes accessibles sont dites publiques
12
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Pr. A.SADIQ
Les Concepts de base de la POO…
• Accès aux attributs d'un objet :
Syntaxe : NomObjet.Attribut
Exemple : P est un objet de la classe Etudiant qui a un attribut
Matricule de type entier
P.Matricule = 234; // affecter la valeur 234 au matricule de l’étudiant P
• Accès aux méthodes d'un objet :
Syntaxe : NomObjet.Méthode(arguments)
Exemple : C est un objet de la classe Compte qui a une méthode
Verser qui verse un montant dans le compte :
C.Verser (4000); // verser 4000 dans le compte C
13
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Les Concepts de base de la POO…
• Stratégie de développement OO :
1. Identifier les objets et leurs attributs
Exemple : CompteBancaire
2. Identifier les opérations (Exemple: Verser, Retirer, …).
3. Établir la visibilité. Par exemple, pour un objet CompteBancaire on pourra avoir accès à toutes
les actions (Verser, Retirer, …) mais ne pourra pas voir l'accès directement au solde pour le
modifier.
4. Établir l’interface : description de chaque opération avec ses arguments (Exemple : boolean
Verser( float M) )
5. Implanter chaque objet.
14
Classeset Objets
CHAPITREII
Conventions d’écriture
• Toute méthode, attribut et variable d’instance commence par une minuscule.
• Exemple: compteBancaire, calculDistance(), premierPoint.
• Tout changement de mot descriptif se fait via une majuscule.
• Exemple : compteurFilms, calculSurfaceDuRectangle.
• Les constantes décrites par le mot clé final : lettres majuscules avec under-scores.
• Exemple : VALEUR_TVA, NOMBRE_PI.
• Tout nom de classe ou d’interface commence par une majuscule. Tout changement de mot
descriptif se fait via une majuscule.
• Exemple : Point, CompteBancaire, FormeGeometrique.
15
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Déclaration d’une classe en java
• La définition d’une classe correspond à la définition d’un nouveau type
• Exemple:
16
Classeset Objets
CHAPITREII
Point
+ abscisse: int
- ordonnee: int
+ distance(p:Point):double
public class Point{
public int abscisse;
private int ordonnee;
/* On peut aussi utiliser cette syntaxe:
public int abscisse, ordonnee;*/
public double distance(Point p){…}
}
En UML:
En java:
Pr. A.SADIQ
Création des objets: instanciation
• Se fait pour initialiser un objet
• Provoque la création réelle de l’objet en mémoire
• Par l’initialisation de ses variables internes propres (attributs)
• Chaque objet crée, possédera donc ses propres valeurs d’attributs, distinctes des valeurs d’attributs
d’un autre objet
• Se fait par l’emploi du mot clé new
• L’instruction suivante:
• Définit une variable d’instance p1 de type Point par le constructeur Point().
• Constructeur ??????
17
Classeset Objets
CHAPITREII
Point p1 = new Point();
Pr. A.SADIQ
Constructeurs d’objets
• Les constructeurs sont des méthodes particulières qui permettent de fabriquer (créer) les objets.
• En effectuant certaines initialisations nécessaires pour le nouvel objet créé.
• Le constructeur porte le même nom que la classe à laquelle il appartient,
• On peut définir autant de constructeurs qu’on souhaite,
• Le constructeur par défaut ne possède pas d’arguments,
• Les autres constructeurs peuvent comporter de 1 à n arguments (Surcharge).
• Toute classe Java possède au moins un constructeur
• Si une classe ne définit pas explicitement de constructeur, un constructeur par défaut, sans arguments et qui
n’effectue aucune initialisation particulière, est invoqué.
18
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Constructeurs d’objets - Exemple
• Utilisation:
19
Classeset Objets
CHAPITREII
public class Point{
// Attributs
public int abscisse;
public int ordonnee;
// Constructeurs
public Point(){
abscisse=0;
ordonnee=0;
}
public Point(int x, int y){
abscisse=x;
ordonnee=y;
}
}
Point p1 = new Point();
Point p2 = new Point(3,4);
p1
abscisse=0
ordonnee=0
p2
abscisse =3
ordonnee =4
Constructeur
par défaut
Constructeur
avec arguments
Pr. A.SADIQ
Constructeurs d’objets - Référence d’objet
20
Classeset Objets
CHAPITREII
Assignation d’un type de référence
ox0123abcd
p1
0
0
abscisse
ordonnee
oxcafebabe
3
4
p2
abscisse
ordonnee
oxcafebabe
p
12
Il n’y a désormais plus de
référence vers l’ancien
Point « p1 », il sera donc
détruit par le Garbage
Collector
public class Point{
public int abscisse;
public int ordonnee;
}
//Utilisation
Point p1 = new Point();
Point p2 = new Point(3,4);
Point p=p2;
p.abscisse=12;
p1=p;
Pr. A.SADIQ
Destructeurs d’objets
• Un destructeur est une méthode spéciale qui permet de libérer la mémoire occupée par un objet avant
de le détruire.
• En java, cette fonction est prise en charge par le garbage collector
• Automatiquement
• Si plus aucune variable ne référence l’objet
• Si le bloc dans lequel il est défini se termine
• Si l’objet a été affecté à null. (p1 = null)
• Manuellement :
• Sur demande explicite par l’instruction System.gc()
• Un pseudo-destructeur protected void finalize() peut être défini explicitement par le programmeur
• Il est appelé juste avant la libération de la mémoire par la machine virtuelle, mais on ne sait pas
quand.
21
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Destructeurs d’objets - Exemple
22
Classeset Objets
CHAPITREII
public class Point{
public int abscisse,ordonnee;
public Point(int x, int y){
abscisse=x;
ordonnee=y;
}
protected void finalize(){
System.out.println("objet détruit");
}
public static void main(String[] args) {
Point p1=new Point(4,3);
Point p2=new Point(23,32);
p1=p2;
System.out.println(p1.abscisse);
System.out.println(p2.abscisse);
System.gc();
}
}
Méthode appelée avant la
destruction de l’objet
Demande de lancement
du garbage collector (gc)
Pr. A.SADIQ
Modificateurs d’accès - Encapsulation
• Possibilité d’accéder aux attributs d’une classe Java, n’est pas recommandée car on ne respecte pas le
principe de l’encapsulation.
• Les données (attributs) doivent être protégées et accessibles pour l’extérieur par des sélecteurs.
• Plusieurs niveaux de visibilité peuvent être définis en précédant d’un modificateur la déclaration d’un
attribut, méthode ou constructeur.
• private
• public
• Protected (A revoir dans le chapitre suivant)
23
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Visibilité des membres d’une classe- Encapsulation
24
Classeset Objets
CHAPITREII
+ public - private
classe La classe peut être utilisée par
n’importe quelle classe
Utilisable uniquement par les classes
définies à l’intérieur d’une autre classe.
Une classe privée n’est utilisable que
par sa classe englobante
attribut Attribut accessible partout où
sa classe est accessible. N’est
pas recommandé du point de
vue encapsulation
Attribut restreint à la classe où est faite la
déclaration
méthode Méthode accessible partout
où sa classe est accessible.
Méthode accessible à
l’intérieur de la définition de
la classe
Pr. A.SADIQ
Visibilité des membres d’une classe- Accès
• Dans une classe toute référence à un attribut défini dans la classe elle-même se fait
simplement en le nommant.
• En revanche, l’accès aux attributs depuis ces clients (d’autres objets) se fait par la
notation pointée: p.a où p désigne l’objet et a le nom de l’attribut.
• Par défaut, les attributs d’une classe sont privés et ne sont pas directement
accessibles par d’autres objets.
• Comment accéder aux attributs privés d’un objet à partir d’un autre?
25
Classeset Objets
CHAPITREII
public class Point{
public int abscisse;
private int ordonnee;
}
public class Droite{
……………
int a,b;
Point p1=new Point();
a = p1.abscisse; //OK
b = p1.ordonnee; //Faux
}
Pr. A.SADIQ
Méthodes d’accès aux attributs (getters et setters)
• Les méthodes d’accès aux attributs sont des opérations que l’on peut effectuer sur
les attributs d’une classe. On distingue deux types de méthodes:
• Les accesseurs:
• qui ne modifient pas l’état et se contente de retourner la valeur d’un champ,
• Par coutume, les accesseurs commencent par get,
• On les appelle aussi les getters,
• Exemple: getAbscisse(), getOrdonnee().
• Les modificateurs:
• qui modifient l’état en effectuant un calcul spécifique,
• Par coutume, les modificateurs commencent par set,
• On les appelle aussi les setters,
• Exemple: setAbscisse(int x),setOrdonnee(int y).
26
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Exemple de getters et de setters – class Point
27
Classeset Objets
CHAPITREII
public class Point{
private int abscisse;
private int ordonnee;
//Constructeurs
public Point(){
abscisse=0;
ordonnee=0;
}
public Point(int x, int y){
abscisse=x;
ordonnee=y;
}
public int getAbscisse() {
return abscisse;
}
public void setAbscisse(int x) {
abscisse = x;
}
//-----------------------------------
public int getOrdonnee() {
return ordonnee;
}
public void setOrdonnee(int y) {
ordonnee = y;
}
public void setPoint(int x, int y) {
abscisse = x;
ordonnee = y;
}
}
Pr. A.SADIQ
Exécuter une application – class Application (main)
• Une application peut être vue comme une conversation entre objets.
• L’initiatrice de cette conversation est habituellement une classe qui possède dans sa définition une
méthode appelée main.
• C’est préférable, dans une application java, de définir la méthode main dans une autre class à part,
que dans l’une des classes constituant l’application.
28
Classeset Objets
CHAPITREII
public class Application{
public static void main(String [] args){
……………………………
……………………………
}
}
Pr. A.SADIQ
Exemple d’application – Tester la classe Point
29
Classeset Objets
CHAPITREII
public class Application{
public static void main(String[] args){
Point p1= new Point();
Point p2= new Point(2,3);
System.out.println("1) P1: x=" + p1.getAbscisse() + " y="+p1.getOrdonnee());
System.out.println("2) P2: x=" + p2.getAbscisse() + " y="+p2.getOrdonnee());
p1.setPoint(12, 43);
System.out.println("3) P1: x=" + p1.getAbscisse() + " y="+p1.getOrdonnee());
p2.setAbscisse(20);
System.out.println("4) P2: x=" + p2.getAbscisse() + " y="+p2.getOrdonnee());
p1=p2;
System.out.println("1) P1: x=" + p1.getAbscisse() + " y="+p1.getOrdonnee());
System.out.println("2) P2: x=" + p2.getAbscisse() + " y="+p2.getOrdonnee());
}}
Pr. A.SADIQ
Champs constants
• Quelle erreur a été commise dans cette définition de classe ?
Classeset Objets
CHAPITREII
public class ChCt{
public ChCt (float r){
x = r ;
}
.....
private final float x ;
private final int n = 10 ;
private final int p ;
}
• Le champ p déclaré final doit être
initialisé au plus tard par le
constructeur, ce qui n’est pas le cas.
• En revanche, les autres champs
déclarés final sont correctement
initialisés:
• n de façon explicite
• et x par le constructeur.
Pr. A.SADIQ 30
Le mot clé this
• Les méthodes setAbscisse, setOrdonnee et setPoint utilisent des paramètres qui portent un autre nom
pour éviter la confusion avec les variables d’instances.
• Il est possible de les appeler également abscisse et ordonnee
• La distinction est faite en utilisant la référence this
• this.x désigne la variable d’instance de l’objet courant (this)
31
Classeset Objets
CHAPITREII
public void setAbscisse(int abscisse) {
this.abscisse = abscisse;
}
public void setOrdonnee(int ordonnee) {
this.ordonnee = y;
}
public void setPoint(int abscisse, int ordonnee) {
this.abscisse = abscisse;
this.ordonnee = ordonnee;
}
Pr. A.SADIQ
Le méthode toString()
• La classe Object possède une methode toString() qui permet d’afficher
n’importe quel objet sous forme d’une chaine de caractères.
• Exemple: Dans la classe Point on redéfini la méthode toString comme suit:
• Utilisation:
• Sortie:
32
Classeset Objets
CHAPITREII
public String toString() {
return "(" + abscisse + "," + ordonnee + ")";
}
Point p1=new Point(3,4);
System.out.println(“La coordonnée du point est:” + p1);
La coordonnée du point est: (3,4)
Pr. A.SADIQ
Exercices
1. Pour la classe Point, déjà crée, ajouter une méthode qui permet à un objet
Point de calculer sa distance avec un autre objet Point.
2. Créer une classe Droite, caractérisée par sa pente (coefficient directeur) et
son ordonnée à l’origine:
• Déclarer la classe
• Déclarer les attributs comme privés
• Définir les setters et les getters correspondants
• Ajouter une méthode qui permet de vérifier si un point appartient à cette
droite ou non.
33
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Surcharge de méthodes
• La surcharge (overloading) n’est pas limitée aux constructeurs, elle est possible également pour
n’importe quelle méthode.
• Possibilité de définir des méthodes possédant le même nom mais dont les arguments sont différents.
• Quand une méthode surchargée est invoquée, le compilateur sélectionne automatiquement la méthode
dont le nombre et le type des arguments correspondent au nombre et au type des paramètres passés
dans l’appel de la méthode.
• Des méthodes surchargées peuvent avoir des types de retour différents à condition qu’elles aient des
arguments différents.
34
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Surcharge de méthodes – Exemple1
35
Classeset Objets
CHAPITREII
class Additionneur {
public int somme(int a, int b){ // 1
return (a+b);
}
public int somme(int a, int b, int c){ // 2
return (a+b+c);
}
public float somme(float a, float b){ // 3
return (a+b);
}
public float somme(int a, int b){ //4 interdit à cause de 1
return ((float)a+(float)b);
}
}
class App {
public static void main(String[]
args){
Additionneur ad = new
Additionneur();
int a=4;
int b=10;
float c=15.4f;
float d=3.5f;
int s1= ad.somme(a,b); // 1
int s2=ad.somme(a,b,a);// 2
float s3=ad.somme(c,d);// 3
}}
Pr. A.SADIQ
Surcharge de méthodes – Exemple2
36
Classeset Objets
CHAPITREII
public class Point{
private int abscisse;
private int ordonnee;
……………………………………….
public double distanceJusque(Point p){
int difX=abscisse - p.abscisse;
int difY=ordonnee - p.ordonnee;
return Math.sqrt(difX*difX + difY*difY);
}
public double distanceJusque(double x, double y){
double difX=abscisse - x;
double difY=ordonnee - y;
return Math.sqrt(difX*difX + difY*difY);
}
}
public class Application2 {
public static void main(String[]
args) {
double distance1, distance2;
Point p1= new Point(2,3);
Point p2= new Point(5,10);
distance1 = p1.distanceJusque(p2);
distance2 =
p1.distanceJusque(5.5,10.2);
System.out.println("La distance 1
= " + distance1);
System.out.println("La distance 2
= " + distance2);
}
}
Pr. A.SADIQ
Les variables de classe (variables statiques)(1/3)
• Exemple 1: Une association de plusieurs personnes:
• Chaque personne possède un nom
• Toutes les personnes partagent un compte bancaire (cp)
• Exemple 2: Une collection de films:
• Chaque film doit avoir un titre et un numéro
37
Classeset Objets
CHAPITREII
p1
A
2500
p2
B
2500
p3
C
2500
Compte
bancaire
f1
fl1
1
f2
fl2
2
f3
fl3
3
3 3 3
compteur
• Compteur contient le numéro du dernier film
crée,
• Compteur est un champ partagé par tous les
objets Film
•  compteur dépend de la classe et pas des
objets
Pr. A.SADIQ
Les variables de classe (variables statiques) (2/3)
• Il peut être utile de définir pour une classe des attributs indépendamment des instances : nombre de
films crées,
• Utilisation des Variables de classe comparables aux variables globales ,
• Variables dont il n’existe qu’un seul exemplaire associé à sa classe de définition,
• Variables existent indépendamment du nombre d’instances de la classe qui ont été créés,
• Variables communes à toutes les instances de votre classe,
• Variables utilisables même si aucune instance de la classe n’existe.
38
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Les variables de classe (variables statiques) (3/3)
• Elles sont définies comme des attributs mais avec le mot-clé static
• Pour y accéder, on utilise le nom de la classe (le nom d’une instance aussi
mais déconseillé):
• Exemple:
39
Classeset Objets
CHAPITREII
public static int numeroFilmCourant;
Film.numeroFilmCourant++;
public class Film {
public static int numeroFilmCourant=0;
public int numero;
private String titre;
public Film(String titre){
this.titre = titre;
}
public static void main(String[] args) {
Film f1=new Film("Film 1");
f1.numero = ++Film.numeroFilmCourant;
Film f2=new Film("Film 2");
f2.numero = ++Film.numeroFilmCourant;
}
}
Pr. A.SADIQ
Les constantes de classe (constantes statiques)
• Ce sont des constantes liées à une classe
• Elles sont écrites en MAJUSCULES
• Elles sont définies (en plus) avec les mots clés final et static:
• Pour y accéder, on utilise le nom de la classe:
40
Classeset Objets
CHAPITREII
public static final float NOMBRE_PI = 3.1416F;
public static final double VALEUR_TVA = 0.2;
Cercle c1 = new Cercle(5);
float surface = Math.pow(c1.r,2) * Cercle.NOMBRE_PI;
Pr. A.SADIQ
Les méthodes de classe (méthodes statiques)
• Les méthodes de classe sont associées directement à une classe,
• Ce sont des méthodes qui ne s'intéressent pas à un objet particulier,
• Utiles pour des calculs intermédiaires internes à une classe,
• Modifient les variables de classes,
• Elles sont définies comme les méthodes d'instances, mais avec le mot clé
static:
41
Classeset Objets
CHAPITREII
public static int getNumFilmCourant(){
return numeroFilmCourant;
}
int num = Film.getNumFilmCourant();
Pr. A.SADIQ
Les variables et méthodes de classe (Exercice1)
• Quelles erreurs ont été commises dans la définition de classe suivante et
dans son utilisation ?
42
Classeset Objets
CHAPITREII
class A{
static int f (int n){
q = n ;
}
void g (int n){
q = n ;
p = n ;
}
static private final int p = 20 ;
private int q ;
}
public class EssaiA{
public static void main (String args[]){
A a = new A() ;
int n = 5 ;
a.g(n) ;
a.f(n) ;
f(n) ;
}
}
• La méthode statique f de A ne peut pas agir sur un champ non
statique.
• l’affectation p=n est incorrecte car p est final.
• Il est préférable d’écrire A.f(n) au lieu de a.f(n).
• L’appel f(n) est incorrect puisqu’il n’existe pas de méthode f
dans la classe EssaiA.
Pr. A.SADIQ
Les variables et méthodes de classe (Exercice2)
• Réaliser une classe qui permet d’attribuer un numéro unique à chaque nouvel objet
créé (1 au premier, 2 au suivant...).
• On ne cherchera pas à réutiliser les numéros d’objets éventuellement détruits.
• On dotera la classe uniquement d’un constructeur, d’une méthode getNumero
fournissant le numéro attribué à l’objet et d’une méthode getNumCourant
fournissant le numéro du dernier objet créé.
• Écrire un petit programme d’essai qui donnera les résultats suivants:
• numéro de a : 1
• numéro de b : 2
• dernier numéro 2
• dernier numéro 3
43
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Passage des paramètres
• Deux principales manières de passer des paramètres en programmation:
1. Passage par valeur:
• Fournit une copie de la valeur du paramètre,
• La valeur effective du paramètre ne sera pas modifiée.
2. Passage par référence:
• Fourni l’emplacement de la variable concernée,
• La valeur de la variable sera modifiée.
• En java, contrairement à Pascal et C++, la passage par valeur est le seul
existant.
44
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Passage des paramètres - Exemple
45
Classeset Objets
CHAPITREII
public class ParValeur {
public static void auCaree(int x){
System.out.println("Début da la méthode: x= " + x);
x= x*x;
System.out.println("Fin da la méthode: x= " + x);
}
public static void main(String[] args) {
int x= 10;
auCaree(x);
System.out.println("Après la sortie da la méthode: x= " + x);
}
}
Début da la méthode: x= 10
Fin da la méthode: x= 100
Après la sortie da la méthode: x= 10
Pr. A.SADIQ
Passage des paramètres - Exercice
46
Classeset Objets
CHAPITREII
public class A {
public A (int nn){
n = nn ;
}
public int getN (){
return n ;
}
public void setN (int nn){
n = nn ;
}
private int n ;
}
public class Util {
public static void incre (A a, int p){
a.setN (a.getN()+p);
}
public static void incre (int n, int p){
n += p ;
System.out.println ("valeur de n (méthode): " + n) ;
}}
public class Trans {
public static void main (String args[]){
A a = new A(2) ;
int n = 3 ;
System.out.println ("valeur de a avant : " + a.getn()) ;
Util.incre (a, 5) ;
System.out.println ("valeur de a après : " + a.getn()) ;
System.out.println ("valeur de n avant : " + n) ;
Util.incre (n, 5) ;
System.out.println ("valeur de n apprès : " + n) ;
}
}
valeur de a avant : 2
valeur de a après : 7
valeur de n avant : 3
valeur de n (méthode): 8
valeur de n après : 3
Pr. A.SADIQ
Les collections - Définitions
• C'est l'organisation efficace d'un ensemble de données, sous la forme de
tableaux, de listes, de piles etc.
• Une collection gère un groupe d'un ensemble d'objets d'un type donné ; ou
bien c'est un objet qui sert à stocker d'autres objets.
• En java on a aussi les maps qui regroupent des données composées de paires
contenant une clé et une valeur associée à cette clé. (clé , valeur)
47
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Les collections - Types
• Set: est un ensemble ne contenant que des valeurs et ces valeurs ne sont pas
dupliquées. On y trouve les objets HashSet, TreeSet, LinkedHashSet…
• Par exemple l'ensemble A = {2,1,8,4}.
• SortedSet est un Set trié.
• Par exemple l'ensemble A = {1,2,4,8}.
• List: Autorise la duplication. On y trouve les objets Vector, LinkedList et
ArrayList
• Par exemple l'ensemble A = {1,2,2,1,4,9,2}.
48
Classeset Objets
CHAPITREII
Pr. A.SADIQ
Problèmes des tableaux en java
• Un programme a souvent besoin de pouvoir gérer une suite d’éléments:
• La liste des notes d’un étudiants, la liste des points formant un polygone, etc.
• 1ère solution: Les tableaux
• la taille d’un tableau ne peut plus varier une fois qu’il a été créé.
• Pour ajouter une nouvelle note par exemple:
• créer un nouveau tableau, plus grand ;
• copier l’ancien tableau dans le nouveau ;
• ajouter le nouvel élément ;
• faire pointer la variable d’origine vers le nouveau tableau.
• 2ème solution: Utilisation des collections, la plus simple est la classe ArrayList.
49
Classeset Objets
CHAPITREII
• Plusieurs lignes de code;
• Gaspillage de la mémoire,
• Risque des bogues,
• Etc.
Pr. A.SADIQ
La classe ArrayList (tableau dynamique)
• La classe ArrayList permet de construire des tableaux de taille variable.
• Déclaration:
• Note: Classes enveloppes:
• Numérique: Byte, Short, Integer , Long, Float et enfin Double,
• Caractère: Character,
• Booléen: Boolean,
• Sans type: Void.
• Pour créer un objet ArrayList:
• Pour pouvoir utiliser la classe ArrayList:
50
Classeset Objets
CHAPITREII
ArrayList<String> maListe; //Une liste de chaines de caractères
ArrayList<Double> maListe; //Une liste des réels
ArrayList<Integer> maListe; //Une liste des entiers
Etc..
import java.util.ArrayList;
maListe= new ArrayList<String>();
Pr. A.SADIQ
ArrayList– Méthodes de traitement
• int size() : fonction qui renvoie la longueur d’une ArrayList;
• boolean isEmpty() : renvoie vrai si l'objet est vide ;
• Type get(int i) : retourne l'élément à l'indice i ;
• add(Type element) : permet d'ajouter un élément à la fin de la liste;
• add(int i, Type element) : ajoute la valeur element à la position i.
• remove(int i) : efface l’élément à l'indice i ;
• remove(Type element) : supprime la première occurrence de element;
• set(int i, Type element) : remplace l’ancienne valeur qui était dans la case i par
element.
• boolean contains(Object element) : retourne vrai si element est dans l'ArrayList.
• int indexOf(Type element) : renvoie la position de element dans la liste, et -1 sinon;
• clear() : vide la liste.
51
Classeset Objets
CHAPITREII
Pr. A.SADIQ
ArrayList – Parcourir les éléments avec foreach
• La boucle foreach est une boucle for avancée, qui permet de parcourir les
éléments d’un tableau ou d’une collection, un par un dans l'ordre.
• Syntaxe de foreach:
• Exemple:
• Equivalent à:
52
Classeset Objets
CHAPITREII
for(type variable : tableau | collection){
……
}
for(String s : listString) {
System.out.println(s);
}
for(int i=0;i<listString.size();i++) {
System.out.println(listString.get(i));
}
Pr. A.SADIQ
ArrayList - Exemple
53
Classeset Objets
CHAPITREII
import java.util.ArrayList;
public class MyArrayList3 {
public static void main(String[] args) {
//créer un arraylist
ArrayList<String> str = new
ArrayList<String>();
//Ajout
str.add("o1");
str.add("o2");
str.add("o3");
str.add("o4");
//Quelques méthodes qu'on a vu
System.out.println("indice de o2:
"+str.indexOf("o2"));
System.out.println("o3 existe ? "
+str.contains("o3"));
System.out.println("o2 supprimé avec
succès: "+str.remove("o2"));
System.out.println("taille: "+str.size());
//On peut ajouter d'autres éléments
str.add("o5");
str.add("o6");
//parcours avec foreach
for(String s : str)
System.out.println(s);
//Ou bien avec for simple
for(int i=0;i<str.size();i++)
System.out.println(str.get(i));
//Effacer toute la liste
str.clear();
System.out.println("liste est vide ? "
+str.isEmpty());
}}
Pr. A.SADIQ
Les chaines de caractères en java
• Un String est une suite ou une séquence de caractères.
• Dans beaucoup de langages un String n'est autre qu'un tableau de caractères,
alors qu'en Java un String est un objet.
• Java propose 3 classes apparentées aux chaînes de caractères :
• La classe String (chaîne de caractères non modifiables)
• La classe StringBuffer (chaîne de caractères modifiables à volonté)
• La classe StringTokenizer (séparation d'une chaîne en plusieurs entités)
• Dans ce cours, nous allons nous intéresser à la classe String.
54
Classeset Objets
CHAPITREII
Pr. A.SADIQ
La classe String
• String n’est pas un type primitif, c’est une classe
• Déclaration et initialisation :
• Cette classe dispose de 11 constructeurs càd 11 façons de créer une chaine
de caractères.
55
Classeset Objets
CHAPITREII
String s1, s2;
s1 = "Hello";
s2 = "le monde";
String s3 = "Hello";
char[] tab = {’b’,’o’,’n’,’j’,’o’,’u’,’r’};
String s = new String(tab);
………
Pr. A.SADIQ
Différences entre objets et types de base
56
Classeset Objets
CHAPITREII
int x=3, y=3;
x == y est vrai
String s1="abc", s2="abc";
s1 == s2 est faux...
Mémoire
3
3
0x768
abc
0x852
abc
Quand on compare 2 variables d’un type de base on compare leur
valeur. Quand on compare 2 objets avec les opérateurs on compare
leur références (leur adresses en mémoire).
Introduction de la méthode equals() pour les objets : s1.equals(s2)
est vrai
Pr. A.SADIQ
La classe String – Exemple (Résultat d’un programme)
57
Classeset Objets
CHAPITREII
String ch1 = new String();
System.out.println ("A - ch1 =:" + ch1 + ":") ;
String ch2 = "hello" ;
System.out.println ("B - ch2 =:" + ch2 + ":") ;
String ch3 = new String ("bonjour") ;
System.out.println ("C - ch3 =:" + ch3 + ":") ;
String ch4 = new String (ch3) ;
System.out.println ("D - ch4 =:" + ch4 + ":") ;
ch3 = "bonsoir" ;
System.out.println ("E - ch4 =:" + ch4 + ": ch3 =:" + ch3 + ":") ;
ch4 = ch3 ;
ch3 = "au revoir" ;
System.out.println ("F - ch4 =:" + ch4 + ": ch3 =:" + ch3 + ":") ;
A - ch1 =::
B - ch2 =:hello:
C - ch3 =:bonjour:
D - ch4 =:bonjour:
E - ch4 =:bonjour: ch3 =:bonsoir:
F - ch4 =:bonsoir: ch3 =:au revoir:
Pr. A.SADIQ
La classe String – quelques méthodes
58
Classeset Objets
CHAPITREII
String str1 = "bonjour";
int n = str1.length(); // n vaut 7
if (str1 == str2) ...
if (str1.equals(str2)) ...
str1.compareTo(str2);
String s3 = s1.concat(s2);
String mot = message + " et " + "puis s'en vont";
String msg = "Attention!";
msg = "nouveau texte";
public String substring(int debut, int fin);
public String substring(int debut);
Pr. A.SADIQ
Méthodes de la classe String
59
Classeset Objets
CHAPITREII
Méthodes la classe String Rôle
charAt(int) renvoie le nième caractère de la chaine
compareTo(String) compare la chaîne avec l'argument
concat(String) ajoute l'argument à la chaîne et renvoie la nouvelle chaîne
endsWith(String) vérifie si la chaîne se termine par l'argument
equalsIgnoreCase(String) compare la chaîne sans tenir compte de la casse
indexOf(String) renvoie la position de début à laquelle l'argument est contenu dans la chaine
lastIndexOf(String) renvoie la dernière position à laquelle l'argument est contenu dans la chaine
lenght() renvoie la longueur de la chaine
replace(char,char) renvoie la chaîne dont les occurrences d'un caractère sont remplacées
startsWith(String int) Vérifie si la chaîne commence par la sous chaîne
substring(int,int) renvoie une partie de la chaine
toLowCase() renvoie la chaîne en minuscule
toUpperCase() renvoie la chaîne en majuscule
trim() enlève les caractères non significatifs de la chaine
Pr. A.SADIQ
Classe String - Exercice
60
Classeset Objets
CHAPITREII
• Ecrivez une classe TestChaine qui crée une chaîne de caractères et qui:
• Affiche les 3 premiers caractères, les 3 derniers, la chaine en majuscules
puis en minuscule.
• Ajoutez une méthode isJavaSource qui test si un nom de fichier se termine
par ".java"
Pr. A.SADIQ
Héritage et polymorphisme CHAPITREIII
Introduction
• Il existe 3 types fondamentaux de relations entre classes:
• La généralisation / Spécialisation (Héritage):
• Elle indique qu’une classe peut être assimilée à une autre classe qui correspond à une notion plus
abstraite ou générale.
• Ce type désigne une relation "EST UN".
• Exemple: Un rectangle est une forme, un chien est un animal, etc.
• L’ensemble / composant (Agrégation et composition):
• Cette relation permet de créer une relation de dépendance d’une classe envers une autre.
• Ce type désigne une relation "A UN".
• Exemple: Un rectangle a plusieurs cotés, Une voiture a des roues, etc.
• L’association :
• Traduisant une dépendance sémantique entre des classes qui ne sont pas reliées autrement.
• Exemple: Un client reçoit une facture, un client envoie une commande, etc.
62
Héritageet
polymorphisme
CHAPITREIII
Pr. A.SADIQ
Héritage - Définition
• L’héritage est un mécanisme permettant de factoriser les attributs et les
méthodes communs à plusieurs classes dans une classe principale : on parle de
généralisation.
• Les classes dérivées deviennent des sous-classes : on parle de spécialisation.
• Exemple:
63
Héritageet
polymorphisme
CHAPITREIII
Forme
Rectangle Triangle
Carre
Généralisation
Spécialisation
Pr. A.SADIQ
Héritage - Intérêts
• L’héritage permet la réutilisation du code.
• Lorsque l’on va instancier une classe spécialisée, le code des attributs et des méthodes de la
classe héritée ne seront pas implémentés à nouveau.
• L’héritage permet l’organisation hiérarchique des classes.
• C’est à dire qu’il rend plus aisé l’exploration et la maintenance d’une bibliothèque de
classes pour une équipe de développement.
64
Héritageet
polymorphisme
CHAPITREIII
Pr. A.SADIQ
Héritage - Principes
• La relation d’héritage est unidirectionnelle
• Si une classe B hérite d’une classe A:
• B est une (sous-classe, classe fille ou classe dérivée) de A.
• A est une (classe mère ou superclasse) de B.
• Une sous-classe B est un cas particulier de A
• La classe B hérite les attributs et les méthodes de la classe mère A.
• En java, on dit que B étend A:
• Possibilité d’ajouter des champs,
• Possibilité d’ajouter des méthodes.
65
Héritageet
polymorphisme
CHAPITREIII
Pr. A.SADIQ
Héritage - Syntaxe
• Pour exprimer l’héritage en java, on utilise le mot extends (étend).
• Exemple:
• Remarques:
• Pas nécessaire de redéfinir les champs et les méthodes héritées,
• Possibilité d’ajouter des champs et/ou des méthodes,
• Possibilité de surcharger les méthodes héritées,
• Possibilité de redéfinir les méthodes héritées.
66
Héritageet
polymorphisme
CHAPITREIII
public class Rectangle extends Forme{…}
public class Triangle extends Forme{…}
public class Carre extends Rectangle{…}
Pr. A.SADIQ
Héritage – Classe Object
• En java, toutes les classes sont dérivée de la classe Object.
• La classe Object est la classe de base de toutes les autres. C'est la seule classe
de Java qui ne possède pas de classe mère.
• Tous les objets en Java, quelle que soit leur classe, sont du type Object.
• Cela implique que tous les objets possèdent déjà à leur naissance un certain
nombre d'attributs et de méthodes dérivées d'Object.
• toString(), clone(), equals(…).
• Dans la déclaration d'une classe, si la clause extends n'est pas présente, la classe
immédiatement supérieure est donc Object.
67
Héritageet
polymorphisme
CHAPITREIII
Pr. A.SADIQ
• L’attribut cote est égal à largeur et longueur
• Un carré est un rectangle tel que longueur = largeur.
• Donc un objet Carre hérite la valeur de son cote depuis la classe mère Rectangle
Héritage – Exemple (1/2)
68
Héritageet
polymorphisme
CHAPITREIII
Rectangle
- largeur: int
- longueur: int
<<Rectangle (int,int)>>
+getLongueur():int
+getLargeur():int
+setLongueur(int):void
+setLargeur(int):void
+surface():int
+affiche():void
Carre
- cote: int
<<Carre (int)>>
+getCote():int
+setCote(int):void
+surface():int
+affiche():void
public class Rectangle{
…
public Rectangle(int a, int b){
longueur=a;
largeur=b;
}
}
public class Carree extends Rectangle{
…
public Carree(int a){
// Utiliser le constructeur de la
classe mère : super;
}
}
public class Rectangle{
…
public void affiche(){
System.out.println("rectangle
: " + longueur + "x" + largeur);
}
}
public class Carre extends Rectangle{
…
public void affiche(){
//Redéfinir la fonction
}
}
• Les deux methodes getCote() et setCote() sont les même que celles définies dans la
classe mère. Aussi pour la méthode surface().
• Un objet Carre hérite ces méthodes.
Pr. A.SADIQ
Héritage – Exemple (2/2)
69
Héritageet
polymorphisme
CHAPITREIII
public class Rectangle{
private int longueur,largeur;
//Constructeur
public Rectangle(int a,int b){
longueur = a; largeur = b;}
//Setters et getters
public void setLongueur(int l){…}
public void setLargeur(int l){…}
public int getLongueur(){…}
public int getLargeur(){…}
//Calculer la surface d’un rectangle
public int surface(){
return longueur * largeur;}
//Afficher les infos d’un rectangle
public void affiche(){
System.out.println("rectangle: "
+ longueur + "x" + largeur);}
}
public class Carre extends Rectangle
{
//Constructeur
public Carre(int cote){
super(cote,cote);
}
//Afficher les infos d’un carré
public void affiche(){
System.out.println("carré: " +
getLongueur() + "x" + getLargeur());
}
}}
Appel du constructeur de la
classe mère
On a redéfini la fonction affiche()
Pr. A.SADIQ
Héritage – Constructeur et le mot clé super
• La classe fille doit prendre en charge la construction de la classe mère:
• Pour construire un carré, il faut construire d’abord un rectangle (Un carré est un rectangle)
• Le constructeur de la classe mère (Rectangle) est donc appelé avant le
constructeur de la classe fille (Carre).
• En effet, on doit utiliser le mot clé super.
• Exemple:
70
Héritageet
polymorphisme
CHAPITREIII
public class A{
private int i;
//Constructeur
public A(int a){
i = a;
}
}
public class B extends A{
private double z;
//Constructeur
public B(int a,double z){
//Appel explicite
super(a);
this.z = z;
}}
Pr. A.SADIQ
Héritage – Redéfinition (overriding)
• On dit qu’une méthode d’une sous-classe redéfinit une méthode de sa classe
supérieure, si elles ont la même signature mais que le traitement effectué est
réécrit dans la sous-classe
• Exemple:
71
Héritageet
polymorphisme
CHAPITREIII
public class Carre extends Rectangle {
//Constructeur
public Carre(int cote){
super(cote,cote);
}
//Afficher les infos d’un carré
public void affiche(){
System.out.println("carré: " + getLongueur() + "x" + getLargeur());
}
}}
Pr. A.SADIQ
Héritage – Exemple
72
Héritageet
polymorphisme
CHAPITREIII
class A{
public void affiche(){
System.out.println ("Je suis un A") ;
}
}
class B extends A {…}
class C extends A{
public void affiche(){
System.out.println ("Je suis un C") ;
}
}
class D extends C{
public void affiche(){
System.out.println ("Je suis un D") ;
}
}
class E extends B {…}
class F extends C {…}
class DiagHeri{
public static void main (String
arg[]){
A a = new A() ; a.affiche() ;
B b = new B() ; b.affiche() ;
C c = new C() ; c.affiche() ;
D d = new D() ; d.affiche() ;
E e = new E() ; e.affiche() ;
F f = new F() ; f.affiche() ;
}
}
Je suis un A
Je suis un A
Je suis un C
Je suis un D
Je suis un A
Je suis un C
Pr. A.SADIQ
Héritage – la portée protected
73
Héritageet
polymorphisme
CHAPITREIII
Type Mot-clé Description
Publique public
Accessible depuis n’importe quel point de
l’application
Protégée protected
Accessible uniquement depuis les classes
du même package et les classes filles
Package
Accessible uniquement depuis les classes
du même package
Privée private
Accessible uniquement dans la classe de
déclaration et les classes internes
Pr. A.SADIQ
Héritage – Affectation d’objets (1/2)
• Une classe enfant a son propre type mais partage également le même type que
sa classe parente.
• Par exemple, un triangle est une forme mais l’inverse n’est pas vrai, une forme
n’est pas nécessairement un triangle.
• Exemple:
• 2 cas d’affectation d’objets: Upcasting et Downcasting.
74
Héritageet
polymorphisme
CHAPITREIII
Point A1 = new Point(0,1);
Point A2 = new Point(3,4);
Forme forme = new Forme(A1,2,3);
Triangle triangle = new Triangle(A1,A2,10,12);
Pr. A.SADIQ
Héritage – Affectation d’objets (2/2)
• 1er cas :
• Conversion implicite de: tout triangle est une
forme.
• Le compilateur fait une copie en ignorant les
membres excédentaires (A2)
• C’est l’upcasting (transtypage vers le haut ou
implicite)
75
Héritageet
polymorphisme
CHAPITREIII
forme = triangle; • 2ème cas :
• Une forme n’est pas forcément un triangle.
• Une forme n’a pas toute les données d’un
triangle. (Point A2)
• Solution: il faut caster (forcer le changement
du type).
• C’est le downcasting (transtypage vers le bas
ou explicite)
triangle = forme;//Erreur
triangle = (Triangle) forme;
Forme
Triangle
Upcasting Downcasting
Pr. A.SADIQ
Héritage – Le mot clé instanceof
• Le mot clé instanceof permet de savoir à quelle classe appartient une instance.
• Exemple 1:
76
Héritageet
polymorphisme
CHAPITREIII
class B {…}
class D extends B{…}
class C{…}
class test{
… main(…){
B b = new B();
D d = new D();
C c = new C();
b instanceof B;
b instanceof D;
d instanceof B;
d instanceof D;
b = d;
b instanceof B;
b instanceof D;
c instanceof B;
}}
true
false
true
true
true
true
Erreur de compilation
• Exemple 2:
Forme f=new Triangle(…);
if( f instanceof Triangle){
//true
}
if(f instanceof Rectangle){
//False
}
Pr. A.SADIQ
Héritage – le mot clé final
• Un attribut déclaré final est un attribut constant.
• Une classe final est une classe qui ne peut pas avoir de filles.
• Une classe final ne peut pas être étendue: le mécanisme d'héritage est bloqué.
• Mais une classe final peut évidemment être la fille d'une autre classe (non final!).
• Une méthode final est une méthode qui ne peut pas être redéfinie dans les sous-classes.
• Intérêt 1 : cela permet d'interdire la redéfinition d'une méthode par le biais de
l'héritage:
• ex : final boolean checkPassword()
• Intérêt 2 : cela permet de gagner du temps à la compilation:
• Une variable ou un attribut déclarés final sont constants => le compilateur interdit de les modifier
77
Héritageet
polymorphisme
CHAPITREIII
Pr. A.SADIQ
Héritage – Exercice de synthèse
78
Héritageet
polymorphisme
CHAPITREIII
Forme
- p1 : Point
- largeur: int
- longueur: int
<<Forme(Point,int,int)>>
+//getters
+//setters
+surface():int
+perimetre():int
+affiche():void
Rectangle
<<Rectangle(Point,int,int)>>
+affiche():void
Triangle
- p2 : Point
<<Triangle(Point,Point,int,int)>>
+//getter et setter pour p2
+perimetre():int
+affiche():void
Carre
<<Carre(Point,int,int)>>
+affiche():void
Pr. A.SADIQ
Polymorphisme – Définition
• Le polymorphisme permet de donner le même nom à des traitements différents.
• Le polymorphisme permet de manipuler des objets sans connaitre leur type.
• On pourra remarquer que la surcharge de méthode est aussi considéré comme du
polymorphisme. (polymorphisme ad-hoc)
• Le polymorphisme ad-hoc (surcharge) permet le choix statique d’un traitement en fonction de
l’objet auquel il est appliqué. (déterminé lors de la compilation)
• Lorsqu'il provient d'une redéfinition de méthode, on l'appelle polymorphisme par sous-
typage. (polymorphisme d’héritage)
• Le polymorphisme d’héritage permet le choix dynamique d’un traitement en fonction de l’objet
auquel il est appliqué. (déterminé à l’exécution par la JVM - late binding (liaison retardée) )
• En général, on définit le polymorphisme comme suit:
79
Héritageet
polymorphisme
CHAPITREIII
Le polymorphisme peut être vu comme la capacité de choisir dynamiquement la
méthode qui correspond au type réel de l’objet.
Pr. A.SADIQ
Polymorphisme – Principe
• Si la classe B hérite de la classe A
• Classe B EST-UN Classe A
• Toute méthode m de A peut-être invoquée sur une instance de la classe B.
• Le polymorphisme consiste à exploiter cela en fournissant un B dans les expressions qui
attendent un A.
• Exemple:
• Un des avantages de ceci est de pouvoir utiliser une seule référence f1 de la classe
Forme pour référencer une Forme ou un Rectangle.
80
Héritageet
polymorphisme
CHAPITREIII
Forme f1 = new Rectangle(…);
Forme f2 = new Triangle(…);
f1.surface(); // lance la méthode surface() de la classe Rectangle
f2.surface(); // lance la méthode surface() de la classe Triangle
Pr. A.SADIQ
Polymorphisme – Exemple
• L’utilisation de la méthode polymorphe: affiche()
81
Héritageet
polymorphisme
CHAPITREIII
Point p1 = new Point(3,4);
Point p2 = new Point();
Forme[] tab= new Forme[4];
Tab[0]=new Rectangle(p1,10,20);
Tab[1]=new Carre(p1,10,20);
Tab[2]=new Carre(p1,5);
Tab[3]=new Triangle(p1,p2,6,8);
For(Forme f: tab){
f.affiche();
}
Pr. A.SADIQ
Polymorphisme – Exercice de compréhension 1
82
Héritageet
polymorphisme
CHAPITREIII
class A{
public void affiche() {
System.out.println("Je suis un A ");
}}
class B extends A {}
class C extends A{
public void affiche() {
System.out.println("Je suis un C ");
}}
class D extends C{
public void affiche() {
System.out.println("Je suis un D ");
}}
public class Poly{
public static void main (String arg[]){
A a = new A() ; a.affiche() ;
B b = new B() ; b.affiche() ;
a = b ; a.affiche() ;
C c = new C() ; c.affiche() ;
a = c ; a.affiche() ;
D d = new D() ; d.affiche() ;
a = d ; a.affiche() ;
c = d ; c.affiche() ;
}}
Je suis un A
Je suis un A
Je suis un A
Je suis un C
Je suis un C
Je suis un D
Je suis un D
Je suis un D
Pr. A.SADIQ
Polymorphisme – Exercice de compréhension 2
83
Héritageet
polymorphisme
CHAPITREIII
public class Forme {
public void seDefinir(){
System.out.println("Je suis une forme.");
}}
public class Polygone extends Forme{
public void seDefinir(){
super.seDefinir();
System.out.println("Je suis aussi un
polygone.");
}}
public class Triangle extends Polygone{}
public class Rectangle extends Polygone{
public void seDefinir(){
super.seDefinir();
System.out.println("Je suis aussi un
rectangle.");
}}
public class Carre extends Rectangle{}
public class LesFormes{
public static void main(String[] args){
Rectangle r = new Rectangle();
Carre c = new Carre();
Polygone t = new Triangle();
Forme p = new Polygone();
Forme f = new Forme();
System.out.println("Rectangle:");
r.seDefinir();
System.out.println("Carre:");
c.seDefinir();
System.out.println("Triangle:");
t.seDefinir();
System.out.println("Polygone:");
p.seDefinir();
System.out.println("Forme:");
f.seDefinir();
}}
Rectangle:
Je suis une forme.
Je suis aussi un polygone.
Je suis aussi un rectangle.
Carre:
Je suis une forme.
Je suis aussi un polygone.
Je suis aussi un rectangle.
Triangle:
Je suis une forme.
Je suis aussi un polygone.
Polygone:
Je suis une forme.
Je suis aussi un polygone.
Forme:
Je suis une forme.
Pr. A.SADIQ
Polymorphisme – Avantages
• Plus besoin de distinguer différents cas en fonction de la classe des objets.
• Le polymorphisme constitue la troisième caractéristique essentielle d’un langage
orienté objet après l’abstraction des données (encapsulation) et l’héritage.
• Une plus grande facilité d’évolution du code. Possibilité de définir de nouvelles
fonctionnalités en héritant de nouveaux types de données à partir d’une classe de base
commune sans avoir besoin de modifier le code qui manipule la classe de base.
• Développement plus rapide.
• Plus grande simplicité et meilleure organisation du code.
• Programmes plus facilement extensibles.
• Maintenance du code plus aisée.
84
Héritageet
polymorphisme
CHAPITREIII
Pr. A.SADIQ
Classe abstraite - Exemple
85
Héritageet
polymorphisme
CHAPITREIII
Forme
- p1 : Point
- largeur: int
- longueur: int
+surface():int
+perimetre():int
+affiche():void
Rectangle
Triangle
Carre
• Différents types de formes avec des points communs (héritage).
• Une classe Forme a pour rôle de rassembler toutes les autres classes
(Rectangle, Carre, Triangle).
• La question:
• Qu’est censé faire un objet Forme?
• Qu’il est son coin, sa longueur et sa largeur?
• Comment calculer son périmètre?
• Nous sommes face au problème suivant : la classe Forme est indispensable
pour les besoins de l'héritage, mais cela n'a pas de sens de créer des objets
Forme. Il faut donc empêcher l'instanciation de la classe Forme.
• Ce type de classes s’appellent classes abstraites:
• Considérées comme des super-classe des classes filles.
• Autre exemple: Soit la classe Humain(classe abstraite), à partir de laquelle
dérivent la classe Homme et la classe Femme.
Pr. A.SADIQ
Pr. A.SADIQ
Exercice
• Créer une classe Ville correspondant au schéma UML indiqué. Ecrivez la méthode decrisToi() qui affiche à l’écran le
nom de la ville et le nombre d’habitants
• Créez une classe Monde qui utilise la classe Ville. La fonction main dans Monde comprendra les lignes suivantes:
Ville[] mesVilles=new Ville[5];
mesVilles[0]= new Ville(« Rabat »);
mesVilles[1]= new Ville(« Sale»);
• Créez une classe Capitale qui hérite de la classe Ville.
Celle-ci comprendra une variable d’instance supplémentaire : nomPays.
• Redéfinissez la méthode decrisToi(), en faisant appel à la méthode
de la classe mère.
decrisToi() affichera à l’écran :
Capitale de nomPays: nomVille ; nbHabitants.
86
Héritageet
polymorphisme
CHAPITREIII
Ville
- nbHabitants : int
- nomVille : String
+ Ville(String)
+ decrisToi(): void
+ getNomVille(): String
+ getNbHabitants(): int
+ setNbHabitants(int): void
Pr. A.SADIQ
Exercice
• Ecrire une classe Forme qui dispose d’un centre de gravité de type point ( point est une classe), une couleur
et de constructeur.
• Ecrire trois classe Cercle (caractériser par son rayon), Rectangle (caractériser par sa largeur et sa hauteur),
Triangle (caractériser par ses trois côtés), qui héritent de Forme
• Toute forme géométrique doit posséder les méthodes suivantes :
• Translation(), prenant en paramètre deux nombres exprimant le déplacement horizontal et vertical.
• Homothétie(), prenant en paramètre un nombre représentant le ratio de l'homothétie.
• Afficher(), donne une représentation sous la forme d'une chaîne de caractères contenant le nom de sa classe
et la description textuelle de chacun de ses attributs.
• Périmètre, calcule le périmètre .
• aire(), calcule l’aire de la forme.
• Utiliser la redéfinition et le Surcharge pour définir la méthode dessiner()
• Créer une classe « Dessin » qui contient la méthode main
87
Héritageet
polymorphisme
CHAPITREIII
Classe abstraite
• Les classes abstraites servent à définir des concepts incomplets qui seront complétés dans les
sous-classes.
• Autrement dit, le mécanisme des classes abstraites permet de définir des comportements
(méthodes abstraites) qui devront être implémentés dans les classes filles, mais sans
implémenter ces comportements.
• c’est-à-dire sans écrire de code pour cette méthode.
• Par exemple, la méthode perimetre() ne peut pas être implémentée dans la déclaration de la
classe Forme, car on ne sait pas comment calculer le périmètre d'une forme quelconque :
• le périmètre d'un rectangle ne se calcule pas de la même manière que le périmètre d’un triangle.
• Déclaration d’une classe abstraite
88
Héritageet
polymorphisme
CHAPITREIII
public abstract class Forme {}
public class Rectangle extends Forme {}
public class Triangle extends Forme {}
Pr. A.SADIQ
Méthode abstraite
• Une méthode abstraite est une méthode dont l'implémentation n'est pas fournie.
• Cette méthode devra être redéfinie dans une des sous-classes.
• pas d’accolades mais un simple ; à la suite de la signature de la méthode) :
• A retenir:
• Une classe qui contient au moins une méthode abstraite doit être déclarée abstract.
• Une classe abstraite ne peut pas être instanciée.
• Une classe dérivée d'une classe abstraite, ne redéfinissant pas toutes les méthodes
abstraites, sera elle même abstraite.
• Classe dérivée d'une classe non abstraite (classe concrète) peut être déclarée abstraite.
• Une classe abstraite est totalement l'opposé d'une classe final.
89
Héritageet
polymorphisme
CHAPITREIII
public abstract int perimetre(); //dans la classe abstraite Forme
public abstract void affiche();
Pr. A.SADIQ
classe abstraite – Exemple
90
Héritageet
polymorphisme
CHAPITREIII
abstract public class Forme {
private int longueur,largeur;
private Point p1;
//Pas de constructeur
//Setters et getters
//Calculer la surface d’une forme
public int surface(){
return longueur * largeur;}
//les méthodes abstraites
abstract public void affiche();
abstract public int perimetre();
}
Pr. A.SADIQ
Pr. A.SADIQ
Classe abstraite (Exemple)
91
public class Cercle extends Figure {
private double rayon ;
public Cercle ( double rayon)
{
super ( " cercle " ) ;
this. rayon = rayon ;
}
public double aire ( )
{
return Math . PI this . rayonthis . rayon ;
} }
abstract public class Figure {
private String nom;
public Figure (String nom)
{
this.nom=nom;
}
abstract public double aire ( ) ;
public void quiSuisJe ( ) //polymorphisme
{
System.out.println ( " Je suis un " + this.nom) ;
}
}
public class Rectangle extends Figure {
private double largeur ;
private double longueur ;
public Rectangle (double largeur ,
double longueur )
{
super ( " rectangle" ) ;
this.largeur = largeur ;
this.longueur = longueur;
}
public double aire ( )
{
return this.largeur *this.longueur;
}
}
Interface – Définition
• Quand toutes les méthodes d'une classe sont abstraites et qu'il n'y a aucun
attribut, on aboutit à la notion d'interface.
• Une interface est un prototype de classe. Elle définit la signature des méthodes
qui doivent être implémentées dans les classes construites à partir de ce
prototype.
• Une interface est une classe purement abstraite dont toutes les méthodes sont
abstraites et publiques et sans attributs (les mots-clés abstract et public sont
optionnels).
• Déclaration:
92
Héritageet
polymorphisme
CHAPITREIII
public interface NomClasse { . . . }
Pr. A.SADIQ
Interface – Implémentation
• Pour préciser qu'une classe implémente une interface, on utilise le mot-clé :
implements
• Attention : la classe doit implémenter toutes les méthodes de l'interface, sinon
elle doit être déclarée abstract.
• Une classe peut implémenter plusieurs interfaces :
• Une classe peut hériter d'une autre classe et implémenter une ou plusieurs
interfaces :
93
Héritageet
polymorphisme
CHAPITREIII
class NomClasse implements NomInterface { . . . }
class A implements Interface1 , Interface2 , . . .
class A extends B implements Interface1 , . . .
Pr. A.SADIQ
Interface – A retenir
• Une interface ne possède pas d'attributs. Les interfaces ne sont pas instanciables
(comme les classes abstraites).
• Une interface n'a pas de constructeurs.
• Une interface peut définir des constantes, c'est-à-dire définir des variables
déclarées publiques, statiques et finales et ayant une valeur constante
d'affectation.
• Une interface peut hériter d'une autre interface :
94
Héritageet
polymorphisme
CHAPITREIII
interface Interface1 extends Interface2 { . . }
Pr. A.SADIQ
Interface – Exemple
95
Héritageet
polymorphisme
CHAPITREIII
public interface Animal {
public String getNom();
public void dormir();
}
public class Lion implements Animal{
private String nom;
public Lion (String nom) {
this.nom = nom;
}
public String getNom() {
return this.nom;
}
public void dormir() {
System.out.println(this.nom + " :
Je dors sous les arbres.");
}}
public class Jaguar implements Animal {
private String nom;
public Tigre (String nom) {
this.nom = nom;
}
public String getNom() {
return this.nom;
}
public void dormir() {
System.out.println(this.nom + " :
Je dors sur les branches des arbres.");
}
}
Pr. A.SADIQ

Contenu connexe

Similaire à Java-2eme partie.pptx

DesignPatternsISI.pdf
DesignPatternsISI.pdfDesignPatternsISI.pdf
DesignPatternsISI.pdfandre543581
 
Java cours n° 2 - classe-objet-constructeur
Java   cours n° 2 - classe-objet-constructeurJava   cours n° 2 - classe-objet-constructeur
Java cours n° 2 - classe-objet-constructeurAbdelwahab Naji
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPkemenaran
 
c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)Mahfoud EL HOUDAIGUI
 
PROGRAMMATION 2e GENIE PARTIE THEORIE.ppt
PROGRAMMATION 2e GENIE PARTIE THEORIE.pptPROGRAMMATION 2e GENIE PARTIE THEORIE.ppt
PROGRAMMATION 2e GENIE PARTIE THEORIE.pptEddySHANGA
 
Cours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partieCours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partiekadzaki
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonAbdoulaye Dieng
 
Cours java smi_2011_2012_partie_i_29_octobre_2011
Cours java smi_2011_2012_partie_i_29_octobre_2011Cours java smi_2011_2012_partie_i_29_octobre_2011
Cours java smi_2011_2012_partie_i_29_octobre_2011yassine kchiri
 
m103-resume-cours-theorique-6156f136c407b.pdf
m103-resume-cours-theorique-6156f136c407b.pdfm103-resume-cours-theorique-6156f136c407b.pdf
m103-resume-cours-theorique-6156f136c407b.pdfFootballLovers9
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Csharp2 : classes et objets
Csharp2 : classes et objetsCsharp2 : classes et objets
Csharp2 : classes et objetsAbdoulaye Dieng
 
Architecture des types de contenu : ce qui a changé en Drupal 7
Architecture des types de contenu : ce qui a changé en Drupal 7Architecture des types de contenu : ce qui a changé en Drupal 7
Architecture des types de contenu : ce qui a changé en Drupal 7slybud
 
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdfTutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdfRihabBENLAMINE
 
Chap 03 poo en java partie1
Chap 03 poo en java partie1Chap 03 poo en java partie1
Chap 03 poo en java partie1Yassine Badri
 

Similaire à Java-2eme partie.pptx (20)

DesignPatternsISI.pdf
DesignPatternsISI.pdfDesignPatternsISI.pdf
DesignPatternsISI.pdf
 
Java cours n° 2 - classe-objet-constructeur
Java   cours n° 2 - classe-objet-constructeurJava   cours n° 2 - classe-objet-constructeur
Java cours n° 2 - classe-objet-constructeur
 
POO-chapitre3.pptx
POO-chapitre3.pptxPOO-chapitre3.pptx
POO-chapitre3.pptx
 
Cours_Java.pdf
Cours_Java.pdfCours_Java.pdf
Cours_Java.pdf
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
 
c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)
 
PROGRAMMATION 2e GENIE PARTIE THEORIE.ppt
PROGRAMMATION 2e GENIE PARTIE THEORIE.pptPROGRAMMATION 2e GENIE PARTIE THEORIE.ppt
PROGRAMMATION 2e GENIE PARTIE THEORIE.ppt
 
Cours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partieCours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partie
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
 
Cours java smi_2011_2012_partie_i_29_octobre_2011
Cours java smi_2011_2012_partie_i_29_octobre_2011Cours java smi_2011_2012_partie_i_29_octobre_2011
Cours java smi_2011_2012_partie_i_29_octobre_2011
 
De Java à .NET
De Java à .NETDe Java à .NET
De Java à .NET
 
m103-resume-cours-theorique-6156f136c407b.pdf
m103-resume-cours-theorique-6156f136c407b.pdfm103-resume-cours-theorique-6156f136c407b.pdf
m103-resume-cours-theorique-6156f136c407b.pdf
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 
Part1
Part1Part1
Part1
 
Csharp2 : classes et objets
Csharp2 : classes et objetsCsharp2 : classes et objets
Csharp2 : classes et objets
 
Architecture des types de contenu : ce qui a changé en Drupal 7
Architecture des types de contenu : ce qui a changé en Drupal 7Architecture des types de contenu : ce qui a changé en Drupal 7
Architecture des types de contenu : ce qui a changé en Drupal 7
 
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdfTutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
 
4sci ap(2)
4sci ap(2)4sci ap(2)
4sci ap(2)
 
Chap 03 poo en java partie1
Chap 03 poo en java partie1Chap 03 poo en java partie1
Chap 03 poo en java partie1
 

Plus de HassanAbdel

model présentation de mémoire et soutenance
model présentation de mémoire et soutenancemodel présentation de mémoire et soutenance
model présentation de mémoire et soutenanceHassanAbdel
 
ilovepdf_merged (7).pptx
ilovepdf_merged (7).pptxilovepdf_merged (7).pptx
ilovepdf_merged (7).pptxHassanAbdel
 
GESTION FINANCIER
GESTION FINANCIER GESTION FINANCIER
GESTION FINANCIER HassanAbdel
 
Java-3eme partie.pptx
Java-3eme partie.pptxJava-3eme partie.pptx
Java-3eme partie.pptxHassanAbdel
 
Assises théoriques de la régionalisation avancée (1)-1.pptx
Assises théoriques de la régionalisation avancée (1)-1.pptxAssises théoriques de la régionalisation avancée (1)-1.pptx
Assises théoriques de la régionalisation avancée (1)-1.pptxHassanAbdel
 
1. Budget des CT S5 -Par I.ppt
1. Budget des CT S5 -Par I.ppt1. Budget des CT S5 -Par I.ppt
1. Budget des CT S5 -Par I.pptHassanAbdel
 

Plus de HassanAbdel (8)

model présentation de mémoire et soutenance
model présentation de mémoire et soutenancemodel présentation de mémoire et soutenance
model présentation de mémoire et soutenance
 
Page de garde
Page de garde Page de garde
Page de garde
 
ilovepdf_merged (7).pptx
ilovepdf_merged (7).pptxilovepdf_merged (7).pptx
ilovepdf_merged (7).pptx
 
GESTION FINANCIER
GESTION FINANCIER GESTION FINANCIER
GESTION FINANCIER
 
manytomany.pptx
manytomany.pptxmanytomany.pptx
manytomany.pptx
 
Java-3eme partie.pptx
Java-3eme partie.pptxJava-3eme partie.pptx
Java-3eme partie.pptx
 
Assises théoriques de la régionalisation avancée (1)-1.pptx
Assises théoriques de la régionalisation avancée (1)-1.pptxAssises théoriques de la régionalisation avancée (1)-1.pptx
Assises théoriques de la régionalisation avancée (1)-1.pptx
 
1. Budget des CT S5 -Par I.ppt
1. Budget des CT S5 -Par I.ppt1. Budget des CT S5 -Par I.ppt
1. Budget des CT S5 -Par I.ppt
 

Java-2eme partie.pptx

  • 1. Classes et objets Pr. Abdelalim SADIQ CHAPITREII
  • 2. Programmation Structurée VS POO • Objectifs de la POO • Facilité la réutilisation de code, encapsulation et abstraction • Facilité de l’évolution du code • Améliorer la conception et la maintenance des grands systèmes • Programmation par « composants ». • Conception d’un logiciel à la manière de la fabrication d’une voiture • Programmation Structurée • Unité logique : le module • Une zone pour les variables • Une zone pour les fonctions • Chaque fonction résout une partie du problème • Structuration « descendante » du programme Classeset Objets CHAPITREII Pr. A.SADIQ 2
  • 3. Pr. A.SADIQ Programmation Procédurale (PP) • Principe: Repose sur l’équation suivante : Programme = Structures de données + Algorithmes • Dans la PP, la conception d’un programme est conduite par traitements : • Consiste à décomposer le programme en fonctions (modules) simples. 3 Classeset Objets CHAPITREII
  • 4. Pr. A.SADIQ Programmation Orientée Objet (POO) • Basée sur les données : • Déterminer les données à traiter. • Réaliser les fonctions qui permettent de les manipuler. 4 Classeset Objets CHAPITREII
  • 5. Pr. A.SADIQ Programmation Orientée Objet (POO) OBJET = Données + Méthodes. • Un objet est une association de données et de fonctions (méthodes) qui agissent sur ces données. • POO: Programmation dans laquelle un programme est organisé comme un ensemble d'objets coopérant ensemble. 5 Classeset Objets CHAPITREII
  • 6. Pr. A.SADIQ Principe POO • Programmation par Objet: • Unité logique : Objet • Objet défini par : • Un état • Un comportement • Une identité • État : représenté par des attributs(variable) qui stockent des valeurs. • Comportement : défini par des méthodes qui modifient un état. • Identité : permet de distinguer un objet d’un autre objet. 6 Classeset Objets CHAPITREII Personne Variable: Age=32 Methode: getAge() Identité État Comportement
  • 7. Pr. A.SADIQ Les Concepts de base de la POO… • Les objets communiquent entre eux par des envoies de messages. • Un objet peut recevoir un message qui déclenche • une méthode qui modifie son état et/ou • une méthode qui envoie un message à un autre objet 7 Classeset Objets CHAPITREII
  • 8. Classe Voiture -modèle, couleur Classe Personne -nom, prénom, statut Classe Lecteur -nom, prénom Pr. A.SADIQ Principe POO: Notion de classe • Des objets similaires peuvent être informatiquement décrits par une même abstraction : une classe • même structure de données et méthodes de traitement • valeurs différentes pour chaque objet 8 Classeset Objets CHAPITREII
  • 9. Pr. A.SADIQ Les Concepts de base de la POO… • Les classes servent de « moules » pour la création des objets. • Un objet est une instance (exemplaire) d’une classe. • Un programme OO est constitué de classes qui permettent de créer des objets qui s’envoient des messages. 9 Classeset Objets CHAPITREII
  • 10. Pr. A.SADIQ Les Concepts de base de la POO… • Classe : • généralisation de la notion de type. • décrit les caractéristiques générales d’un ensemble (famille) d’objets similaires : • Les objets similaires sont des instances (exemplaires) de la même classe. • Une classe possède des membres : • Attributs : les éléments données de la classe • Méthodes : fonctions qui donne accès ou modifie les attributs. • Exemple : 10 Classeset Objets CHAPITREII
  • 11. Attributs Méthodes Classe: CompteBancaire Proprietaire; Solde;; credite(val) getSolde() Pr. A.SADIQ Contenu d’une classe • Une classe est composée de plusieurs membres dont chacun est soit : • un attribut : variable typée • une méthode (ou opération) : ensemble d'instructions de traitement 11 Classeset Objets CHAPITREII
  • 12. Encapsulation L'encapsulation est la pratique consistant à regrouper des attributs au sein d'une même classe. (pas d’attributs sans classe) • Exemple : la classe CompteBancaire encapsule les attributs propriétaire et solde • Pour améliorer la lisibilité des programmes, les attributs encapsulés sont souvent privés (inaccessibles aux autres classes). • Les données et méthodes accessibles sont dites publiques 12 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 13. Pr. A.SADIQ Les Concepts de base de la POO… • Accès aux attributs d'un objet : Syntaxe : NomObjet.Attribut Exemple : P est un objet de la classe Etudiant qui a un attribut Matricule de type entier P.Matricule = 234; // affecter la valeur 234 au matricule de l’étudiant P • Accès aux méthodes d'un objet : Syntaxe : NomObjet.Méthode(arguments) Exemple : C est un objet de la classe Compte qui a une méthode Verser qui verse un montant dans le compte : C.Verser (4000); // verser 4000 dans le compte C 13 Classeset Objets CHAPITREII
  • 14. Pr. A.SADIQ Les Concepts de base de la POO… • Stratégie de développement OO : 1. Identifier les objets et leurs attributs Exemple : CompteBancaire 2. Identifier les opérations (Exemple: Verser, Retirer, …). 3. Établir la visibilité. Par exemple, pour un objet CompteBancaire on pourra avoir accès à toutes les actions (Verser, Retirer, …) mais ne pourra pas voir l'accès directement au solde pour le modifier. 4. Établir l’interface : description de chaque opération avec ses arguments (Exemple : boolean Verser( float M) ) 5. Implanter chaque objet. 14 Classeset Objets CHAPITREII
  • 15. Conventions d’écriture • Toute méthode, attribut et variable d’instance commence par une minuscule. • Exemple: compteBancaire, calculDistance(), premierPoint. • Tout changement de mot descriptif se fait via une majuscule. • Exemple : compteurFilms, calculSurfaceDuRectangle. • Les constantes décrites par le mot clé final : lettres majuscules avec under-scores. • Exemple : VALEUR_TVA, NOMBRE_PI. • Tout nom de classe ou d’interface commence par une majuscule. Tout changement de mot descriptif se fait via une majuscule. • Exemple : Point, CompteBancaire, FormeGeometrique. 15 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 16. Déclaration d’une classe en java • La définition d’une classe correspond à la définition d’un nouveau type • Exemple: 16 Classeset Objets CHAPITREII Point + abscisse: int - ordonnee: int + distance(p:Point):double public class Point{ public int abscisse; private int ordonnee; /* On peut aussi utiliser cette syntaxe: public int abscisse, ordonnee;*/ public double distance(Point p){…} } En UML: En java: Pr. A.SADIQ
  • 17. Création des objets: instanciation • Se fait pour initialiser un objet • Provoque la création réelle de l’objet en mémoire • Par l’initialisation de ses variables internes propres (attributs) • Chaque objet crée, possédera donc ses propres valeurs d’attributs, distinctes des valeurs d’attributs d’un autre objet • Se fait par l’emploi du mot clé new • L’instruction suivante: • Définit une variable d’instance p1 de type Point par le constructeur Point(). • Constructeur ?????? 17 Classeset Objets CHAPITREII Point p1 = new Point(); Pr. A.SADIQ
  • 18. Constructeurs d’objets • Les constructeurs sont des méthodes particulières qui permettent de fabriquer (créer) les objets. • En effectuant certaines initialisations nécessaires pour le nouvel objet créé. • Le constructeur porte le même nom que la classe à laquelle il appartient, • On peut définir autant de constructeurs qu’on souhaite, • Le constructeur par défaut ne possède pas d’arguments, • Les autres constructeurs peuvent comporter de 1 à n arguments (Surcharge). • Toute classe Java possède au moins un constructeur • Si une classe ne définit pas explicitement de constructeur, un constructeur par défaut, sans arguments et qui n’effectue aucune initialisation particulière, est invoqué. 18 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 19. Constructeurs d’objets - Exemple • Utilisation: 19 Classeset Objets CHAPITREII public class Point{ // Attributs public int abscisse; public int ordonnee; // Constructeurs public Point(){ abscisse=0; ordonnee=0; } public Point(int x, int y){ abscisse=x; ordonnee=y; } } Point p1 = new Point(); Point p2 = new Point(3,4); p1 abscisse=0 ordonnee=0 p2 abscisse =3 ordonnee =4 Constructeur par défaut Constructeur avec arguments Pr. A.SADIQ
  • 20. Constructeurs d’objets - Référence d’objet 20 Classeset Objets CHAPITREII Assignation d’un type de référence ox0123abcd p1 0 0 abscisse ordonnee oxcafebabe 3 4 p2 abscisse ordonnee oxcafebabe p 12 Il n’y a désormais plus de référence vers l’ancien Point « p1 », il sera donc détruit par le Garbage Collector public class Point{ public int abscisse; public int ordonnee; } //Utilisation Point p1 = new Point(); Point p2 = new Point(3,4); Point p=p2; p.abscisse=12; p1=p; Pr. A.SADIQ
  • 21. Destructeurs d’objets • Un destructeur est une méthode spéciale qui permet de libérer la mémoire occupée par un objet avant de le détruire. • En java, cette fonction est prise en charge par le garbage collector • Automatiquement • Si plus aucune variable ne référence l’objet • Si le bloc dans lequel il est défini se termine • Si l’objet a été affecté à null. (p1 = null) • Manuellement : • Sur demande explicite par l’instruction System.gc() • Un pseudo-destructeur protected void finalize() peut être défini explicitement par le programmeur • Il est appelé juste avant la libération de la mémoire par la machine virtuelle, mais on ne sait pas quand. 21 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 22. Destructeurs d’objets - Exemple 22 Classeset Objets CHAPITREII public class Point{ public int abscisse,ordonnee; public Point(int x, int y){ abscisse=x; ordonnee=y; } protected void finalize(){ System.out.println("objet détruit"); } public static void main(String[] args) { Point p1=new Point(4,3); Point p2=new Point(23,32); p1=p2; System.out.println(p1.abscisse); System.out.println(p2.abscisse); System.gc(); } } Méthode appelée avant la destruction de l’objet Demande de lancement du garbage collector (gc) Pr. A.SADIQ
  • 23. Modificateurs d’accès - Encapsulation • Possibilité d’accéder aux attributs d’une classe Java, n’est pas recommandée car on ne respecte pas le principe de l’encapsulation. • Les données (attributs) doivent être protégées et accessibles pour l’extérieur par des sélecteurs. • Plusieurs niveaux de visibilité peuvent être définis en précédant d’un modificateur la déclaration d’un attribut, méthode ou constructeur. • private • public • Protected (A revoir dans le chapitre suivant) 23 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 24. Visibilité des membres d’une classe- Encapsulation 24 Classeset Objets CHAPITREII + public - private classe La classe peut être utilisée par n’importe quelle classe Utilisable uniquement par les classes définies à l’intérieur d’une autre classe. Une classe privée n’est utilisable que par sa classe englobante attribut Attribut accessible partout où sa classe est accessible. N’est pas recommandé du point de vue encapsulation Attribut restreint à la classe où est faite la déclaration méthode Méthode accessible partout où sa classe est accessible. Méthode accessible à l’intérieur de la définition de la classe Pr. A.SADIQ
  • 25. Visibilité des membres d’une classe- Accès • Dans une classe toute référence à un attribut défini dans la classe elle-même se fait simplement en le nommant. • En revanche, l’accès aux attributs depuis ces clients (d’autres objets) se fait par la notation pointée: p.a où p désigne l’objet et a le nom de l’attribut. • Par défaut, les attributs d’une classe sont privés et ne sont pas directement accessibles par d’autres objets. • Comment accéder aux attributs privés d’un objet à partir d’un autre? 25 Classeset Objets CHAPITREII public class Point{ public int abscisse; private int ordonnee; } public class Droite{ …………… int a,b; Point p1=new Point(); a = p1.abscisse; //OK b = p1.ordonnee; //Faux } Pr. A.SADIQ
  • 26. Méthodes d’accès aux attributs (getters et setters) • Les méthodes d’accès aux attributs sont des opérations que l’on peut effectuer sur les attributs d’une classe. On distingue deux types de méthodes: • Les accesseurs: • qui ne modifient pas l’état et se contente de retourner la valeur d’un champ, • Par coutume, les accesseurs commencent par get, • On les appelle aussi les getters, • Exemple: getAbscisse(), getOrdonnee(). • Les modificateurs: • qui modifient l’état en effectuant un calcul spécifique, • Par coutume, les modificateurs commencent par set, • On les appelle aussi les setters, • Exemple: setAbscisse(int x),setOrdonnee(int y). 26 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 27. Exemple de getters et de setters – class Point 27 Classeset Objets CHAPITREII public class Point{ private int abscisse; private int ordonnee; //Constructeurs public Point(){ abscisse=0; ordonnee=0; } public Point(int x, int y){ abscisse=x; ordonnee=y; } public int getAbscisse() { return abscisse; } public void setAbscisse(int x) { abscisse = x; } //----------------------------------- public int getOrdonnee() { return ordonnee; } public void setOrdonnee(int y) { ordonnee = y; } public void setPoint(int x, int y) { abscisse = x; ordonnee = y; } } Pr. A.SADIQ
  • 28. Exécuter une application – class Application (main) • Une application peut être vue comme une conversation entre objets. • L’initiatrice de cette conversation est habituellement une classe qui possède dans sa définition une méthode appelée main. • C’est préférable, dans une application java, de définir la méthode main dans une autre class à part, que dans l’une des classes constituant l’application. 28 Classeset Objets CHAPITREII public class Application{ public static void main(String [] args){ …………………………… …………………………… } } Pr. A.SADIQ
  • 29. Exemple d’application – Tester la classe Point 29 Classeset Objets CHAPITREII public class Application{ public static void main(String[] args){ Point p1= new Point(); Point p2= new Point(2,3); System.out.println("1) P1: x=" + p1.getAbscisse() + " y="+p1.getOrdonnee()); System.out.println("2) P2: x=" + p2.getAbscisse() + " y="+p2.getOrdonnee()); p1.setPoint(12, 43); System.out.println("3) P1: x=" + p1.getAbscisse() + " y="+p1.getOrdonnee()); p2.setAbscisse(20); System.out.println("4) P2: x=" + p2.getAbscisse() + " y="+p2.getOrdonnee()); p1=p2; System.out.println("1) P1: x=" + p1.getAbscisse() + " y="+p1.getOrdonnee()); System.out.println("2) P2: x=" + p2.getAbscisse() + " y="+p2.getOrdonnee()); }} Pr. A.SADIQ
  • 30. Champs constants • Quelle erreur a été commise dans cette définition de classe ? Classeset Objets CHAPITREII public class ChCt{ public ChCt (float r){ x = r ; } ..... private final float x ; private final int n = 10 ; private final int p ; } • Le champ p déclaré final doit être initialisé au plus tard par le constructeur, ce qui n’est pas le cas. • En revanche, les autres champs déclarés final sont correctement initialisés: • n de façon explicite • et x par le constructeur. Pr. A.SADIQ 30
  • 31. Le mot clé this • Les méthodes setAbscisse, setOrdonnee et setPoint utilisent des paramètres qui portent un autre nom pour éviter la confusion avec les variables d’instances. • Il est possible de les appeler également abscisse et ordonnee • La distinction est faite en utilisant la référence this • this.x désigne la variable d’instance de l’objet courant (this) 31 Classeset Objets CHAPITREII public void setAbscisse(int abscisse) { this.abscisse = abscisse; } public void setOrdonnee(int ordonnee) { this.ordonnee = y; } public void setPoint(int abscisse, int ordonnee) { this.abscisse = abscisse; this.ordonnee = ordonnee; } Pr. A.SADIQ
  • 32. Le méthode toString() • La classe Object possède une methode toString() qui permet d’afficher n’importe quel objet sous forme d’une chaine de caractères. • Exemple: Dans la classe Point on redéfini la méthode toString comme suit: • Utilisation: • Sortie: 32 Classeset Objets CHAPITREII public String toString() { return "(" + abscisse + "," + ordonnee + ")"; } Point p1=new Point(3,4); System.out.println(“La coordonnée du point est:” + p1); La coordonnée du point est: (3,4) Pr. A.SADIQ
  • 33. Exercices 1. Pour la classe Point, déjà crée, ajouter une méthode qui permet à un objet Point de calculer sa distance avec un autre objet Point. 2. Créer une classe Droite, caractérisée par sa pente (coefficient directeur) et son ordonnée à l’origine: • Déclarer la classe • Déclarer les attributs comme privés • Définir les setters et les getters correspondants • Ajouter une méthode qui permet de vérifier si un point appartient à cette droite ou non. 33 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 34. Surcharge de méthodes • La surcharge (overloading) n’est pas limitée aux constructeurs, elle est possible également pour n’importe quelle méthode. • Possibilité de définir des méthodes possédant le même nom mais dont les arguments sont différents. • Quand une méthode surchargée est invoquée, le compilateur sélectionne automatiquement la méthode dont le nombre et le type des arguments correspondent au nombre et au type des paramètres passés dans l’appel de la méthode. • Des méthodes surchargées peuvent avoir des types de retour différents à condition qu’elles aient des arguments différents. 34 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 35. Surcharge de méthodes – Exemple1 35 Classeset Objets CHAPITREII class Additionneur { public int somme(int a, int b){ // 1 return (a+b); } public int somme(int a, int b, int c){ // 2 return (a+b+c); } public float somme(float a, float b){ // 3 return (a+b); } public float somme(int a, int b){ //4 interdit à cause de 1 return ((float)a+(float)b); } } class App { public static void main(String[] args){ Additionneur ad = new Additionneur(); int a=4; int b=10; float c=15.4f; float d=3.5f; int s1= ad.somme(a,b); // 1 int s2=ad.somme(a,b,a);// 2 float s3=ad.somme(c,d);// 3 }} Pr. A.SADIQ
  • 36. Surcharge de méthodes – Exemple2 36 Classeset Objets CHAPITREII public class Point{ private int abscisse; private int ordonnee; ………………………………………. public double distanceJusque(Point p){ int difX=abscisse - p.abscisse; int difY=ordonnee - p.ordonnee; return Math.sqrt(difX*difX + difY*difY); } public double distanceJusque(double x, double y){ double difX=abscisse - x; double difY=ordonnee - y; return Math.sqrt(difX*difX + difY*difY); } } public class Application2 { public static void main(String[] args) { double distance1, distance2; Point p1= new Point(2,3); Point p2= new Point(5,10); distance1 = p1.distanceJusque(p2); distance2 = p1.distanceJusque(5.5,10.2); System.out.println("La distance 1 = " + distance1); System.out.println("La distance 2 = " + distance2); } } Pr. A.SADIQ
  • 37. Les variables de classe (variables statiques)(1/3) • Exemple 1: Une association de plusieurs personnes: • Chaque personne possède un nom • Toutes les personnes partagent un compte bancaire (cp) • Exemple 2: Une collection de films: • Chaque film doit avoir un titre et un numéro 37 Classeset Objets CHAPITREII p1 A 2500 p2 B 2500 p3 C 2500 Compte bancaire f1 fl1 1 f2 fl2 2 f3 fl3 3 3 3 3 compteur • Compteur contient le numéro du dernier film crée, • Compteur est un champ partagé par tous les objets Film •  compteur dépend de la classe et pas des objets Pr. A.SADIQ
  • 38. Les variables de classe (variables statiques) (2/3) • Il peut être utile de définir pour une classe des attributs indépendamment des instances : nombre de films crées, • Utilisation des Variables de classe comparables aux variables globales , • Variables dont il n’existe qu’un seul exemplaire associé à sa classe de définition, • Variables existent indépendamment du nombre d’instances de la classe qui ont été créés, • Variables communes à toutes les instances de votre classe, • Variables utilisables même si aucune instance de la classe n’existe. 38 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 39. Les variables de classe (variables statiques) (3/3) • Elles sont définies comme des attributs mais avec le mot-clé static • Pour y accéder, on utilise le nom de la classe (le nom d’une instance aussi mais déconseillé): • Exemple: 39 Classeset Objets CHAPITREII public static int numeroFilmCourant; Film.numeroFilmCourant++; public class Film { public static int numeroFilmCourant=0; public int numero; private String titre; public Film(String titre){ this.titre = titre; } public static void main(String[] args) { Film f1=new Film("Film 1"); f1.numero = ++Film.numeroFilmCourant; Film f2=new Film("Film 2"); f2.numero = ++Film.numeroFilmCourant; } } Pr. A.SADIQ
  • 40. Les constantes de classe (constantes statiques) • Ce sont des constantes liées à une classe • Elles sont écrites en MAJUSCULES • Elles sont définies (en plus) avec les mots clés final et static: • Pour y accéder, on utilise le nom de la classe: 40 Classeset Objets CHAPITREII public static final float NOMBRE_PI = 3.1416F; public static final double VALEUR_TVA = 0.2; Cercle c1 = new Cercle(5); float surface = Math.pow(c1.r,2) * Cercle.NOMBRE_PI; Pr. A.SADIQ
  • 41. Les méthodes de classe (méthodes statiques) • Les méthodes de classe sont associées directement à une classe, • Ce sont des méthodes qui ne s'intéressent pas à un objet particulier, • Utiles pour des calculs intermédiaires internes à une classe, • Modifient les variables de classes, • Elles sont définies comme les méthodes d'instances, mais avec le mot clé static: 41 Classeset Objets CHAPITREII public static int getNumFilmCourant(){ return numeroFilmCourant; } int num = Film.getNumFilmCourant(); Pr. A.SADIQ
  • 42. Les variables et méthodes de classe (Exercice1) • Quelles erreurs ont été commises dans la définition de classe suivante et dans son utilisation ? 42 Classeset Objets CHAPITREII class A{ static int f (int n){ q = n ; } void g (int n){ q = n ; p = n ; } static private final int p = 20 ; private int q ; } public class EssaiA{ public static void main (String args[]){ A a = new A() ; int n = 5 ; a.g(n) ; a.f(n) ; f(n) ; } } • La méthode statique f de A ne peut pas agir sur un champ non statique. • l’affectation p=n est incorrecte car p est final. • Il est préférable d’écrire A.f(n) au lieu de a.f(n). • L’appel f(n) est incorrect puisqu’il n’existe pas de méthode f dans la classe EssaiA. Pr. A.SADIQ
  • 43. Les variables et méthodes de classe (Exercice2) • Réaliser une classe qui permet d’attribuer un numéro unique à chaque nouvel objet créé (1 au premier, 2 au suivant...). • On ne cherchera pas à réutiliser les numéros d’objets éventuellement détruits. • On dotera la classe uniquement d’un constructeur, d’une méthode getNumero fournissant le numéro attribué à l’objet et d’une méthode getNumCourant fournissant le numéro du dernier objet créé. • Écrire un petit programme d’essai qui donnera les résultats suivants: • numéro de a : 1 • numéro de b : 2 • dernier numéro 2 • dernier numéro 3 43 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 44. Passage des paramètres • Deux principales manières de passer des paramètres en programmation: 1. Passage par valeur: • Fournit une copie de la valeur du paramètre, • La valeur effective du paramètre ne sera pas modifiée. 2. Passage par référence: • Fourni l’emplacement de la variable concernée, • La valeur de la variable sera modifiée. • En java, contrairement à Pascal et C++, la passage par valeur est le seul existant. 44 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 45. Passage des paramètres - Exemple 45 Classeset Objets CHAPITREII public class ParValeur { public static void auCaree(int x){ System.out.println("Début da la méthode: x= " + x); x= x*x; System.out.println("Fin da la méthode: x= " + x); } public static void main(String[] args) { int x= 10; auCaree(x); System.out.println("Après la sortie da la méthode: x= " + x); } } Début da la méthode: x= 10 Fin da la méthode: x= 100 Après la sortie da la méthode: x= 10 Pr. A.SADIQ
  • 46. Passage des paramètres - Exercice 46 Classeset Objets CHAPITREII public class A { public A (int nn){ n = nn ; } public int getN (){ return n ; } public void setN (int nn){ n = nn ; } private int n ; } public class Util { public static void incre (A a, int p){ a.setN (a.getN()+p); } public static void incre (int n, int p){ n += p ; System.out.println ("valeur de n (méthode): " + n) ; }} public class Trans { public static void main (String args[]){ A a = new A(2) ; int n = 3 ; System.out.println ("valeur de a avant : " + a.getn()) ; Util.incre (a, 5) ; System.out.println ("valeur de a après : " + a.getn()) ; System.out.println ("valeur de n avant : " + n) ; Util.incre (n, 5) ; System.out.println ("valeur de n apprès : " + n) ; } } valeur de a avant : 2 valeur de a après : 7 valeur de n avant : 3 valeur de n (méthode): 8 valeur de n après : 3 Pr. A.SADIQ
  • 47. Les collections - Définitions • C'est l'organisation efficace d'un ensemble de données, sous la forme de tableaux, de listes, de piles etc. • Une collection gère un groupe d'un ensemble d'objets d'un type donné ; ou bien c'est un objet qui sert à stocker d'autres objets. • En java on a aussi les maps qui regroupent des données composées de paires contenant une clé et une valeur associée à cette clé. (clé , valeur) 47 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 48. Les collections - Types • Set: est un ensemble ne contenant que des valeurs et ces valeurs ne sont pas dupliquées. On y trouve les objets HashSet, TreeSet, LinkedHashSet… • Par exemple l'ensemble A = {2,1,8,4}. • SortedSet est un Set trié. • Par exemple l'ensemble A = {1,2,4,8}. • List: Autorise la duplication. On y trouve les objets Vector, LinkedList et ArrayList • Par exemple l'ensemble A = {1,2,2,1,4,9,2}. 48 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 49. Problèmes des tableaux en java • Un programme a souvent besoin de pouvoir gérer une suite d’éléments: • La liste des notes d’un étudiants, la liste des points formant un polygone, etc. • 1ère solution: Les tableaux • la taille d’un tableau ne peut plus varier une fois qu’il a été créé. • Pour ajouter une nouvelle note par exemple: • créer un nouveau tableau, plus grand ; • copier l’ancien tableau dans le nouveau ; • ajouter le nouvel élément ; • faire pointer la variable d’origine vers le nouveau tableau. • 2ème solution: Utilisation des collections, la plus simple est la classe ArrayList. 49 Classeset Objets CHAPITREII • Plusieurs lignes de code; • Gaspillage de la mémoire, • Risque des bogues, • Etc. Pr. A.SADIQ
  • 50. La classe ArrayList (tableau dynamique) • La classe ArrayList permet de construire des tableaux de taille variable. • Déclaration: • Note: Classes enveloppes: • Numérique: Byte, Short, Integer , Long, Float et enfin Double, • Caractère: Character, • Booléen: Boolean, • Sans type: Void. • Pour créer un objet ArrayList: • Pour pouvoir utiliser la classe ArrayList: 50 Classeset Objets CHAPITREII ArrayList<String> maListe; //Une liste de chaines de caractères ArrayList<Double> maListe; //Une liste des réels ArrayList<Integer> maListe; //Une liste des entiers Etc.. import java.util.ArrayList; maListe= new ArrayList<String>(); Pr. A.SADIQ
  • 51. ArrayList– Méthodes de traitement • int size() : fonction qui renvoie la longueur d’une ArrayList; • boolean isEmpty() : renvoie vrai si l'objet est vide ; • Type get(int i) : retourne l'élément à l'indice i ; • add(Type element) : permet d'ajouter un élément à la fin de la liste; • add(int i, Type element) : ajoute la valeur element à la position i. • remove(int i) : efface l’élément à l'indice i ; • remove(Type element) : supprime la première occurrence de element; • set(int i, Type element) : remplace l’ancienne valeur qui était dans la case i par element. • boolean contains(Object element) : retourne vrai si element est dans l'ArrayList. • int indexOf(Type element) : renvoie la position de element dans la liste, et -1 sinon; • clear() : vide la liste. 51 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 52. ArrayList – Parcourir les éléments avec foreach • La boucle foreach est une boucle for avancée, qui permet de parcourir les éléments d’un tableau ou d’une collection, un par un dans l'ordre. • Syntaxe de foreach: • Exemple: • Equivalent à: 52 Classeset Objets CHAPITREII for(type variable : tableau | collection){ …… } for(String s : listString) { System.out.println(s); } for(int i=0;i<listString.size();i++) { System.out.println(listString.get(i)); } Pr. A.SADIQ
  • 53. ArrayList - Exemple 53 Classeset Objets CHAPITREII import java.util.ArrayList; public class MyArrayList3 { public static void main(String[] args) { //créer un arraylist ArrayList<String> str = new ArrayList<String>(); //Ajout str.add("o1"); str.add("o2"); str.add("o3"); str.add("o4"); //Quelques méthodes qu'on a vu System.out.println("indice de o2: "+str.indexOf("o2")); System.out.println("o3 existe ? " +str.contains("o3")); System.out.println("o2 supprimé avec succès: "+str.remove("o2")); System.out.println("taille: "+str.size()); //On peut ajouter d'autres éléments str.add("o5"); str.add("o6"); //parcours avec foreach for(String s : str) System.out.println(s); //Ou bien avec for simple for(int i=0;i<str.size();i++) System.out.println(str.get(i)); //Effacer toute la liste str.clear(); System.out.println("liste est vide ? " +str.isEmpty()); }} Pr. A.SADIQ
  • 54. Les chaines de caractères en java • Un String est une suite ou une séquence de caractères. • Dans beaucoup de langages un String n'est autre qu'un tableau de caractères, alors qu'en Java un String est un objet. • Java propose 3 classes apparentées aux chaînes de caractères : • La classe String (chaîne de caractères non modifiables) • La classe StringBuffer (chaîne de caractères modifiables à volonté) • La classe StringTokenizer (séparation d'une chaîne en plusieurs entités) • Dans ce cours, nous allons nous intéresser à la classe String. 54 Classeset Objets CHAPITREII Pr. A.SADIQ
  • 55. La classe String • String n’est pas un type primitif, c’est une classe • Déclaration et initialisation : • Cette classe dispose de 11 constructeurs càd 11 façons de créer une chaine de caractères. 55 Classeset Objets CHAPITREII String s1, s2; s1 = "Hello"; s2 = "le monde"; String s3 = "Hello"; char[] tab = {’b’,’o’,’n’,’j’,’o’,’u’,’r’}; String s = new String(tab); ……… Pr. A.SADIQ
  • 56. Différences entre objets et types de base 56 Classeset Objets CHAPITREII int x=3, y=3; x == y est vrai String s1="abc", s2="abc"; s1 == s2 est faux... Mémoire 3 3 0x768 abc 0x852 abc Quand on compare 2 variables d’un type de base on compare leur valeur. Quand on compare 2 objets avec les opérateurs on compare leur références (leur adresses en mémoire). Introduction de la méthode equals() pour les objets : s1.equals(s2) est vrai Pr. A.SADIQ
  • 57. La classe String – Exemple (Résultat d’un programme) 57 Classeset Objets CHAPITREII String ch1 = new String(); System.out.println ("A - ch1 =:" + ch1 + ":") ; String ch2 = "hello" ; System.out.println ("B - ch2 =:" + ch2 + ":") ; String ch3 = new String ("bonjour") ; System.out.println ("C - ch3 =:" + ch3 + ":") ; String ch4 = new String (ch3) ; System.out.println ("D - ch4 =:" + ch4 + ":") ; ch3 = "bonsoir" ; System.out.println ("E - ch4 =:" + ch4 + ": ch3 =:" + ch3 + ":") ; ch4 = ch3 ; ch3 = "au revoir" ; System.out.println ("F - ch4 =:" + ch4 + ": ch3 =:" + ch3 + ":") ; A - ch1 =:: B - ch2 =:hello: C - ch3 =:bonjour: D - ch4 =:bonjour: E - ch4 =:bonjour: ch3 =:bonsoir: F - ch4 =:bonsoir: ch3 =:au revoir: Pr. A.SADIQ
  • 58. La classe String – quelques méthodes 58 Classeset Objets CHAPITREII String str1 = "bonjour"; int n = str1.length(); // n vaut 7 if (str1 == str2) ... if (str1.equals(str2)) ... str1.compareTo(str2); String s3 = s1.concat(s2); String mot = message + " et " + "puis s'en vont"; String msg = "Attention!"; msg = "nouveau texte"; public String substring(int debut, int fin); public String substring(int debut); Pr. A.SADIQ
  • 59. Méthodes de la classe String 59 Classeset Objets CHAPITREII Méthodes la classe String Rôle charAt(int) renvoie le nième caractère de la chaine compareTo(String) compare la chaîne avec l'argument concat(String) ajoute l'argument à la chaîne et renvoie la nouvelle chaîne endsWith(String) vérifie si la chaîne se termine par l'argument equalsIgnoreCase(String) compare la chaîne sans tenir compte de la casse indexOf(String) renvoie la position de début à laquelle l'argument est contenu dans la chaine lastIndexOf(String) renvoie la dernière position à laquelle l'argument est contenu dans la chaine lenght() renvoie la longueur de la chaine replace(char,char) renvoie la chaîne dont les occurrences d'un caractère sont remplacées startsWith(String int) Vérifie si la chaîne commence par la sous chaîne substring(int,int) renvoie une partie de la chaine toLowCase() renvoie la chaîne en minuscule toUpperCase() renvoie la chaîne en majuscule trim() enlève les caractères non significatifs de la chaine Pr. A.SADIQ
  • 60. Classe String - Exercice 60 Classeset Objets CHAPITREII • Ecrivez une classe TestChaine qui crée une chaîne de caractères et qui: • Affiche les 3 premiers caractères, les 3 derniers, la chaine en majuscules puis en minuscule. • Ajoutez une méthode isJavaSource qui test si un nom de fichier se termine par ".java" Pr. A.SADIQ
  • 62. Introduction • Il existe 3 types fondamentaux de relations entre classes: • La généralisation / Spécialisation (Héritage): • Elle indique qu’une classe peut être assimilée à une autre classe qui correspond à une notion plus abstraite ou générale. • Ce type désigne une relation "EST UN". • Exemple: Un rectangle est une forme, un chien est un animal, etc. • L’ensemble / composant (Agrégation et composition): • Cette relation permet de créer une relation de dépendance d’une classe envers une autre. • Ce type désigne une relation "A UN". • Exemple: Un rectangle a plusieurs cotés, Une voiture a des roues, etc. • L’association : • Traduisant une dépendance sémantique entre des classes qui ne sont pas reliées autrement. • Exemple: Un client reçoit une facture, un client envoie une commande, etc. 62 Héritageet polymorphisme CHAPITREIII Pr. A.SADIQ
  • 63. Héritage - Définition • L’héritage est un mécanisme permettant de factoriser les attributs et les méthodes communs à plusieurs classes dans une classe principale : on parle de généralisation. • Les classes dérivées deviennent des sous-classes : on parle de spécialisation. • Exemple: 63 Héritageet polymorphisme CHAPITREIII Forme Rectangle Triangle Carre Généralisation Spécialisation Pr. A.SADIQ
  • 64. Héritage - Intérêts • L’héritage permet la réutilisation du code. • Lorsque l’on va instancier une classe spécialisée, le code des attributs et des méthodes de la classe héritée ne seront pas implémentés à nouveau. • L’héritage permet l’organisation hiérarchique des classes. • C’est à dire qu’il rend plus aisé l’exploration et la maintenance d’une bibliothèque de classes pour une équipe de développement. 64 Héritageet polymorphisme CHAPITREIII Pr. A.SADIQ
  • 65. Héritage - Principes • La relation d’héritage est unidirectionnelle • Si une classe B hérite d’une classe A: • B est une (sous-classe, classe fille ou classe dérivée) de A. • A est une (classe mère ou superclasse) de B. • Une sous-classe B est un cas particulier de A • La classe B hérite les attributs et les méthodes de la classe mère A. • En java, on dit que B étend A: • Possibilité d’ajouter des champs, • Possibilité d’ajouter des méthodes. 65 Héritageet polymorphisme CHAPITREIII Pr. A.SADIQ
  • 66. Héritage - Syntaxe • Pour exprimer l’héritage en java, on utilise le mot extends (étend). • Exemple: • Remarques: • Pas nécessaire de redéfinir les champs et les méthodes héritées, • Possibilité d’ajouter des champs et/ou des méthodes, • Possibilité de surcharger les méthodes héritées, • Possibilité de redéfinir les méthodes héritées. 66 Héritageet polymorphisme CHAPITREIII public class Rectangle extends Forme{…} public class Triangle extends Forme{…} public class Carre extends Rectangle{…} Pr. A.SADIQ
  • 67. Héritage – Classe Object • En java, toutes les classes sont dérivée de la classe Object. • La classe Object est la classe de base de toutes les autres. C'est la seule classe de Java qui ne possède pas de classe mère. • Tous les objets en Java, quelle que soit leur classe, sont du type Object. • Cela implique que tous les objets possèdent déjà à leur naissance un certain nombre d'attributs et de méthodes dérivées d'Object. • toString(), clone(), equals(…). • Dans la déclaration d'une classe, si la clause extends n'est pas présente, la classe immédiatement supérieure est donc Object. 67 Héritageet polymorphisme CHAPITREIII Pr. A.SADIQ
  • 68. • L’attribut cote est égal à largeur et longueur • Un carré est un rectangle tel que longueur = largeur. • Donc un objet Carre hérite la valeur de son cote depuis la classe mère Rectangle Héritage – Exemple (1/2) 68 Héritageet polymorphisme CHAPITREIII Rectangle - largeur: int - longueur: int <<Rectangle (int,int)>> +getLongueur():int +getLargeur():int +setLongueur(int):void +setLargeur(int):void +surface():int +affiche():void Carre - cote: int <<Carre (int)>> +getCote():int +setCote(int):void +surface():int +affiche():void public class Rectangle{ … public Rectangle(int a, int b){ longueur=a; largeur=b; } } public class Carree extends Rectangle{ … public Carree(int a){ // Utiliser le constructeur de la classe mère : super; } } public class Rectangle{ … public void affiche(){ System.out.println("rectangle : " + longueur + "x" + largeur); } } public class Carre extends Rectangle{ … public void affiche(){ //Redéfinir la fonction } } • Les deux methodes getCote() et setCote() sont les même que celles définies dans la classe mère. Aussi pour la méthode surface(). • Un objet Carre hérite ces méthodes. Pr. A.SADIQ
  • 69. Héritage – Exemple (2/2) 69 Héritageet polymorphisme CHAPITREIII public class Rectangle{ private int longueur,largeur; //Constructeur public Rectangle(int a,int b){ longueur = a; largeur = b;} //Setters et getters public void setLongueur(int l){…} public void setLargeur(int l){…} public int getLongueur(){…} public int getLargeur(){…} //Calculer la surface d’un rectangle public int surface(){ return longueur * largeur;} //Afficher les infos d’un rectangle public void affiche(){ System.out.println("rectangle: " + longueur + "x" + largeur);} } public class Carre extends Rectangle { //Constructeur public Carre(int cote){ super(cote,cote); } //Afficher les infos d’un carré public void affiche(){ System.out.println("carré: " + getLongueur() + "x" + getLargeur()); } }} Appel du constructeur de la classe mère On a redéfini la fonction affiche() Pr. A.SADIQ
  • 70. Héritage – Constructeur et le mot clé super • La classe fille doit prendre en charge la construction de la classe mère: • Pour construire un carré, il faut construire d’abord un rectangle (Un carré est un rectangle) • Le constructeur de la classe mère (Rectangle) est donc appelé avant le constructeur de la classe fille (Carre). • En effet, on doit utiliser le mot clé super. • Exemple: 70 Héritageet polymorphisme CHAPITREIII public class A{ private int i; //Constructeur public A(int a){ i = a; } } public class B extends A{ private double z; //Constructeur public B(int a,double z){ //Appel explicite super(a); this.z = z; }} Pr. A.SADIQ
  • 71. Héritage – Redéfinition (overriding) • On dit qu’une méthode d’une sous-classe redéfinit une méthode de sa classe supérieure, si elles ont la même signature mais que le traitement effectué est réécrit dans la sous-classe • Exemple: 71 Héritageet polymorphisme CHAPITREIII public class Carre extends Rectangle { //Constructeur public Carre(int cote){ super(cote,cote); } //Afficher les infos d’un carré public void affiche(){ System.out.println("carré: " + getLongueur() + "x" + getLargeur()); } }} Pr. A.SADIQ
  • 72. Héritage – Exemple 72 Héritageet polymorphisme CHAPITREIII class A{ public void affiche(){ System.out.println ("Je suis un A") ; } } class B extends A {…} class C extends A{ public void affiche(){ System.out.println ("Je suis un C") ; } } class D extends C{ public void affiche(){ System.out.println ("Je suis un D") ; } } class E extends B {…} class F extends C {…} class DiagHeri{ public static void main (String arg[]){ A a = new A() ; a.affiche() ; B b = new B() ; b.affiche() ; C c = new C() ; c.affiche() ; D d = new D() ; d.affiche() ; E e = new E() ; e.affiche() ; F f = new F() ; f.affiche() ; } } Je suis un A Je suis un A Je suis un C Je suis un D Je suis un A Je suis un C Pr. A.SADIQ
  • 73. Héritage – la portée protected 73 Héritageet polymorphisme CHAPITREIII Type Mot-clé Description Publique public Accessible depuis n’importe quel point de l’application Protégée protected Accessible uniquement depuis les classes du même package et les classes filles Package Accessible uniquement depuis les classes du même package Privée private Accessible uniquement dans la classe de déclaration et les classes internes Pr. A.SADIQ
  • 74. Héritage – Affectation d’objets (1/2) • Une classe enfant a son propre type mais partage également le même type que sa classe parente. • Par exemple, un triangle est une forme mais l’inverse n’est pas vrai, une forme n’est pas nécessairement un triangle. • Exemple: • 2 cas d’affectation d’objets: Upcasting et Downcasting. 74 Héritageet polymorphisme CHAPITREIII Point A1 = new Point(0,1); Point A2 = new Point(3,4); Forme forme = new Forme(A1,2,3); Triangle triangle = new Triangle(A1,A2,10,12); Pr. A.SADIQ
  • 75. Héritage – Affectation d’objets (2/2) • 1er cas : • Conversion implicite de: tout triangle est une forme. • Le compilateur fait une copie en ignorant les membres excédentaires (A2) • C’est l’upcasting (transtypage vers le haut ou implicite) 75 Héritageet polymorphisme CHAPITREIII forme = triangle; • 2ème cas : • Une forme n’est pas forcément un triangle. • Une forme n’a pas toute les données d’un triangle. (Point A2) • Solution: il faut caster (forcer le changement du type). • C’est le downcasting (transtypage vers le bas ou explicite) triangle = forme;//Erreur triangle = (Triangle) forme; Forme Triangle Upcasting Downcasting Pr. A.SADIQ
  • 76. Héritage – Le mot clé instanceof • Le mot clé instanceof permet de savoir à quelle classe appartient une instance. • Exemple 1: 76 Héritageet polymorphisme CHAPITREIII class B {…} class D extends B{…} class C{…} class test{ … main(…){ B b = new B(); D d = new D(); C c = new C(); b instanceof B; b instanceof D; d instanceof B; d instanceof D; b = d; b instanceof B; b instanceof D; c instanceof B; }} true false true true true true Erreur de compilation • Exemple 2: Forme f=new Triangle(…); if( f instanceof Triangle){ //true } if(f instanceof Rectangle){ //False } Pr. A.SADIQ
  • 77. Héritage – le mot clé final • Un attribut déclaré final est un attribut constant. • Une classe final est une classe qui ne peut pas avoir de filles. • Une classe final ne peut pas être étendue: le mécanisme d'héritage est bloqué. • Mais une classe final peut évidemment être la fille d'une autre classe (non final!). • Une méthode final est une méthode qui ne peut pas être redéfinie dans les sous-classes. • Intérêt 1 : cela permet d'interdire la redéfinition d'une méthode par le biais de l'héritage: • ex : final boolean checkPassword() • Intérêt 2 : cela permet de gagner du temps à la compilation: • Une variable ou un attribut déclarés final sont constants => le compilateur interdit de les modifier 77 Héritageet polymorphisme CHAPITREIII Pr. A.SADIQ
  • 78. Héritage – Exercice de synthèse 78 Héritageet polymorphisme CHAPITREIII Forme - p1 : Point - largeur: int - longueur: int <<Forme(Point,int,int)>> +//getters +//setters +surface():int +perimetre():int +affiche():void Rectangle <<Rectangle(Point,int,int)>> +affiche():void Triangle - p2 : Point <<Triangle(Point,Point,int,int)>> +//getter et setter pour p2 +perimetre():int +affiche():void Carre <<Carre(Point,int,int)>> +affiche():void Pr. A.SADIQ
  • 79. Polymorphisme – Définition • Le polymorphisme permet de donner le même nom à des traitements différents. • Le polymorphisme permet de manipuler des objets sans connaitre leur type. • On pourra remarquer que la surcharge de méthode est aussi considéré comme du polymorphisme. (polymorphisme ad-hoc) • Le polymorphisme ad-hoc (surcharge) permet le choix statique d’un traitement en fonction de l’objet auquel il est appliqué. (déterminé lors de la compilation) • Lorsqu'il provient d'une redéfinition de méthode, on l'appelle polymorphisme par sous- typage. (polymorphisme d’héritage) • Le polymorphisme d’héritage permet le choix dynamique d’un traitement en fonction de l’objet auquel il est appliqué. (déterminé à l’exécution par la JVM - late binding (liaison retardée) ) • En général, on définit le polymorphisme comme suit: 79 Héritageet polymorphisme CHAPITREIII Le polymorphisme peut être vu comme la capacité de choisir dynamiquement la méthode qui correspond au type réel de l’objet. Pr. A.SADIQ
  • 80. Polymorphisme – Principe • Si la classe B hérite de la classe A • Classe B EST-UN Classe A • Toute méthode m de A peut-être invoquée sur une instance de la classe B. • Le polymorphisme consiste à exploiter cela en fournissant un B dans les expressions qui attendent un A. • Exemple: • Un des avantages de ceci est de pouvoir utiliser une seule référence f1 de la classe Forme pour référencer une Forme ou un Rectangle. 80 Héritageet polymorphisme CHAPITREIII Forme f1 = new Rectangle(…); Forme f2 = new Triangle(…); f1.surface(); // lance la méthode surface() de la classe Rectangle f2.surface(); // lance la méthode surface() de la classe Triangle Pr. A.SADIQ
  • 81. Polymorphisme – Exemple • L’utilisation de la méthode polymorphe: affiche() 81 Héritageet polymorphisme CHAPITREIII Point p1 = new Point(3,4); Point p2 = new Point(); Forme[] tab= new Forme[4]; Tab[0]=new Rectangle(p1,10,20); Tab[1]=new Carre(p1,10,20); Tab[2]=new Carre(p1,5); Tab[3]=new Triangle(p1,p2,6,8); For(Forme f: tab){ f.affiche(); } Pr. A.SADIQ
  • 82. Polymorphisme – Exercice de compréhension 1 82 Héritageet polymorphisme CHAPITREIII class A{ public void affiche() { System.out.println("Je suis un A "); }} class B extends A {} class C extends A{ public void affiche() { System.out.println("Je suis un C "); }} class D extends C{ public void affiche() { System.out.println("Je suis un D "); }} public class Poly{ public static void main (String arg[]){ A a = new A() ; a.affiche() ; B b = new B() ; b.affiche() ; a = b ; a.affiche() ; C c = new C() ; c.affiche() ; a = c ; a.affiche() ; D d = new D() ; d.affiche() ; a = d ; a.affiche() ; c = d ; c.affiche() ; }} Je suis un A Je suis un A Je suis un A Je suis un C Je suis un C Je suis un D Je suis un D Je suis un D Pr. A.SADIQ
  • 83. Polymorphisme – Exercice de compréhension 2 83 Héritageet polymorphisme CHAPITREIII public class Forme { public void seDefinir(){ System.out.println("Je suis une forme."); }} public class Polygone extends Forme{ public void seDefinir(){ super.seDefinir(); System.out.println("Je suis aussi un polygone."); }} public class Triangle extends Polygone{} public class Rectangle extends Polygone{ public void seDefinir(){ super.seDefinir(); System.out.println("Je suis aussi un rectangle."); }} public class Carre extends Rectangle{} public class LesFormes{ public static void main(String[] args){ Rectangle r = new Rectangle(); Carre c = new Carre(); Polygone t = new Triangle(); Forme p = new Polygone(); Forme f = new Forme(); System.out.println("Rectangle:"); r.seDefinir(); System.out.println("Carre:"); c.seDefinir(); System.out.println("Triangle:"); t.seDefinir(); System.out.println("Polygone:"); p.seDefinir(); System.out.println("Forme:"); f.seDefinir(); }} Rectangle: Je suis une forme. Je suis aussi un polygone. Je suis aussi un rectangle. Carre: Je suis une forme. Je suis aussi un polygone. Je suis aussi un rectangle. Triangle: Je suis une forme. Je suis aussi un polygone. Polygone: Je suis une forme. Je suis aussi un polygone. Forme: Je suis une forme. Pr. A.SADIQ
  • 84. Polymorphisme – Avantages • Plus besoin de distinguer différents cas en fonction de la classe des objets. • Le polymorphisme constitue la troisième caractéristique essentielle d’un langage orienté objet après l’abstraction des données (encapsulation) et l’héritage. • Une plus grande facilité d’évolution du code. Possibilité de définir de nouvelles fonctionnalités en héritant de nouveaux types de données à partir d’une classe de base commune sans avoir besoin de modifier le code qui manipule la classe de base. • Développement plus rapide. • Plus grande simplicité et meilleure organisation du code. • Programmes plus facilement extensibles. • Maintenance du code plus aisée. 84 Héritageet polymorphisme CHAPITREIII Pr. A.SADIQ
  • 85. Classe abstraite - Exemple 85 Héritageet polymorphisme CHAPITREIII Forme - p1 : Point - largeur: int - longueur: int +surface():int +perimetre():int +affiche():void Rectangle Triangle Carre • Différents types de formes avec des points communs (héritage). • Une classe Forme a pour rôle de rassembler toutes les autres classes (Rectangle, Carre, Triangle). • La question: • Qu’est censé faire un objet Forme? • Qu’il est son coin, sa longueur et sa largeur? • Comment calculer son périmètre? • Nous sommes face au problème suivant : la classe Forme est indispensable pour les besoins de l'héritage, mais cela n'a pas de sens de créer des objets Forme. Il faut donc empêcher l'instanciation de la classe Forme. • Ce type de classes s’appellent classes abstraites: • Considérées comme des super-classe des classes filles. • Autre exemple: Soit la classe Humain(classe abstraite), à partir de laquelle dérivent la classe Homme et la classe Femme. Pr. A.SADIQ
  • 86. Pr. A.SADIQ Exercice • Créer une classe Ville correspondant au schéma UML indiqué. Ecrivez la méthode decrisToi() qui affiche à l’écran le nom de la ville et le nombre d’habitants • Créez une classe Monde qui utilise la classe Ville. La fonction main dans Monde comprendra les lignes suivantes: Ville[] mesVilles=new Ville[5]; mesVilles[0]= new Ville(« Rabat »); mesVilles[1]= new Ville(« Sale»); • Créez une classe Capitale qui hérite de la classe Ville. Celle-ci comprendra une variable d’instance supplémentaire : nomPays. • Redéfinissez la méthode decrisToi(), en faisant appel à la méthode de la classe mère. decrisToi() affichera à l’écran : Capitale de nomPays: nomVille ; nbHabitants. 86 Héritageet polymorphisme CHAPITREIII Ville - nbHabitants : int - nomVille : String + Ville(String) + decrisToi(): void + getNomVille(): String + getNbHabitants(): int + setNbHabitants(int): void
  • 87. Pr. A.SADIQ Exercice • Ecrire une classe Forme qui dispose d’un centre de gravité de type point ( point est une classe), une couleur et de constructeur. • Ecrire trois classe Cercle (caractériser par son rayon), Rectangle (caractériser par sa largeur et sa hauteur), Triangle (caractériser par ses trois côtés), qui héritent de Forme • Toute forme géométrique doit posséder les méthodes suivantes : • Translation(), prenant en paramètre deux nombres exprimant le déplacement horizontal et vertical. • Homothétie(), prenant en paramètre un nombre représentant le ratio de l'homothétie. • Afficher(), donne une représentation sous la forme d'une chaîne de caractères contenant le nom de sa classe et la description textuelle de chacun de ses attributs. • Périmètre, calcule le périmètre . • aire(), calcule l’aire de la forme. • Utiliser la redéfinition et le Surcharge pour définir la méthode dessiner() • Créer une classe « Dessin » qui contient la méthode main 87 Héritageet polymorphisme CHAPITREIII
  • 88. Classe abstraite • Les classes abstraites servent à définir des concepts incomplets qui seront complétés dans les sous-classes. • Autrement dit, le mécanisme des classes abstraites permet de définir des comportements (méthodes abstraites) qui devront être implémentés dans les classes filles, mais sans implémenter ces comportements. • c’est-à-dire sans écrire de code pour cette méthode. • Par exemple, la méthode perimetre() ne peut pas être implémentée dans la déclaration de la classe Forme, car on ne sait pas comment calculer le périmètre d'une forme quelconque : • le périmètre d'un rectangle ne se calcule pas de la même manière que le périmètre d’un triangle. • Déclaration d’une classe abstraite 88 Héritageet polymorphisme CHAPITREIII public abstract class Forme {} public class Rectangle extends Forme {} public class Triangle extends Forme {} Pr. A.SADIQ
  • 89. Méthode abstraite • Une méthode abstraite est une méthode dont l'implémentation n'est pas fournie. • Cette méthode devra être redéfinie dans une des sous-classes. • pas d’accolades mais un simple ; à la suite de la signature de la méthode) : • A retenir: • Une classe qui contient au moins une méthode abstraite doit être déclarée abstract. • Une classe abstraite ne peut pas être instanciée. • Une classe dérivée d'une classe abstraite, ne redéfinissant pas toutes les méthodes abstraites, sera elle même abstraite. • Classe dérivée d'une classe non abstraite (classe concrète) peut être déclarée abstraite. • Une classe abstraite est totalement l'opposé d'une classe final. 89 Héritageet polymorphisme CHAPITREIII public abstract int perimetre(); //dans la classe abstraite Forme public abstract void affiche(); Pr. A.SADIQ
  • 90. classe abstraite – Exemple 90 Héritageet polymorphisme CHAPITREIII abstract public class Forme { private int longueur,largeur; private Point p1; //Pas de constructeur //Setters et getters //Calculer la surface d’une forme public int surface(){ return longueur * largeur;} //les méthodes abstraites abstract public void affiche(); abstract public int perimetre(); } Pr. A.SADIQ
  • 91. Pr. A.SADIQ Classe abstraite (Exemple) 91 public class Cercle extends Figure { private double rayon ; public Cercle ( double rayon) { super ( " cercle " ) ; this. rayon = rayon ; } public double aire ( ) { return Math . PI this . rayonthis . rayon ; } } abstract public class Figure { private String nom; public Figure (String nom) { this.nom=nom; } abstract public double aire ( ) ; public void quiSuisJe ( ) //polymorphisme { System.out.println ( " Je suis un " + this.nom) ; } } public class Rectangle extends Figure { private double largeur ; private double longueur ; public Rectangle (double largeur , double longueur ) { super ( " rectangle" ) ; this.largeur = largeur ; this.longueur = longueur; } public double aire ( ) { return this.largeur *this.longueur; } }
  • 92. Interface – Définition • Quand toutes les méthodes d'une classe sont abstraites et qu'il n'y a aucun attribut, on aboutit à la notion d'interface. • Une interface est un prototype de classe. Elle définit la signature des méthodes qui doivent être implémentées dans les classes construites à partir de ce prototype. • Une interface est une classe purement abstraite dont toutes les méthodes sont abstraites et publiques et sans attributs (les mots-clés abstract et public sont optionnels). • Déclaration: 92 Héritageet polymorphisme CHAPITREIII public interface NomClasse { . . . } Pr. A.SADIQ
  • 93. Interface – Implémentation • Pour préciser qu'une classe implémente une interface, on utilise le mot-clé : implements • Attention : la classe doit implémenter toutes les méthodes de l'interface, sinon elle doit être déclarée abstract. • Une classe peut implémenter plusieurs interfaces : • Une classe peut hériter d'une autre classe et implémenter une ou plusieurs interfaces : 93 Héritageet polymorphisme CHAPITREIII class NomClasse implements NomInterface { . . . } class A implements Interface1 , Interface2 , . . . class A extends B implements Interface1 , . . . Pr. A.SADIQ
  • 94. Interface – A retenir • Une interface ne possède pas d'attributs. Les interfaces ne sont pas instanciables (comme les classes abstraites). • Une interface n'a pas de constructeurs. • Une interface peut définir des constantes, c'est-à-dire définir des variables déclarées publiques, statiques et finales et ayant une valeur constante d'affectation. • Une interface peut hériter d'une autre interface : 94 Héritageet polymorphisme CHAPITREIII interface Interface1 extends Interface2 { . . } Pr. A.SADIQ
  • 95. Interface – Exemple 95 Héritageet polymorphisme CHAPITREIII public interface Animal { public String getNom(); public void dormir(); } public class Lion implements Animal{ private String nom; public Lion (String nom) { this.nom = nom; } public String getNom() { return this.nom; } public void dormir() { System.out.println(this.nom + " : Je dors sous les arbres."); }} public class Jaguar implements Animal { private String nom; public Tigre (String nom) { this.nom = nom; } public String getNom() { return this.nom; } public void dormir() { System.out.println(this.nom + " : Je dors sur les branches des arbres."); } } Pr. A.SADIQ