Exercices d'introduction orientée objet en Java : personnes ...

Il est plus que conseillé de vous reporter au notes de cours qui vous ont été distrribuées ainsi qu'à l'aide sur les API Java. Exercice 1 Classe Personne ( ...

Part of the document

Exercices d"introduction orientée objet en Java : personnes,
enseignants et étudiants
Université Paris SudPréambule
Cette suite d"exercices a pour but de passer en revue les notions orientées objet les
plus simples du langage. La rédaction utilise volontairement le vocabulaire dédié. Il est
plus que conseillé de vous reporter au notes de cours qui vous ont été distrribuées ainsi
qu"à l"aide sur les API Java.
Exercice 1 Classe Personne (constructeurs)
Nous allons créer deux classes, l"une représentant une personne, nomméePersonne
et l"autre pour contenir le main, nomméePersonneMain.1.Constructeur exhaustif.a)Créer la classe nomméePersonneMain,publique(avec le mot clépublicde-
vantclass), ne comportant pas de champ et comportant une unique méthode
main()de signature
public static void main(String args[])
Au sein de cette méthode, créer, à l"aide de l"opérateurnewune instance d"ob-
jet de typePersonne(voir la description de la classePersonneci-dessous)
et appeler sa méthodeafficher().
On rappelle qu"un fichier source java peut contenir au plus une classe publique
et que, si c"est le cas, le nom du fichier doit correspondre (y compris les majus-
cules/minuscules) au nom de la classe publique.b)Créer une classe, nomméePersonne,non publique(sans le mot clépublic
devantclass), contenant2champs :-un champnomde typeString, et-un champagede type primitifint.
Créer un constructeur exhaustif (c.à.d. initialisant tous les champs), de signa-
ture
Personne(String leNom, int lAge)
initialisant les deux champs de la classe àleNometlAge.1
2 Exercices d"introduction orientée objet en Java : personnes, enseignants et étudiants
c)Créer la méthodeafficher()de signature
void afficher()
qui affiche lenomet l"ageau format décrit ci-après. Pour un objet de type
Personnedont la variable d"instancenomvaut"Coupdetrix"et la variable
d"instanceagevaut25, la méthodeafficher()affichera à l"écran :
Nom : Coupdetrix
Age : 25 ansd)Tester ces classes en exécutantPersonneMain.2.Champ de type tableau; test de conformité d"un constructeur exhaustif.a)Ajouter un champ à la classePersonne, de type tableau de réels
double[] comptes;
susceptibles de représenter les divers soldes des comptes en banque de la per-
sonne. Adapter le constructeur exhaustif ainsi que la méthodeafficher()
(qui doit afficher, outre le nom et l"age de la personne les différents éléments
du tableaucomptes. Créer, au sein de la classePersonne, la méthodevoid
diviserParDeux(), qui modifie le tableaucomptesen divisant chaque élé-
ment par deux.b)Afin de tester que le constructeur exhaustif précédent est bien conforme à
ce qu"il doit être, dans la classePersonneMain, créer deux objets de type
Personne, de mêmenom, mêmeageet à partir dumême objetnombres
comportant deux éléments. AppelerdiviserParDeux()sur le premier des
objets de typePersonne. Appeler la méthodeafficher()de ces deux ob-
jets. Le code utilisé sera par exemple le suivant :
int[] mesNombres = new int[2];
mesNombres[0] = 100;
mesNombres[1] = 92;
Personne sage = new Personne("Agecanonix", 80,
mesNombres);
Personne sageBis = new Personne("Agecanonix", 80,
mesNombres);
sage.diviserParDeux();
sage.afficher();
sageBis.afficher();
Si l"affichage est identique pour les deux objets, le présent constructeur exhaus-
tif, ainsi que celui que vous avez réalisé à la question précédente ne sont pas
corrects. Les initialisations des champsnometnombresdoivent alors avoir
été faites avec ce que l"on nomme de la copie superficielle (copie des références
uniquement), alors qu"elles auraient dues être faites avec de la copie profonde
(copie du contenu des objets). Corriger le constructeur exhaustif si nécessaire.3.Constructeurs par défautetde recopie.
Par souci de simplicité, le champcomptesprécédent ne sera pas conservé. Son seul
but était de faire prendre conscience de la nécessité des copies profondes au sein des
constructeurs. Nous reprendrons également le constructeur exhaustif et la méthode
afficher()de la première question.a)Au sein de la classePersonne, créer un constructeur par défaut, de signature
Personne()
appelant le constructeur exhaustif de la question précédente au moyen du mot
cléthis(voir l"utilisation dethis(...)comme appel de constructeur) et
Exercice 2 - Classes Enseignants et étudiants (Héritage) 3initialisant respectivement les champsnometageà"Asterix"et30. Si
l"évocation du mot cléthiscomme appel de constructeur ne vous semble pas
parfaitement claire, reportez vous au polycopié, au chapitre des bases orien-
tée objet de java, section "Classes, instance d"objet, héritage", sous section
"constructeurs".b)Créer un constructeur de recopie, de signature
Personne(Personne p)
qui initialise les champs de la classe à ceux dep.c)Modifier la méthodemain()dePersonneMainen crééant3personnes, l"une
à l"aide du constructeur exhaustif, une autre avec le constructeur par défaut
et la dernière avec le contructeur de recopie. Les afficher toutes les trois en
appelant la méthodeafficher().
Exercice 2 Classes Enseignants et étudiants (Héritage)1.ClassesEnseignantetEtudiant.a)Créer une classeEnseignanthéritant dePersonneet ayant deux champs :-Un champnbHeuresCours, de type primitifint,-Un champgrincheux, de type primitifboolean.
Créer un constructeur exhaustif appelant le constructeur de la classe mère (celui
dePersonne) parsuper(cet appel doit être la première ligne du constructeur
d"Enseignant), puis initialisant ses champs propres (nbHeuresCourset
grincheux).b)Créer de même une classeEtudianthéritant dePersonneet ayant deux
champs :-Un champnoteMoyenne, de type primitifint,-Un champfaineant, de type primitifboolean.
Créer un constructeur exhaustif appelant le constructeur de la classe mère (celui
dePersonne) parsuper(cet appel doit être la première ligne du construc-
teur d"Etudiant), puis initialisant ses champs propres (noteMoyenneet
faineant).c)Créer une classeProfEleveMainne comportant pas de champ et comportant
une unique méthodemain(). Au sein de cette méthode, créer une instance
d"objet de typePersonne, denomégal à"Nimbus"et d"ageégal à45.
Créer unEnseignant, de mêmenometage, ayantnbHeuresCourségal à
50etgrincheuxmis àtrue.
Créer unEtudiantde nom"Soupaloigonycrouton", d"ageégal à20,
ayant2commenoteMoyenneetfaineantmis àtrue.
Appeler la méthodeafficher()(qui est héritée dePersonne) de ces trois
instances. On constate que les deux premières instances ont des affichages in-
distinguables.2.Différentiation par le type.
a)Créer un tableau de5éléments de typePersonnedans la méthodemain()
de la classeProfEleveMain; initialiser ce tableau avec2instances d"objet
de typeEnseignantet3instances de typeEtudiant. Effectuer une boucle
forsur les éléments du tableau; dans le corps de la boucle, effectuer un appel
4 Exercices d"introduction orientée objet en Java : personnes, enseignants et étudiants
à la méthodeafficher(), puis afficher s"il s"agit d"unEtudiantou d"un
Enseignanten se servant de l"opérateurinstanceof.
Exercice 3 Différents affichages (Surcharge et redéfinition)1.Surcharge delaméthodeafficher().
Dans la classePersonne, créer une méthodeafficher(), de signature
void afficher(boolean compact)
qui affiche selon l"un des formats suivants. Sicompactest égal àfalse, l"affichage
est le même que celui de signaturevoid afficher()(la méthode de même nom
décrite en question1cde l"Exercice 1). Sicompactest égal àtrue, l"affichage d"un
objet denomégal àCoupdetrixet d"ageégal à25sera de la forme
[Coupdetrix, 25]2.Redéfinition delaméthodeafficher().
Créer, au sein de la classeEnseignant(resp. au sein de la classeEtudiant) une
méthode de signaturevoid afficher()qui appelle la méthodeafficher()de
Personne(au moyen desuper) puis qui affiche la chaîne"Enseignant"(resp.
"Etudiant").3.Modifier la méthodemain()deProfEleveMainélaborée dans la question précé-
dente en ne conservant, dans le corps de la bouclefor, qu"un appel à la méthode
afficher()sur les cinq éléments du tableau.
Exercice 4 Délégation d"affichage (Classes abstraites)
Supposons que la classePersonnefasse partie d"une biliothèque que vous distri-
buez et que vous vouliez obliger les programmeurs qui conçoivent des classes héritant de
Personne(tellesEnseignantetEtudiant) à munir ces dernières de certaines mé-
thodes.1.Rendre la classePersonneabstraite (par le mot cléabstractdevantclass).2.Déclarer une méthode abstraite, ne retournant rien (c"est-à-direvoid), sans argu-
ments, nomméeafficherType().3.La méthodeafficher()dePersonneva affectuer l"affichage décrit en question1cde l"Exercice 1, puis va faire appel àafficherType().4.Les classesEnseignantetEtudianthéritent de la classe abstraitePersonne
et ne sont pas abstraites. Leur constructeur doit donc faire appel à la méthode
createPersonne()(puisqu"il n"y a plus de constructeur dePersonne).
La méthodeafficherType()dans la classeEnseignant(resp. dans la classe
Etudiant) n"effectue qu"une chose : afficher la chaîneEnseignant(resp. la chaîne
Etudiant).5.Adapter les classesEnseignantetEtudiant.
De cette manière, toute classe héritant dePersonnedoit nécessairement implanter la mé-
thodeafficherType(). L"affichage estdéléguéaux sous types concrets dePersonne.