poo : objets et classes (rappels) objectifs de la poo: on manipule des objets. les programmes sont...
TRANSCRIPT
POO : Objets et classes (Rappels)
Objectifs de la POO:
• On manipule des objets.
• Les programmes sont découpés suivant les types des objets manipulés.
• Les données sont regroupées avec les traitements qui les utilisent.
• Une classe Facture regroupe, par exemple, tout ce que l’on peut faire avec une facture, avec toutes les données nécessaires à ces traitements.
Notion d’objet en Java (Rappels)
L’état interne est donné par des valeurs de variables d’instances.
Le comportement est donné par des fonctionsou procédures, appelées méthodes.
Un objet a: – une adresse en mémoire (identifie l’objet) – un comportement (ou interface) – un état interne
Qu’est-ce qu’un objet? (Rappels)
• Toute entité identifiable, concrète ou abstraite, peut être considérée comme un objet.
• Un objet réagit à certains messages qu'on lui envoie de l'extérieur ; la façon dont il réagit détermine le comportement de l'objet.
• Il ne réagit pas toujours de la même façon à un même événement ; sa réaction dépend de l’état dans lequel il se trouve.
Exemple d’objet (Rappels)
Exemple d’objet (Rappels)
Interactions entre objets (Rappels)
Les objets interagissent en s’envoyant des messages synchronesLes méthodes d’un objet correspondent aux messages qu’on peut lui envoyer : quand un objet reçoit un message, il exécute la méthode correspondanteExemples :
objet1.decrisToi();
employe.setSalaire(20000);
voiture.demarre();
voiture.vaAVitesse(50);
Objet qui reçoit le message
Message envoyé
Interactions entre objets (Rappels)
Message envoyé
Messages entre objets (Rappels)
Pierre envoie un message à sa voiture
maVoiture.vaVitesse(70)
9
Paradigme objet (Rappels)
La programmation objet est un paradigme, une manière de « modéliser le monde » :
– des objets ayant un état interne et un comportement– collaborent en s'échangeant des messages (pour fournir les
fonctionnalités que l'on demande à l'application)
D’autres paradigmes :– programmation impérative (Pascal, C)– programmation fonctionnelle (Scheme, Lisp)
10
Classes Java (Rappels)
• Les objets qui collaborent dans une application sont souvent très nombreux.
• Mais on peut le plus souvent dégager des types d'objets : des objets ont une structure et un comportement très
proches, sinon identiques.
• Par exemple, tous les livres dans une application de gestion d'une bibliothèque.
• La notion de classe correspond à cette notion de types d'objets.
• Un objet correspond à une instanciation de classes
11
Classes et instances
Une instance d’une classe est créée par un desconstructeurs de la classe.
Une fois qu’elle est créée, l’instance :
– a son propre état interne (les valeurs des variables) – partage le code qui détermine son comportement (les
méthodes) avec les autres instances de la classe
12
Constructeurs d’une classe
Chaque classe a un ou plusieurs constructeursqui servent à :
– créer les instances– initialiser l’état de ces instances
Un constructeur
– a le même nom que la classe– n’a pas de type retour
13
Création d’une instance
variablesd’instance
création d'une instancede Employe
14
Plusieurs constructeurs (surcharge)
15
Constructeur par défaut
Lorsque le code d’une classe ne comporte pas de constructeur, un constructeur sera automatiquement ajouté par Java
Pour une classe Classe, ce constructeur sera par défaut défini par Java
[public] Classe() { }
16
les accesseurs
Deux types de méthodes servent à donner accès aux variables depuis l’extérieur de la classe :
les accesseurs en lecture pour lire les valeursdes variables ; « accesseur en lecture » estsouvent abrégé en « accesseur »
les accesseurs en écriture, ou modificateurspour modifier leurs valeurs
les accesseurs de modification public class Emprunteur {
private String prenom = "";
public void setPrenom(String prenom) {
this.prenom = prenom;
}
}
Valeur en entrée de la méthode
les accesseurs de lecture : Exemple
public class Emprunteur {
private String prenom = "";
public String getPrenom() { return prenom;
}
}
Valeur en sortie de la méthode
19
Surcharge d’une méthode
• En Java, on peut surcharger une méthode, c’est-à-dire, ajouter une méthode qui a le même nom mais pas la même signature qu’une autre méthode :
calculerSalaire(int)calculerSalaire(int, double)
indice dansla grille des
salaires
prime accordéeaux commerciaux
20
Surcharge d’une méthode
• En Java, il est interdit de surcharger une méthode en changeant le type de retour.
• Autrement dit, on ne peut différencier 2 méthodes par leur type retour.
• Par exemple, il est interdit d'avoir ces 2 méthodes dans une classe :
int calculerSalaire(int)double calculerSalaire(int)
21
Types de variables
Les variables d’instances
– sont déclarées en dehors de toute méthode– conservent l’état d’un objet, instance de la classe– sont accessibles et partagées par toutes les méthodes de la classe
Les variables locales
– sont déclarées à l’intérieur d’une méthode– conservent une valeur utilisée pendant l’exécution de la méthode– ne sont accessibles que dans le bloc dans lequel elles ont été déclarées
22
Déclaration des variables
• Toute variable doit être déclarée avant d’être utilisée • Déclaration d’une variable : on indique au compilateur que le
programme va utiliser une variable de ce nom et de ce type
Exemples:
double prime;Employe e1;Point centre;
23
Affectation des variables
• L’affectation d’une valeur à une variable est effectuée par l’instruction:
variable = expression;• L’expression est calculée et ensuite la valeur
calculée est affectée à la variable
Exemple :
x = 3;
x = x + 1;
24
Initialisation d’une variable
• Une variable doit être initialisée (recevoir une valeur) avant d’être utilisée dans une expression.
• Si elles ne sont pas initialisées par le programmeur, les variables d’instance reçoivent les valeurs par défaut de leur type, si elle sont de type primitif, et null sinon.
• L’utilisation d’une variable locale non initialisée par le programmeur provoque une erreur (pas d’initialisation par défaut)
25
Initialisation d’une variable
On peut initialiser une variable en la déclarant.
La formule d’initialisation peut être une expression complexe :
double prime = 2000.0;
Employe e1 = new Employe("Dupond", "Jean");
double salaire = prime + 5000.0;
26
Désigner les variables d’une instance
• Soit un objet o1 ; la valeur d’une variable v deo1 est désignée par o1.v .
Par exemple,Cercle c1 = new Cercle(p1, 10);System.out.println(c1.rayon); // affiche 10
Remarque : le plus souvent les variables sont privateet on ne peut y accéder directement en dehors de leurclasse
27
Accès aux membres d’une classe
• Degrés d'encapsulation
– Java permet plusieurs degrés d’encapsulation pour les membres (variables et méthodes) et les constructeurs d’une classe
– L’encapsulation est le fait de ne montrer et de ne permettre de modifier que ce qui est nécessaire à une bonne utilisation
28
Types d'autorisation d'accès
• private : seule la classe dans laquelle il est déclaré a accès (à ce membre ou constructeur)
• public : toutes les classes sans exception y ont accès
• Sinon, par défaut, seules les classes du même paquetage que la classe dans lequel il est déclaré y ont accès
Rappel : un paquetage est un regroupement de classes.
29
Méthodes et variables de classe
Variables de classe– Certaines variables sont partagées par toutes les
instances d’une classe. Ce sont les: variables de classe (modificateur static)
– Si une variable de classe est initialisée dans sa déclaration, cette initialisation est exécutée une seule fois quand la classe est chargée en mémoire
Mémoire
e1
e2 public static void main(String[] args) {
Emprunteur e1 ; Emprunteur e2; Emprunteur e3;
e3
}
Mémoire
e1
e2 public static void main(String[] args) {
Emprunteur e1 ; Emprunteur e2; Emprunteur e3;
e3 e1 = new Emprunteur("Lefevre","Celian"); e2 = new Emprunteur("Dupont","Charlotte"); e3 = new Emprunteur("Cartier", "Sébastien");
}
Mémoire
e1
e2 public static void main(String[] args) {
Emprunteur e1 ; Emprunteur e2; Emprunteur e3;
e3 e1 = new Emprunteur("Lefevre","Celian"); e2 = new Emprunteur("Dupont","Charlotte"); e3 = new Emprunteur("Cartier", "Sébastien");
}
Mémoire
e1
e2
public static void main(String[] args) {
Emprunteur e1 ; Emprunteur e2; Emprunteur e3;
e3 e1 = new Emprunteur("Lefevre","Celian"); e2 = new Emprunteur("Dupont","Charlotte"); e3 = new Emprunteur("Cartier", "Sébastien");
}
34
Méthodes de classe
• Une méthode de classe (modificateur static en Java) exécute une action indépendante d’une instance particulière de la classe
• Une méthode de classe peut être considérée comme un message envoyé à une classe
• Exemple :public static int getNbEmployes() {
return nbEmployes;}
35
Désigner une méthode de classe
• Pour désigner une méthode static depuis une autre classe, on la préfixe par le nom de la classe :
int n = Employe.getNbEmploye();
• On peut aussi la préfixer par une instance quelconque de la classe (à éviter car cela nuit à la lisibilité : on ne voit pas que la méthode est static) :int n = e1.getNbEmploye();
36
Méthodes de classe
• Comme une méthode de classe exécute une action indépendante d’une instance particulièrede la classe, elle ne peut utiliser de référence àune instance courante (this)
• Il serait, par exemple, interdit d’écrire
static double tripleSalaire() {return salaire * 3;
• }
37
La méthode static main
• La méthode main() est nécessairement static.
Pourquoi ?
• La méthode main() est exécutée au début du programme. Aucune instance n’est donc déjà créée lorsque la méthode main() commence son exécution. Ça ne peut donc pas être une méthode d’instance.
38
L’héritage
• L'héritage de classe est un des constituants primordiaux de la programmation orientée objet.
• C'est un mécanisme permettant de créer une nouvelle classe en partant d'une classe existante.
• La nouvelle classe (classe fille) conservera les propriétés et méthodes de la classe d'origine (classe mère), tout en pouvant y ajouter ses propres.
• On dit aussi que la classe fille étend la classe mère.
L’héritage
L’héritage
L’héritage
42
Le polymorphisme
• Le polymorphisme correspond à la possibilité pour un opérateur ou une fonction d'être utilisable dans des contextes différents
43
Le polymorphisme
• Ainsi, on peut par exemple définir plusieurs méthodes homonymes addition() effectuant une somme de valeurs.
• La méthode int addition(int, int) pourra retourner la somme de deux entiers
• La méthode float addition(float, float) pourra retourner la somme de deux flottants
• La méthode char addition(char, char) pourra définir au gré de l'auteur la somme de deux caractères
• etc.
44
Le polymorphisme d'héritage
• La possibilité de redéfinir une méthode dans des classes héritant d'une classe de base s'appelle la spécialisation.
• Il est alors possible d'appeler la méthode d'un objet sans se soucier de son type intrinsèque : il s'agit du polymorphisme d'héritage.
• Ceci permet de faire abstraction des détails des classes spécialisées d'une famille d'objet, en les masquant par une interface commune (qui est la classe de base).
45
Les interfaces
• Une interface est constituée d'un ensemble de déclarations de méthodes sans implantation.
• On n'y trouve uniquement, pour chaque méthode, que la définition de son profil, c'est-à-dire son en-tête suivi de ; .
• Les interfaces sont définies par le mot clé interface.
• Si les interfaces permettent de déclarer des variables de référence portant leur type, elles ne sont pas, par contre, instanciables. En particulier une interface ne possède pas de constructeur.
• Une classe peut implanter une ou plusieurs interface(s) : la définition de la classe comporte alors le mot clé implements suivi d'une liste de noms d'interfaces (les noms des interfaces implantées y sont séparés par une virgule).
46
Les interfaces
public interface MonInterface {
[public abstract] type methode1([arguments]); ...
}
Public class MaClass implements MonInterface {public type methode1([arguments]) {// Implementation de la méthode methode1…}
}