Programmation orientée objet - jb.vioix.fr ?· Présentation de la programmation orientée objet 1.…

  • Published on
    13-Sep-2018

  • View
    212

  • Download
    0

Embed Size (px)

Transcript

<ul><li><p>Programmation oriente objet</p><p>Prsentation de la programmation oriente objet</p><p>1</p></li><li><p>Plan du cours</p><p> Avant propos</p><p> Manipulation des objets et des classes</p><p> Construction de nouvelles classes</p><p> Hritage, classes abstraites, interfaces</p><p> Visibilit et encapsulation </p><p>2</p></li><li><p>Avant propos</p><p> La programmation orient objets est ardue. Il faut un certain temps pour assimiler tous les concepts associs.</p><p> Pour bien aborder la suite de ce module, il faut apprendre et admettre un certain nombre de concepts sans forcement les comprendre (tout du moins dans les premires semaines).</p><p> La POO fait appel de nombreux mots de vocabulaire prcis, il est impratif de les connatre pour comprendre (et se comprendre...).</p><p> N'hsitez pas poser des question au fur et mesure du cours !</p><p> Les diffrents lments seront dtaills en TD/TP ce qui en clairera la comprhension.</p><p> Pour bien comprendre la POO, il faut apprhender beaucoup de notion de manire simultanes, il nest pas possible de tout prsenter en mme temps, relisez donc ce cours plusieurs fois.</p><p> A la fin du cours, vous comprendrez la notation : </p><p>System.out.println("...");</p><p>3</p></li><li><p>UML en quelques mots</p><p> Dans ce cours, quelques lments dUML sont prsents pour illustrer les relations.</p><p> UML est une mthode de modlisation des problmes informatiques trs complte.</p><p> Lapproche retenue a t un peu simplifie par rapport la norme, ce module nest pas un cours de gnie logiciel.</p><p> Dans un schma UML, les types sont souvent crit en franais car le mme schma UML pourrait tre utilis pour du Java, C++, ... sans grosses modifications.</p><p> Entre Java et UML, certains notation sont inverses (type de retour des mthodes, ...) il est impratif de respecter cette contrainte.</p><p> Par contre, vous devez savoir comment passer dun diagramme UML un fichier Java sans hsitation ; ce nest quune mcanique que les ordinateurs sont capables de raliser trs simplement. Cette opration ne ncessite aucune intelligence, juste lapplication de rgles simples.</p><p>4</p></li><li><p>Utilisation dobjet</p><p> Dans le cours prcdent nous avons utilis quelques classes :</p><p> les chanes de caractres : String</p><p> le lecteur de flux : Scanner</p><p> le gnrateur alatoire : Random</p><p> ... </p><p> De trs nombreuses classes sont disponibles dans lAPI standard couvrant les principaux besoins (plus dinfos disponibles sur : http://java.sun.com/j2se/1.5.0/docs/api/)</p><p> Il est aussi possible (et cest le but) de crer de nouvelle classes en associant des classes existantes.</p><p>5</p><p>http://java.sun.com/j2se/1.5.0/docs/api/http://java.sun.com/j2se/1.5.0/docs/api/</p></li><li><p>Classes et objets</p><p> String, Scanner, ... sont des classes. Les classes dfinissent les proprits et les mthodes communes tous les lments qui seront cres.</p><p> Chaque lment cre est objet.</p><p> Les classes dfinissent : </p><p> Des proprits (ou attributs) qui stockent linformation,</p><p> Des mthodes utilises pour modifier linformation ou accder linformation. </p><p>6</p></li><li><p>Classes et objets</p><p> Pour pouvoir utiliser un objet, il faut dfinir une variable qui permettra daccder cet objet.</p><p> La dclaration se fait avec le nom dune classe suivie du nom de la variable.</p><p> Lobjet est ensuite cre en utilisant loprateur new suivi du constructeur (une mthode qui porte gnralement le mme nom que la classe). Cette opration porte le nom de cration ou instanciation.</p><p> Pour accder aux attributs ou aux mthodes on utilise la variable suivie dun point et de lattribut ou de la mthode (qui a obligatoirement des parenthses mme sil ny a rien dans les parenthses).</p><p> Les objets pouvant en contenir dautres, plusieurs identifiants (mthode ou attribut) peuvent tre mis lun au bout de lautre, simplement spar par des points.</p><p>7</p></li><li><p>UnAutreEntier</p><p>UnEntier</p><p>Objets et rfrences</p><p> Les objets sont dsigns par les variables, mais contrairement aux types, les variables ne contiennent pas les objets.</p><p>class MonEntier { int valeur;}</p><p>class TestEntier { public static void main(String[] args) { MonEntier UnEntier; MonEntier UnAutreEntier; UnEntier = new MonEntier(); UnAutreEntier = new MonEntier(); UnEntier.valeur = 5; UnAutreEntier.valeur = 5; if (UnEntier==UnAutreEntier){ System.out.println("Les 2 variables dsignent le mme objet"); }else{ System.out.println("Les 2 variables sont diffrentes"); } }}</p><p>valeurvaleur = 5</p><p>valeur</p><p>UnEntier</p><p>UnAutreEntier</p><p>Les 2 variables sont diffrentes</p><p>valeur = 5</p><p>8</p></li><li><p>Objets et rfrences</p><p> Deux variables peuvent rfrencer le mme objet.</p><p>class MonEntier { int valeur;}</p><p>class TestEntier { public static void main(String[] args) { MonEntier UnEntier; MonEntier UnAutreEntier; UnEntier = new MonEntier(); UnAutreEntier = UnEntier; UnEntier.valeur = 5; if (UnEntier==UnAutreEntier){ System.out.println("Les 2 variables dsignent le mme objet"); }else{ System.out.println("Les 2 variables sont diffrentes"); } }}</p><p>valeur</p><p>Les 2 variables dsignent le mme objet</p><p>UnEntier</p><p>UnAutreEntier</p><p>valeur = 5</p><p>UnEntier</p><p>UnAutreEntier</p><p>9</p></li><li><p>Destruction dobjet</p><p> Un objet est dtruit par un systme automatique (le garbage collector) quand plus aucune rfrence ne le dsigne.</p><p> Pour supprimer une rfrence il suffit de lassocier null.</p><p> Quand un objet est dtruit toutes les rfrences quil contenait sont dtruites (mais pas forcement les objets associs, dautre rfrences peuvent exister ailleurs).</p><p>class TestEntier { public static void main(String[] args) { MonEntier UnEntier; MonEntier UnAutreEntier; UnEntier = new MonEntier(); UnAutreEntier = UnEntier; UnEntier.valeur = 5; UnEntier = null;</p><p>UnAutreEntier = null; }}</p><p>valeur</p><p>UnEntier</p><p>UnAutreEntier</p><p>valeur = 5</p><p>UnEntier</p><p>UnAutreEntier</p><p>UnEntier</p><p>UnAutreEntier</p><p>10</p></li><li><p>Utilisation des mthodes</p><p> Les mthodes peuvent retourner des donnes (un type, un objet,... ) , elles sont alors utilises dans une affectation ou un test. </p><p> Les objets reus sont cres par la mthode, on doit juste dclarer des variables qui les rfrenceront.</p><p> Pour les mthodes qui ne renvoient pas de donne, on les utilise simplement sur lobjet.</p><p>class TestEntier { public static void main(String[] args) { File fichier; FileWriter fw; String nomComplet; fichier = new File("Toto.txt"); nomComplet = fichier.getAbsolutePath(); System.out.println("Le nom complet du fichier est : " + nomComplet); if (fichier.canWrite()){ fw = new FileWriter(fichier); fw.write('a'); fw.close(); } }}</p><p>Dclaration des variables rfrenant les objets.</p><p>Cration des objets et affectation rfrences</p><p>Appel dune mthode et affectation de sa valeur de retour</p><p>Appel dune mthode et test de sa valeur de retour</p><p>Utilisation de mthodes sans valeur de retour</p><p>11</p></li><li><p>Classes</p><p> Les classes sont des lments de programme qui dfinissent les attributs et les mthodes qui seront utiliss par un (ou plusieurs) objet(s). </p><p> En Java une classe doit tre dans un fichier et un fichier ne peut contenir quune classe (en seule classe dclare public ce qui est la majorit des cas).</p><p> En Java une classe est dclare en utilisant le mot cl class (normalement prcd de public) suivie du nom de la classe avec toute limplmentation entre des accolades</p><p> Dans les schma UML, les classes sont reprsentes par une boite comprenant 3 cadre avec le nom de la classe dans le premier cadre.</p><p>MaClasse public class MaClasse {</p><p>}</p><p>12</p></li><li><p>Attributs</p><p> Les attributs sont des donnes stocks dans les objets.</p><p> Chaque instance de la classe (chaque objet) sont propre jeu dattributs.</p><p> Les attributs sont dclars comme les variables :</p><p> Un type, une classe ou une interface</p><p> Un nom permettant daccder cet lment.</p><p> Dans les schma UML, les attributs sont reprsentes dans le 2me cadre.</p><p>Fichier</p><p>nom : Chainedroits : entier</p><p>public class Fichier { String nom; int droits;}</p><p>13</p></li><li><p>Lecture et criture des attributs</p><p> Pour accder un attribut prsent dans un objet, on utilise la variable qui rfrence cet objet suivie dun point et du nom de lattribut.</p><p> Les attributs (visibles...) peuvent tre lus et crits comme nimporte quelle autre variable.</p><p>public class Entiers { int valeur;}</p><p>public class Programme { public static void main(String[] args) { Entiers monEntier monEntier = new Entiers(); monEntier.valeur = 10; System.out.println("Dans monEntier la valeur est : " + monEntier.valeur); if (monEntier.valeur == 10) { System.out.println("La valeur stocke est bien 10"); }</p><p>}}</p><p>14</p></li><li><p>Attributs</p><p> Les attributs sont propres chaque objet, ils ne sont pas partags entre les diffrents objets dune mme classe.</p><p>public class Entiers { int valeur;}</p><p>public class Programme { public static void main(String[] args) { Entiers monEntier, monAutreEntier; monEntier = new Entiers(); monAutreEntier = new Entiers(); monEntier.valeur = 10; monAutreEntier.valeur = 20; System.out.println("Dans monEntier la valeur est : " + monEntier.valeur); System.out.println("Dans monAutreEntier la valeur est : " + monAutreEntier.valeur); }}</p><p>Dans monEntier la valeur est : 10Dans monAutreEntier la valeur est : 20</p><p>15</p></li><li><p>Attributs statiques</p><p> Un attribut statique est un attribut qui peut tre utilis sans crer dobjet. Pour y accder, on fait suivre le nom de la classe dun point puis du nom de lattribut.</p><p> Tous les objets issus de cette classe se partagent cet attribut.</p><p> Le modificateur static permet de dfinir un attribut statique (ce modificateur est plac juste avant le type). Dans un schma UML, un attribut statique est soulign.</p><p>public class MaClasse { static int nbElements; MaClasse() { nbElements++; }}</p><p>public class Essai { public static void main(String[] args) { MaClasse monObjet, monAutreObjet; System.out.println("Nb elements : " + MaClasse.nbElements); monObjet = new MaClasse(); monAutreObjet = new MaClasse(); System.out.println("Nb elements : " + monObjet.nbElements); System.out.println("Nb elements : " + monAutreObjet.nbElements); }}</p><p>Nb elements : 0Nb elements : 2Nb elements : 2</p><p>16</p></li><li><p>Mthodes</p><p> Les mthodes permettent de modifier les attributs et/ou dinteragir avec lextrieur.</p><p> Une mthode est compose de 2 parties : </p><p> la dclaration (lentte, signature, ...) qui reprsente la liste des arguments dentre.</p><p> limplmentation qui contient les instructions. Dans un programme Java, il ne peut pas y avoir dinstructions (if, for, ...) ailleurs que dans des implmentations de mthodes.</p><p> Dans les schma UML, les mthodes sont reprsentes dans le 3me cadre.</p><p>ConnexionUDP</p><p>LireOctet() : byteEcrireOctet(octet : byte) : boolen</p><p>public class ConnexionUDP { byte LireOctet(){return ...} boolean EcrireOctet(byte octet){return ...}}</p><p>17</p></li><li><p>Mthodes</p><p> Une mthode est dclare par son type de retour suivi du nom de la mthode et des paramtres entre parenthses. </p><p> le type de retour peut tre un type ou une classe ou void les arguments sont dclars comme des variables (donc type suivi du nom), spars </p><p>par des virgules.</p><p> Une mthode dont le type de retour nest pas void doit utiliser linstruction return pour renvoyer un lment du type spcifi. </p><p>public class Entiers { int valeur;</p><p> int Produit(int a){ int temp; temp = valeur * a; return temp; }}</p><p>public class Entiers { int valeur;</p><p> int Produit(int a){ int temp; temp = valeur * a; return temp; }</p><p> void Somme(int a){ valeur = valeur + a; }}</p><p>18</p></li><li><p>Surcharge de mthodes (ou polymorphisme paramtrique)</p><p> Dans une classe, une mme mthode peut avoir plusieurs signatures (nombre et type des donnes dentres) diffrentes. Le nom de la mthode est identique mais le nombre et/ou le type des arguments change.</p><p> Le compilateur choisit quelle mthode appeler en fonction des arguments dappel.</p><p> Pour un mme ensemble darguments (combinaison de type et de nombre), il peut y avoir quune seule dclaration.</p><p>boolean Connecter(String url){...</p><p>}boolean Connecter(String url, int port){...}</p><p>MonObjet.Connecter("www.google.fr");...MonObjet.Connecter("www.serveur.com",8080);</p><p>int Additionner(int a,int b){...</p><p>}int Additionner(int c,int d){ // Une mthode Additionner(int , int) existe dj !}</p><p>19</p><p>http://www.google.frhttp://www.google.frhttp://www.serveur.comhttp://www.serveur.com</p></li><li><p>Constructeur</p><p> Le constructeur est une mthode particulire qui est appele lors de lutilisation de loprateur new.</p><p> Le constructeur a le mme nom que la classe et na aucun type de retour (mme pas void).</p><p> Par dfaut, un constructeur vide sans argument existe (mme sil na pas t crit dans le code).</p><p>public class Entiers { int valeur; public Entiers() { valeur = 0; }}</p><p>public class Programme { public static void main(String[] args) { Entiers monEntier; monEntier = new Entiers(); }}</p><p>20</p></li><li><p>Constructeur</p><p> Il est trs souvent surcharg pour pouvoir initialiser les diffrents attributs.</p><p> Dans ce cas, la version du constructeur appeler est utilise aprs loprateur new.</p><p>public class Entiers { int valeur; Entiers() { valeur = 0; } Entiers(int uneValeur){ valeur = uneValeur; }}</p><p>public class Programme { public static void main(String[] args) { Entiers monEntier; monEntier = new Entiers(10); }}</p><p>21</p></li><li><p>Mthodes statiques</p><p> Une mthode statique est une mthode qui peut tre appele sans crer dobjet. La classe Math en fait grand usage.</p><p> Le modificateur static permet de dfinir une mthode statique (ce modificateur est plac juste avant le type de retour).</p><p> Si lintrieur de cette mthode, dautres mthodes (ou dautres attributs) sont appels il doivent aussi tre dclars statiques.</p><p> Dans un schma UML, une mthode statique est souligne.</p><p>double val;double angle = 56.8745;val = Math.cos(angle);</p><p>22</p></li><li><p>Mthode main</p><p> Un programme Java est compos de plusieurs objets interagissant ensemble.</p><p> La machine virtuelle (JVM) excutera le programme partir de la mthode main.</p><p> Cette mthode est une mthode statique afin quelle puisse tre appele sans crer un objet.</p><p> Les arguments de la mthode main sont les paramtres de la ligne de commande.</p><p>public class MaClasse { public static void main(String[] args) { for (int i = 0; i &lt; args.length; i++) { System.out.println("Argument " + i + " valeur : " + args[i]); } }}</p><p>new-host:bin jb$ java MaClasse argument1 truc Argument 0 valeur : argument1Argument 1 valeur : truc</p><p>23</p></li><li><p>Lhritage</p><p> Lhritage permet de construire une (ou plusieurs) classe(s) partir dune classe existante.</p><p> Le code peut tre factoris et rutilis ultrieurement, les mises jour sont facilites. </p><p> Lhritage est reprsent par une flche vide dans les schma UML</p><p>nom : chaine</p><p>Chat</p><p>Ronronner() :Miauler() :</p><p>Animal</p><p>Manger() :Dormir() :</p><p>24</p></li><li><p>Lhritage</p><p> En Java, on dclare un hritage en utilisant le mot cl extends lors de la dclaration de la classe.</p><p> A la suite du nom de la classe on ajoute extends suivie du nom de la classe mre.</p><p> Il ne peut y avoir quune seule classe mre de dsigne.</p><p> Tous les lments prsents dans la classe mre se retrouvent dans la classe fille (comme si on ralisait un copier/coller).</p><p>public Chat extends Animal{...</p><p>}</p><p>25</p></li><li><p>Redfinition de mthodes</p><p> Une mthode de la classe mre peut tre rcrite dans une classe fille. On parle de surcharge (ou polymorphisme dhritage).</p><p> La mthode doit avoir exactement la mme dfinition (nom de la mthode, type et ordre des arguments). La mthode de la classe fille remplace alors celle de la classe mre lors de lappel. </p><p>public class Rectangle { int largeur; int longueur; int CalculerAire(){ return largeur*longueur; }}</p><p>public class Carre extends Rectangle{ int CalculerAire(){ return largeur*largeur; }}</p><p>26</p></li><li><p>Redfinition de mthodes</p><p> Pour rutiliser le code de la classe mre lors de la surcharge, on utilise le mot cl super suivit dun point et de la mthode appeler.</p><p> La mme syntaxe peut tre utilise pour accd...</p></li></ul>