Vous êtes sur la page 1sur 32

Programmation Oriente Objet

1.1. Gnralits Nous abordons maintenant, par l'exemple, la programmation objet. Un objet est une entit qui contient des donnes qui dfinissent son tat (on les appelle des attributs ou proprits) et des fonctions (on les appelle des mthodes). Un objet est cr selon un modle qu'on appelle une classe : public class C1{ type1 p1; // proprit p1 type2 p2; // proprit p2 type3 m1(){ // mthode m3} type4 m2(){ // mthode m4} } A partir de la classe C1 prcdente, on peut crer de nombreux objets O1, O2, Tous auront les proprits p1, p2, et les mthodes m1(..), m2(..), Ils auront des valeurs diffrentes pour leurs proprits pi ayant ainsi chacun un tat qui leur est propre. Si O1 est un objet de type C1, O1.p1 dsigne la proprit p1 de O1 et O1.m1(..) la mthode m1 de O1. Considrons un premier modle d'objet : la classe personne.

Programmation Oriente Objet


1.2. Dfinition de la classe personne La dfinition de la classe personne sera la suivante :

public class personne{ // attributs private String prenom; private String nom; private int age; // mthode public void initialise(String P, String N, int age){ this.prenom=P; this.nom=N; this.age=age; } // mthode public void identifie(){ System.out.println(prenom+","+nom+","+age); } }

Programmation Oriente Objet



Une classe est donc un moule partir duquel sont construits des objets. Les membres d'une classe peuvent tre des donnes ou des mthodes (fonctions). Ces membres peuvent avoir l'un des trois statuts suivants : priv : Un champ priv (private) n'est accessible que par les seules mthodes internes de la classe public : Un champ public est accessible par toute fonction dfinie ou non au sein de la classe protg : Un champ protg (protected) n'est accessible que par les seules mthodes internes de la classe ou d'un objet driv .

En gnral, les donnes d'une classe sont dclares prives alors que ses mthodes sont dclares publiques. La syntaxe de dclaration est la suivante :
public class nomClasse{ private donne ou mthode prive public donne ou mthode publique protected donne ou mthode protge

} Remarques L'ordre de dclaration des attributs private, protected et public est quelconque.

Programmation Oriente Objet


1.3. La mthode initialise La classe personne : public class personne{ // attributs private String prenom; private String nom; private int age; // mthode public void initialise(String P, String N, int age){ this.prenom=P; this.nom=N; this.age=age; } // mthode public void identifie(){ System.out.println(prenom+","+nom+","+age); } }

Programmation Oriente Objet


Quel est le rle de la mthode initialise ? Les membres nom, prenom et age sont des donnes prives de la classe personne, les Instructions suivantes : personne p1 = new personne(); p1.prenom="Jean"; p1.nom="Dupont"; p1.age=30; sont illgales. Il nous faut initialiser un objet de type personne via une mthode publique. C'est le rle de la mthode initialise. On crira : personne p1 = new personne(); p1.initialise("Jean","Dupont",30); L'criture p1.initialise est lgale car initialise est d'accs public.

Programmation Oriente Objet


1.4 L'oprateur new La squence d'instructions suivantes : personne p1; p1.initialise("Jean","Dupont",30); est incorrecte. En effet, l'instruction : personne p1; dclare p1 comme une rfrence un objet de type personne. Cet objet n'existe pas encore et donc p1 n'est pas initialis. Pour que p1 rfrence un objet, il faut crire : personne p1=new personne(); Cela a pour effet de crer un objet de type personne non encore initialis : les attributs nom et prenom qui sont des rfrences d'objets de type String auront la valeur null, et age la valeur 0. Il y a donc une initialisation par dfaut. Maintenant que p1 rfrence un objet, l'instruction d'initialisation de cet objet p1.initialise("Jean","Dupont",30); est valide.

Programmation Oriente Objet


1.5 Le mot cl this Regardons le code de la mthode initialise :
public void initialise(String P, String N, int age){ this.prenom=P; this.nom=N; this.age=age;

} L'instruction this.prenom=P signifie que l'attribut prenom de l'objet courant (this) reoit la valeur P. Le mot cl this dsigne l'objet courant : celui qui fait appel la mthode excute.

Programmation Oriente Objet


1.6 Un programme de test Voici un programme de test : public class test1{ public static void main(String[] arg){ personne p1=new personne(); p1.initialise("Jean","Dupont",30); p1.identifie(); } }

Programmation Oriente Objet


1.7 Une autre mthode initialise Considrons toujours la classe personne et rajoutons-lui la mthode suivante : public void initialise(personne P){ this.prenom=P.prenom; this.nom=P.nom; this.age=P.age; } On a maintenant deux mthodes portant le nom initialise : c'est lgal tant qu'elles admettent des paramtres diffrents. Le paramtre est maintenant une rfrence P une personne. Les attributs de la personne P sont alors affects l'objet courant (this). On remarquera que la mthode initialise a un accs direct aux attributs de l'objet P bien que ceux-ci soient de type private. C'est toujours vrai : les mthodes dune classe C ont toujours accs aux attributs privs des autres objets de la mme classe C.

Programmation Oriente Objet


Voici un test de la nouvelle classe personne : public class test1{ public static void main(String arg[]){ personne p1=new personne(); p1.initialise("Jean","Dupont",30); System.out.print("p1="); p1.identifie(); personne p2=new personne(); p2.initialise(p1); System.out.print("p2="); p2.identifie(); } }

Programmation Oriente Objet


1.8 Constructeurs de la classe personne Un constructeur est une mthode qui porte le nom de la classe et qui est appele lors de la cration de l'objet. On s'en sert gnralement pour l'initialiser. C'est une mthode qui peut accepter des arguments mais qui ne rend aucun rsultat. Son prototype ou sa dfinition ne sont prcds d'aucun type (mme pas void). Si une classe a un constructeur acceptant n arguments argi, la dclaration et l'initialisation d'un objet de cette classe pourra se faire sous la forme : classe objet = new classe(arg1,arg2, ... argn); classe objet; Objet = new classe(arg1,arg2, ... argn); Lorsqu'une classe a un ou plusieurs constructeurs, l'un de ces constructeurs doit tre obligatoirement utilis pour crer un objet de cette classe. Si une classe C n'a aucun constructeur, elle en a un par dfaut qui est le constructeur sans paramtres : public C(). Les attributs de l'objet sont alors initialiss avec des valeurs par dfaut.

Programmation Oriente Objet


Crons deux constructeurs notre classe personne : public class personne{ // attributs private String prenom; private String nom; private int age; // constructeurs public personne(String P, String N, int age){ initialise(P,N,age); } public personne(personne P){ initialise(P); } // mthode public void initialise(String P, String N, int age){ this.prenom=P; this.nom=N; this.age=age; }

Programmation Oriente Objet


public void initialise(personne P){ this.prenom=P.prenom; this.nom=P.nom; this.age=P.age; } // mthode public void identifie(){ System.out.println(prenom+","+nom+","+age); } }

Programmation Oriente Objet


Nos deux constructeurs se contentent de faire appel aux mthodes initialise correspondantes. On rappelle que lorsque dans un constructeur, on trouve la notation initialise(P) par exemple, le compilateur traduit par this.initialise(P).

Voici un programme de test : public class test1{ public static void main(String arg[]){ personne p1=new personne("Jean","Dupont",30); System.out.print("p1="); p1.identifie(); personne p2=new personne(p1); System.out.print("p2="); p2.identifie(); } }

Programmation Oriente Objet


1.9 Les rfrences d'objets
Nous utilisons toujours la mme classe personne. Le programme de test devient le suivant : public class test1{ public static void main(String arg[]){ // p1 personne p1=new personne("Jean","Dupont",30); System.out.print("p1="); p1.identifie(); // p2 rfrence le mme objet que p1 personne p2=p1; System.out.print("p2="); p2.identifie(); // p3 rfrence un objet qui sera une copie de l'objet rfrenc par p1 personne p3=new personne(p1); System.out.print("p3="); p3.identifie(); // on change l'tat de l'objet rfrenc par p1 p1.initialise("Micheline","Benot",67); System.out.print("p1="); p1.identifie(); // comme p2=p1, l'objet rfrenc par p2 a du changer d'tat System.out.print("p2="); p2.identifie(); // comme p3 ne rfrence pas le mme objet que p1, l'objet rfrenc par p3 n'a pas du changer System.out.print("p3="); p3.identifie(); } }

Programmation Oriente Objet


1.10 Les objets temporaires Lappel explicite du constructeur dans une expression donne naissance un objet temporaire. Un objet temporaire est inaccessible (pour le modifier par exemple). Cet objet temporaire est construit pour les besoins d'valuation de l'expression puis abandonn. L'espace mmoire qu'il occupait sera automatiquement rcupr ultrieurement par un programme appel "ramassemiettes ". Considrons l'exemple suivant : public class test1{ public static void main(String arg[]){ new personne(new personne("Jean","Dupont",30)).identifie(); } }

Programmation Oriente Objet


Modifions les constructeurs de la classe personne afin qu'ils affichent un message : public personne(String P, String N, int age){ System.out.println("Constructeur personne(String, String, int)"); initialise(P,N,age); } public personne(personne P){ System.out.println("Constructeur personne(personne)"); initialise(P); } Nous obtenons les rsultats suivants : Constructeur personne(String, String, int) Constructeur personne(personne) Jean,Dupont,30 montrant la construction successive des deux objets temporaires.

Programmation Oriente Objet


1.11 Mthodes de lecture et d'criture des attributs privs Nous rajoutons la classe personne les mthodes ncessaires pour lire ou modifier l'tat des attributs des objets : public class personne{ private String prenom; private String nom; private int age; public personne(String P, String N, int age){ this.prenom=P; this.nom=N; this.age=age; } public personne(personne P){ this.prenom=P.prenom; this.nom=P.nom; this.age=P.age; }

Programmation Oriente Objet


public void identifie(){ System.out.println(prenom+","+nom+","+age); } public String getPrenom(){ return prenom; } public String getNom(){ return nom; } public int getAge(){ return age; } public void setPrenom(String P){ this.prenom=P; } public void setNom(String N){ this.nom=N; } public void setAge(int age){ this.age=age; } }

Programmation Oriente Objet


Nous testons la nouvelle classe avec le programme suivant : public class test1{ public static void main(String[] arg){ personne P=new personne("Jean","Michelin",34); System.out.println("P=("+P.getPrenom()+","+P.getNom()+","+P.getAge()+")") ; P.setAge(56); System.out.println("P=("+P.getPrenom()+","+P.getNom()+","+P.getAge()+")") ; } } et nous obtenons les rsultats suivants : P=(Jean,Michelin,34) P=(Jean,Michelin,56)

Programmation Oriente Objet


1.12 Les mthodes et attributs statique dune classe

Dans une classe Java, on peut dfinir des attributs qui seront partag par tous les objets de la mme classe. Ces attributs sont qualifi par static Exemple : Supposons qu'on veuille compter le nombre d'objets personne cres dans une application. On peut soi-mme grer un compteur mais on risque d'oublier les objets temporaires qui sont crs ici ou l. Il semblerait plus sr d'inclure dans les constructeurs de la classe personne, une instruction incrmentant un compteur. On le dclare avec le mot cl static : private static long nbPersonnes; // nombre de personnes cres

Programmation Oriente Objet


Pour lutiliser, on crit personne.nbPersonnes pour montrer que c'est un attribut de la classe personne elle-mme. On cre donc une mthode publique pour donner accs l'attribut de classe nbPersonnes. Pour rendre la valeur de nbPersonnes la mthode n'a pas besoin d'un objet particulier : En effet nbPersonnes n'est pas l'attribut d'un objet particulier, il est l'attribut de toute une classe. On dclare la mthode y accder, elle aussi static : public static long getNbPersonnes(){ return nbPersonnes; }

Programmation Oriente Objet


La classe personne devient la suivante : public class personne{ // attribut de classe private static long nbPersonnes=0; // constructeurs public personne(String P, String N, int age){ initialise(P,N,age); nbPersonnes++; } public personne(personne P){ initialise(P); nbPersonnes++; } public static long getNbPersonnes(){ return nbPersonnes; } }

Programmation Oriente Objet


1.13 Passage d'un objet une fonction Nous avons dj dit que Java passait les paramtres effectifs d'une fonction par valeur : les valeurs des paramtres effectifs sont recopies dans les paramtres formels. Une fonction ne peut donc modifier les paramtres effectifs. Dans le cas d'un objet, il ne faut pas se laisser tromper par l'abus de langage qui est fait systmatiquement en parlant d'objet au lieu de rfrence d'objet. Un objet n'est manipul que via une rfrence (un pointeur) sur lui. Ce qui est donc transmis une fonction, n'est pas l'objet lui-mme mais une rfrence sur cet objet. C'est donc la valeur de la rfrence et non la valeur de l'objet lui-mme qui est duplique dans le paramtre formel : il n'y a pas construction d'un nouvel objet.

Programmation Oriente Objet


Si une rfrence d'objet R1 est transmise une fonction, elle sera recopie dans le paramtre formel correspondant R2. Aussi les rfrences R2 et R1 dsignent-elles le mme objet. Si la fonction modifie l'objet point par R2, elle modifie videmment celui rfrenc par R1 puisque c'est le mme.

Programmation Oriente Objet


public class test1{ public static void main(String arg[]){ personne p1=new personne("Jean","Dupont",30); System.out.print("Paramtre effectif avant modification : "); p1.identifie(); modifie(p1); System.out.print("Paramtre effectif aprs modification : "); p1.identifie(); }// main private static void modifie(personne P){ ("Paramtre formel avant modification : "); P.identifie(System.out.print); P.initialise("Sylvie","Vartan",52); System.out.print("Paramtre formel aprs modification : "); P.identifie(); }// modifie }// class

Programmation Oriente Objet


La mthode modifie est dclare static parce que c'est une mthode de classe : on n'a pas la prfixer par un objet pour l'appeler. Les rsultats obtenus sont les suivants :
Constructeur personne(String, String, int) Paramtre effectif avant modification : Jean,Dupont,30 Paramtre formel avant modification : Jean,Dupont,30 Paramtre formel aprs modification : Sylvie,Vartan,52 Paramtre effectif aprs modification : Sylvie,Vartan,52

On voit qu'il n'y a construction que d'un objet : celui de la personne p1 de la fonction main et que l'objet a bien t modifi par la fonction modifie.

Programmation Oriente Objet


1.14 Encapsuler les paramtres de sortie d'une fonction dans un objet A cause du passage de paramtres par valeur, on ne sait pas crire en Java une fonction qui aurait des paramtres de sortie de type int par exemple car on ne sait pas passer la rfrence d'un type int qui n'est pas un objet. On peut alors crer une classe encapsulant le type int : public class entieres{ private int valeur; public entieres(int valeur){ this.valeur=valeur; } public void setValue(int valeur){ this.valeur=valeur; } public int getValue(){ return valeur; } }

Programmation Oriente Objet

La classe prcdente a un constructeur permettant d'initialiser un entier et deux mthodes permettant de lire et modifier la valeur de cet entier. On teste cette classe avec le programme suivant : public class test2{ public static void main(String[] arg){ entieres I=new entieres(12); System.out.println("I="+I.getValue()); change(I); System.out.println("I="+I.getValue()); } private static void change(entieres entier){ entier.setValue(15); } } et on obtient les rsultats suivants : I=12 I=15

Programmation Oriente Objet


1.15 Un tableau de personnes Un objet est une donne comme une autre et ce titre plusieurs objets peuvent tre rassembls dans un tableau : public class test1{ public static void main(String arg[]){ personne[] amis=new personne[3]; System.out.println("----------------"); amis[0]=new personne("Jean","Dupont",30); amis[1]=new personne("Sylvie","Vartan",52); amis[2]=new personne("Neil","Armstrong",66); for(int i=0;i<amis.length;i++) amis[i].identifie(); } }

Programmation Oriente Objet



L'instruction personne[] amis=new personne[3]; cre un tableau de 3 lments de type personne. Ces 3 lments sont initialiss ici avec la valeur null, c.a.d. qu'ils ne rfrencent aucun objet. On obtient les rsultats suivants : ---------------Constructeur personne(String, String, int) Constructeur personne(String, String, int) Constructeur personne(String, String, int) Jean,Dupont,30 Sylvie,Vartan,52 Neil,Armstrong,66

Programmation Oriente Objet


2 L'hritage par l'exemple
2.1 Gnralits
Nous abordons ici la notion d'hritage. Le but de l'hritage est de faciliter la reutilisation entre classes. Supposons qu'on veuille crer une classe enseignant : un enseignant est une personne particulire. Il a des attributs de la classe personne et la matire qu'il enseigne par exemple. Un enseignant fait donc pleinement partie de la classe personne mais a des attributs supplmentaires. Plutt que d'crire une classe enseignant en partant de rien, on prfrerait reprendre l'acquis de la classe personne qu'on adapterait au caractre particulier des enseignants. C'est le concept d'hritage qui nous permet cela.