31
Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) [email protected] Ce cours reprend en partie le matériel pédagogique mis au point par Claude Barras et Frédéric Vernier et s'inspire du cours de Philippe Genoud (INRIA)

Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) [email protected] Ce cours reprend en partie le matériel

Embed Size (px)

Citation preview

Page 1: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Programmation Objet en JAVAMise à Niveau

Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS)

[email protected]

Ce cours reprend en partie le matériel pédagogique mis au point par Claude Barras et Frédéric Vernier et s'inspire du cours de Philippe

Genoud (INRIA)

Page 2: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Introduction à la P.O.O

• Programmation fonctionnelle• Des fonctions et leurs résultats

• Programmation impérative ou procédurale• Des ordres (éventuellement avec des fonctions)

Algorithmes + Structures de données = Programmes

• Programmation Orientée Objet (POO)• Un programme est divisé en plusieurs modules (objets) indépendants. • Les modules sont chargés en mémoire à l’exécution. • Le concepteur fait évoluer ses modules en parallèle et ensemble.

Méthodes + Données = Objet

• Les modules sont typés comme des int et des float • Le type de module est aussi important que le module lui-même• Le type d'un objet est sa classe

Page 3: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Les principes de la POO

Permettre la description d'un problème à l'aide de termes liés au problème et non à la machine :

• par l'identification et la définition des concepts et des objets,• par la mise en oeuvre de leurs interactions

● Tout est objet. Il contient ses données (attributs), et possède une interface (méthodes publiques) permettant de lui adresser des requêtes (ou des messages)

● Un programme est un ensemble d'objets qui communiquent entre eux (envoi de message).

● Chaque objet est construit à partir d'autres objets et possède sa mémoire propre.

● Un objet a un type. Il est l'instance d'une classe. ● Les objets d'un même type peuvent recevoir les mêmes messages. La

distinction la plus importante entre objets de classes différentes est « quels messages peut-on lui envoyer ? »

Page 4: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Le package

• Un package = regroupement cohérent de classes. • import java.util.*;// invoque toutes les classes

//du package • import java.util.ArrayList; //uniquement 1 classe

• Pour constituer un package :

• L'utilisation se fait soit via import soit comme ceci :

• Mettre toutes les classes d'un même package dans un même répertoire -> mypackage

• Attention aux noms utilisés.

package dir1.dir2.mypackage; • Indique le chemin pour trouver les fichiers .class à partir du

CLASSPATH

package mypackage;public class MyClass{...}

mypackage.MyClass m = new mypackage.MyClass();

Page 5: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Exemple 1

public class etudiant { String nom; int promo, note; String traiterExam(String enonce) {…}}

public class prof { String nom; String faireSujetExam() {…} int corrigerExam(String copie) {…}}

Attributs

Méthodes

Page 6: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Exemple 1 - suite

Public class GestionDuL3 {public static void main(String[] args) {

etudiant e = new etudiant();e.nom = «Jean-Louis Ezine»;e.promo = 2;prof p = new prof();String ennonce = « Premier exercice … »;e.note=p.corrigerExam(e.traiterExam(ennonce));… e.nom=«Gabriel Paoli»;…e.nom=«vqdfgsfkbqdlkjfgh»;e.note = -324;

}}

Page 7: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Principe d'encapsulation - Rappel

● Un objet = données (attributs)

+ algorithmes (méthodes)• Principe d'encapsulation :

• L'accès aux données (privées) ne peut se faire que par l'intermédiaire de l'interface (méthodes publiques).

• Les modifications des structures de données n'affectent pas les programmes qui utilisent l'objet. Réutilisation.

Page 8: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Concepts Objet : en mémoire

• La classe est chargée une seule fois (partie static)• Les instances sont chargées dynamiquement autant de fois qu’il y a

d’instances dans le programme• Un compteur est créé pour chaque instance • A chaque fois qu’une nouvelle variable fait référence à l’instance

compteur++• A chaque fois qu’une référence est perdue (sortie de boucle/bloc)

compteur- -• Quand (compteur==0), la JVM libère la mémoire• Quand la JVM libère la mémoire d’un objet, compteur- - pour les

attributs de l’instance détruite !• Si dernière référence => destruction en chaîne• Si co-référence : problème !

Page 9: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Concepts Objet : en pratique

• Méthode = une fonctionnalité• interne / externe• privée / publique

• Variable d'instance :• Variable typée (primitif ou objet)• Liée à un objet

• Variable de classe• Partagée par toutes les instances de la classe (mot clé static)

• Objet = données + méthodes• Programmation Objet =

• Définir, implémenter si besoin les types d'objet : les classes nécessaires

• Création d'un ensemble d’objets• Mise en interaction des objets

Attention à la terminologie

• Classe / Instance c’est clair

• Objet = moins clair, pourtant c’est le terme le plus utilisé

Page 10: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Sondage : Manipulation des données

En java : • Comment sont manipulés les objets, les tableaux, les types primitifs ?• Comment sont passés les paramètres des méthodes ?

Page 11: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Méthodes statiques : Passage des paramètres

Le passage des paramètres se fait par valeur.

• Les 2 méthodes echange n'ont pas la même signature : surcharge

public static void echange(int a , int b) {int tmp = a ;a = b;b = tmp;

}public static void echange(Integer a, Integer b) {

Integer tmp = a;a = b;b = tmp;System.out.println("dedans :" + a + " " + b);

}public static void main(String[] args) {

Integer a = new Integer(3);Integer b = new Integer(4);int x = 3; int y = 4;echange(x,y);System.out.println("Après 1:" + x + " " + y);echange(a,b);System.out.println("Après 2:" + a + " " + b);

}Après 1:??Après 2:??

Page 12: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Passage par valeur -1

var @ val

aObjet #0 #a

bObjet #1 #b

x #2 3

y #3 4

public static void echange(int a , int b) {int tmp = a ;a = b;b = tmp;

}public static void echange(Integer a, Integer b) {

Integer tmp = a;a = b;b = tmp;System.out.println("dedans :" + a + " " + b);

}public static void main(String[] args) {

Integer aObjet = new Integer(3);Integer bObjet= new Integer(4);int x = 3; int y = 4;echange(x,y);System.out.println("Après 1:" + x + " " + y);echange(aObjet,bObjet);System.out.println("Après 2:" + a + " " + b);

}

var @ val

a #55 3

b #57 4

a #55 4

b #57 3

Appel de la méthode :

Page 13: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Passage par valeur -2

var @ val

aObjet #0 #a

bObjet #1 #b

x #2 3

y #3 4

var @ val

a #78 #a

b #79 #b

a #78 #b

b #79 #a

Appel de la méthode :

public static void echange(int a , int b) {int tmp = a ;a = b;b = tmp;

}public static void echange(Integer a, Integer b) {

Integer tmp = a;a = b;b = tmp;System.out.println("dedans :" + a + " " + b);

}public static void main(String[] args) {

Integer aObjet = new Integer(3);Integer bObjet= new Integer(4);int x = 3; int y = 4;echange(x,y);System.out.println("Après 1:" + x + " " + y);echange(aObjet,bObjet);System.out.println("Après 2:" + a + " " + b);

}

Page 14: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Mais pourquoi ?

public class Test{

public static void annule(int a ){a = 0;

} public static void annule(int tab[] ){

tab[0]=0; } public static void main(String[] args) {

int[] tab = { 2, 5, -1, 4, 3 }; System.out.println("Avant "+ tab[0]);annule(tab[0]); // Test.annule(tab[0])System.out.println("Apres "+ tab[0]);System.out.println("Avant "+ tab[0]);annule(tab);System.out.println("Apres "+ tab[0]);

};

> java TestAvant 2Apres 2Avant 2Apres 0

var @ val

tab #x 2

#x+1 5

#x+2 -1

... ...

Page 15: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Exemple de classe type - 1

public class Etudiant {

public String nom;

public int promo;

// Les constructeurs

Etudiant(){

nom = « Toto »;

promo = 0;

}

public String traiterExam( String enonce){…}

}

public class AdminFac {

public static void main(String[] args){

Etudiant et = new Etudiant();

et.nom = Robert;

et.promo = 5;

}

}

• Et le principe d’encapsulation !

• N’importe qui peut “modifier” un étudiant comme il veut !

Page 16: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Exemple de classe type - 2

public class Etudiant {

// les attributs sont privés

private String nom;

private int promo;

// Les constructeurs

Etudiant(String n, int p){

nom = n;

promo = p;

}

public String traiterExam(String enonce){…}

}

public class AdminFac {

public static void main(String[] args){

Etudiant et = new Etudiant(

“Robert”,5);

}

}

• Comment connaître le nom d’un étudiant ?

• Un étudiant peut-il changer de promo ?

• de nom ?

Page 17: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Exemple de classe type - 3

public class Etudiant {

// les attributs sont privés

private String nom;

private int promo;

// Les constructeurs

Etudiant(){

nom = « Toto »;

promo = 0;

}

Etudiant(String n, int p){

nom = n;

promo = p;

}

Et tout le monde peut modifier la promo ?

// L'interface : ici les

// assesseurs “setter &

// getter”

public String getNom(){

return nom;

}

public int getPromo(){

return promo;

}

public void setPromo(int p){

promo = p;

// et les algo nécessaires.

public String traiterExam( String enonce){…}

}

Page 18: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Définition des accès

Les droits d’accès se font lors de la définiton d’une classe

Sondage d’opinion :

• public ?• private ?• « friendly package access » ? • protected ?

Page 19: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Définition des accès

Dans un objet l'accès et l'utilisation d'un attribut ou d'une méthode est contrôlé :

• public : tout le monde peut y accéder, entre autre un utilisateur, le « client programmeur ».

• Définit l'interface de la classe. • private : accès interne à l'objet

• Selon le principe d'encapsulation, les attributs doivent être « private »

• le « friendly package access » : public pour les classes du même package

• protected : public pour les classes qui héritent (nous y reviendrons plus tard) + friendly.

Page 20: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Droits d’accès, exemples

package licence;

public class Etudiant {

// les attributs sont privés

private String nom;

public int promo;

// Les constructeurs

Etudiant(String n, int p){

nom = n;

promo = p;

}

public String traiterExam(String enonce){…}

private String tricherVoisin(){...};

}

package exam;

public class Exemple {

public static void main (...){

Etudiant e = new Etudiant(“Toto”,2);

e.promo = 3;

e.nom = “Titi”;

String reponse =

e.traiterExam(“...”);

reponse = e.tricherVoisin();

}

}

Page 21: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Notions de Programmation OO

• Responsabilités• Chaque objet est responsable de l'accomplissement des

tâches qui lui sont associées.• Les objets clients envoient des messages aux objets

serveurs.• Eléments « atomiques »

• Les éléments de base sont des objets qui sont des instances d'une classe

• Les propriétés génériques d'un objet sont au niveau de la classe

• L'état d'un objet est décrit au niveau de l‘instance• Les classes sont organisées hiérarchiquement et

bénéficient d'un mécanisme d'héritage automatique.

Page 22: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Plan

• Pour aujourd’hui :• un sondage• principe fondateur de Java• classe et objet, encapsulation• constructeur

Page 23: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Constructeurs – 1

Des méthodes permettant de construire et préparer l'objet à être utiliser : • Construction et initialisation selon les souhaits du programmeur• Si aucun constructeur est défini alors il existera un constructeur par défaut qui

initialise les variables à leurs valeurs par défaut :NomClasse()

• Si une classe a un constructeur, il n'y a plus de constructeur par défaut• On cependant peut définir son constructeur par défaut. • Il peut y avoir plus d'un constructeur par classe avec des signatures différentes

public class MaClass {/* Les attributs *//* Les constructeurs */public MaClass(String nom){...}public MaClass(String nom,int nb){...}/* L'interface *//* Les méthodes privées */

public static void main(String[] args){

/* MaClass mc=new MaClass(); * c'est interdit !

*/String n = “un nom” ;int i = 5;// par contre MaClass mc1=new MaClass(n);MaClass mc2=new MaClass(n,i);

}

Page 24: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Par contre

public class MaClass {/* Les attributs *//* Les constructeurs */public MaClass(String nom){...}public MaClass(String nom,int nb){...}public MaClass(){...}

/* L'interface : les méthodes public *//* Les méthodes privées */

public static void main(String[] args){

MaClass mc1=new MaClass(); * c'est possible ! */

String n = “un nom” ;int i = 5;// et aussi MaClass mc1=new MaClass(n);MaClass mc2=new MaClass(n,i);

}

Page 25: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Constructeurs – 2

Conseil : • Lors de la création d’une classe :

• éviter le constructeur par défaut• Un constructeur doit initialiser proprement tous les attributs• L’objet construit doit être prêt à l’emploi.• Utiliser l’IDE.

• Indispensable avec le principe d'encapsulation !• L'opérateur new permet de

• Charger les méthodes de la classe en mémoire si c’est la première fois qu’un objet de ce type est invoqué

• Créer l’instance en mémoire (Réserve exactement la taille de mémoire pour les données et les initialise avec leur valeurs par défaut)

• Lancer le constructeur (Correspondant aux arguments donnés)• Le constructeur peut appeler d’autres méthodes de l’instance (y

compris d’autres constructeurs) ou de la classe.

Page 26: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

mauvais exemple

import java.awt.*;public class CercleNul {

private Point centre; private float rayon;private Color color;

public Point getCentre() {

public float getRayon() {return rayon;

System.out.println(c1.getCentre());}

}

CercleNul c1 = new CercleNul();

/* construction par défaut */public static void main( String[] args) {}

}

return centre;

• Que vaut c1.rayon ?

• Que vaut c1.centre ?

Page 27: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

mauvais exemple - 2 : unPoint

import Point;// on a besoin de la classe Point !public class TestPoint { public static void main(String[] arg) { Point unPoint = new Point();// une variable objet unPoint.setX(10); unPoint.setY(100); System.out.println("point\n\t d'abscisse " + unPoint.getX() + "\n"+"\t et d'ordonnée "+ unPoint.getY()); }}// Fin class TestPoint

Page 28: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Notion de surcharge

• Plusieurs méthodes de même nom mais de signatures différentes (liste d'arguments + type de retour).

public Etudiant(String unNom, int unePromo) { nom = unNom; promo = unePromo;}public void Etudiant(String unNom) { nom = unNom; promo = 0;}

• La surcharge du constructeur permet une initialisation explicite des variables d'instance.

• Un constructeur par défaut est un constructeur sans argument.public Etudiant() { nom = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; promo = 0;}

Page 29: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Auto-Référence (this)

• Dans une méthode, le mot-clé this fait référence à l'objet sur lequel opère la méthode.

System.out.println( this );• On peut imprimer toute instance en JAVA. L'impression fait appel à

la méthode toString() (héritée de Object).• Dans un constructeur, le mot-clé this en début d'un constructeur

désigne un autre constructeur de la même classe.public Etudiant() { this( "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );}• À consommer avec modération !• Et avec le constructeur ??

Page 30: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Reprenons : la classe

• Une classe décrit, définit, implémente un type d'objet :

• ses attributs et ses méthodes• son interface (public) et sa partie private.

• Elle doit être utilisable, réutilisable, évolutive : • principe d'encapsulation• interface bien pensée

• Une classe est un modèle de définition pour des objets ayant • même structure (même ensemble d'attributs), • même comportement (mêmes opérations, méthodes), • une sémantique commune.

• Une classe n'est pas un objet.• Un objet est l'instanciation d'une classe (et une seule), une

représentation dynamique, « vivante ».

Page 31: Programmation Objet en JAVA Mise à Niveau Alexandre Allauzen (Université Paris-Sud / LIMSI-CNRS) allauzen@limsi.fr Ce cours reprend en partie le matériel

Reprenons : l'objet

• Un objet est l'instanciation d'une seule classe.

• conforme par construction au « modèle » : constructeur.• Chaque objet est unique :

• son espace mémoire,

• ses attributs propres et donc son état

• sa référence• Un objet se manipule via sa référence. Référence perdue, objet perdu.

• Un objet n'est pas une classe.