Exercices d’introduction orientée objet en Java ... ?· 2 Exercices d’introduction orientée objet…

  • Published on
    12-Sep-2018

  • View
    212

  • Download
    0

Embed Size (px)

Transcript

<ul><li><p>Exercices dintroduction oriente objet en Java : personnes,enseignants et tudiants</p><p>Universit Paris Sud</p><p>Prambule</p><p>Cette suite dexercices a pour but de passer en revue les notions orientes objet lesplus simples du langage. La rdaction utilise volontairement le vocabulaire ddi. Il estplus que conseill de vous reporter au notes de cours qui vous ont t distrribues ainsiqu laide sur les API Java.</p><p>Exercice 1 Classe Personne (constructeurs)</p><p>Nous allons crer deux classes, lune reprsentant une personne, nomme Personneet lautre pour contenir le main, nomme PersonneMain.</p><p>1. Constructeur exhaustif.</p><p>a) Crer la classe nomme PersonneMain, publique (avec le mot cl public de-vant class), ne comportant pas de champ et comportant une unique mthodemain() de signature</p><p>public static void main(String args[])Au sein de cette mthode, crer, laide de loprateur new une instance dob-jet de type Personne (voir la description de la classe Personne ci-dessous)et appeler sa mthode afficher().On rappelle quun fichier source java peut contenir au plus une classe publiqueet que, si cest le cas, le nom du fichier doit correspondre (y compris les majus-cules/minuscules) au nom de la classe publique.</p><p>b) Crer une classe, nomme Personne, non publique (sans le mot cl publicdevant class), contenant 2 champs : un champ nom de type String, et un champ age de type primitif int.Crer un constructeur exhaustif (c..d. initialisant tous les champs), de signa-ture</p><p>Personne(String leNom, int lAge)initialisant les deux champs de la classe leNom et lAge.</p><p>1</p></li><li><p>2 Exercices dintroduction oriente objet en Java : personnes, enseignants et tudiants</p><p>c) Crer la mthode afficher() de signaturevoid afficher()</p><p>qui affiche le nom et lage au format dcrit ci-aprs. Pour un objet de typePersonne dont la variable dinstance nom vaut "Coupdetrix" et la variabledinstance age vaut 25, la mthode afficher() affichera lcran :</p><p>Nom : CoupdetrixAge : 25 ans</p><p>d) Tester ces classes en excutant PersonneMain.2. Champ de type tableau ; test de conformit dun constructeur exhaustif.</p><p>a) Ajouter un champ la classe Personne, de type tableau de relsdouble[] comptes;</p><p>susceptibles de reprsenter les divers soldes des comptes en banque de la per-sonne. Adapter le constructeur exhaustif ainsi que la mthode afficher()(qui doit afficher, outre le nom et lage de la personne les diffrents lmentsdu tableau comptes. Crer, au sein de la classe Personne, la mthode voiddiviserParDeux(), qui modifie le tableau comptes en divisant chaque l-ment par deux.</p><p>b) Afin de tester que le constructeur exhaustif prcdent est bien conforme ce quil doit tre, dans la classe PersonneMain, crer deux objets de typePersonne, de mme nom, mme age et partir du mme objet nombrescomportant deux lments. Appeler diviserParDeux() sur le premier desobjets de type Personne. Appeler la mthode afficher() de ces deux ob-jets. Le code utilis sera par exemple le suivant :</p><p>int[] mesNombres = new int[2];mesNombres[0] = 100;mesNombres[1] = 92;Personne sage = new Personne("Agecanonix", 80,</p><p>mesNombres);Personne sageBis = new Personne("Agecanonix", 80,</p><p>mesNombres);sage.diviserParDeux();sage.afficher();sageBis.afficher();</p><p>Si laffichage est identique pour les deux objets, le prsent constructeur exhaus-tif, ainsi que celui que vous avez ralis la question prcdente ne sont pascorrects. Les initialisations des champs nom et nombres doivent alors avoirt faites avec ce que lon nomme de la copie superficielle (copie des rfrencesuniquement), alors quelles auraient dues tre faites avec de la copie profonde(copie du contenu des objets). Corriger le constructeur exhaustif si ncessaire.</p><p>3. Constructeurs par dfaut et de recopie.Par souci de simplicit, le champ comptes prcdent ne sera pas conserv. Son seulbut tait de faire prendre conscience de la ncessit des copies profondes au sein desconstructeurs. Nous reprendrons galement le constructeur exhaustif et la mthodeafficher() de la premire question.</p><p>a) Au sein de la classe Personne, crer un constructeur par dfaut, de signaturePersonne()</p><p>appelant le constructeur exhaustif de la question prcdente au moyen du motcl this (voir lutilisation de this(...) comme appel de constructeur) et</p></li><li><p>Exercice 2 Classes Enseignants et tudiants (Hritage) 3</p><p>initialisant respectivement les champs nom et age "Asterix" et 30. Silvocation du mot cl this comme appel de constructeur ne vous semble pasparfaitement claire, reportez vous au polycopi, au chapitre des bases orien-te objet de java, section Classes, instance dobjet, hritage, sous sectionconstructeurs.</p><p>b) Crer un constructeur de recopie, de signaturePersonne(Personne p)</p><p>qui initialise les champs de la classe ceux de p.</p><p>c) Modifier la mthode main() de PersonneMain en crant 3 personnes, lune laide du constructeur exhaustif, une autre avec le constructeur par dfautet la dernire avec le contructeur de recopie. Les afficher toutes les trois enappelant la mthode afficher().</p><p>Exercice 2 Classes Enseignants et tudiants (Hritage)</p><p>1. Classes Enseignant et Etudiant.</p><p>a) Crer une classe Enseignant hritant de Personne et ayant deux champs : Un champ nbHeuresCours, de type primitif int, Un champ grincheux, de type primitif boolean.Crer un constructeur exhaustif appelant le constructeur de la classe mre (celuide Personne) par super (cet appel doit tre la premire ligne du constructeurdEnseignant), puis initialisant ses champs propres (nbHeuresCours etgrincheux).</p><p>b) Crer de mme une classe Etudiant hritant de Personne et ayant deuxchamps : Un champ noteMoyenne, de type primitif int, Un champ faineant, de type primitif boolean.Crer un constructeur exhaustif appelant le constructeur de la classe mre (celuide Personne) par super (cet appel doit tre la premire ligne du construc-teur dEtudiant), puis initialisant ses champs propres (noteMoyenne etfaineant).</p><p>c) Crer une classe ProfEleveMain ne comportant pas de champ et comportantune unique mthode main(). Au sein de cette mthode, crer une instancedobjet de type Personne, de nom gal "Nimbus" et dage gal 45.Crer un Enseignant, de mme nom et age, ayant nbHeuresCours gal 50 et grincheux mis true.Crer un Etudiant de nom "Soupaloigonycrouton", dage gal 20,ayant 2 comme noteMoyenne et faineant mis true.Appeler la mthode afficher() (qui est hrite de Personne) de ces troisinstances. On constate que les deux premires instances ont des affichages in-distinguables.</p><p>2. Diffrentiation par le type.</p><p>a) Crer un tableau de 5 lments de type Personne dans la mthode main()de la classe ProfEleveMain ; initialiser ce tableau avec 2 instances dobjetde type Enseignant et 3 instances de type Etudiant. Effectuer une bouclefor sur les lments du tableau ; dans le corps de la boucle, effectuer un appel</p></li><li><p>4 Exercices dintroduction oriente objet en Java : personnes, enseignants et tudiants</p><p> la mthode afficher(), puis afficher sil sagit dun Etudiant ou dunEnseignant en se servant de loprateur instanceof.</p><p>Exercice 3 Diffrents affichages (Surcharge et redfinition)</p><p>1. Surcharge de la mthode afficher().Dans la classe Personne, crer une mthode afficher(), de signature</p><p>void afficher(boolean compact)qui affiche selon lun des formats suivants. Si compact est gal false, laffichageest le mme que celui de signature void afficher() (la mthode de mme nomdcrite en question 1c de lExercice 1). Si compact est gal true, laffichage dunobjet de nom gal Coupdetrix et dage gal 25 sera de la forme[Coupdetrix, 25]</p><p>2. Redfinition de la mthode afficher().Crer, au sein de la classe Enseignant (resp. au sein de la classe Etudiant) unemthode de signature void afficher() qui appelle la mthode afficher() dePersonne (au moyen de super) puis qui affiche la chane "Enseignant" (resp."Etudiant").</p><p>3. Modifier la mthode main() de ProfEleveMain labore dans la question prc-dente en ne conservant, dans le corps de la boucle for, quun appel la mthodeafficher() sur les cinq lments du tableau.</p><p>Exercice 4 Dlgation daffichage (Classes abstraites)</p><p>Supposons que la classe Personne fasse partie dune biliothque que vous distri-buez et que vous vouliez obliger les programmeurs qui conoivent des classes hritant dePersonne (telles Enseignant et Etudiant) munir ces dernires de certaines m-thodes.</p><p>1. Rendre la classe Personne abstraite (par le mot cl abstract devant class).</p><p>2. Dclarer une mthode abstraite, ne retournant rien (cest--dire void), sans argu-ments, nomme afficherType().</p><p>3. La mthode afficher() de Personne va affectuer laffichage dcrit en question1c de lExercice 1, puis va faire appel afficherType().</p><p>4. Les classes Enseignant et Etudiant hritent de la classe abstraite Personneet ne sont pas abstraites. Leur constructeur doit donc faire appel la mthodecreatePersonne() (puisquil ny a plus de constructeur de Personne).La mthode afficherType() dans la classe Enseignant (resp. dans la classeEtudiant) neffectue quune chose : afficher la chane Enseignant (resp. la chaneEtudiant).</p><p>5. Adapter les classes Enseignant et Etudiant.</p><p>De cette manire, toute classe hritant de Personne doit ncessairement implanter la m-thode afficherType(). Laffichage est dlgu aux sous types concrets de Personne.</p><p>Exercice 1 Classe Personne (constructeurs)Exercice 2 Classes Enseignants et tudiants (Hritage)Exercice 3 Diffrents affichages (Surcharge et redfinition)Exercice 4 Dlgation d'affichage (Classes abstraites)</p></li></ul>