S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
JAVA Programmation Orientée Objet L’essentiel
S. ELYAHYAOUI, Ingénieur études & développement Octobre 2011
Page 1 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Préface Ce document s’adresse aux étudiants en informatique qui souhaitent débuter en langage Java, et qui ont une certaine formation de base en langage C et en analyse & conception UML. Ce tutoriel n’est qu’un support de cours, il ne s’agit pas d’un cours complet et exhaustif, il est donc recommandé de compléter la formation sur d’autres sources de documentation. L'étudiant y trouvera cependant une base assez ferme pour pouvoir travailler la plupart du temps seul.
Page 2 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet SOMMAIRE Page
A- L’environnement de développement Java B- Syntaxe du langage Java 1) 1ier programme 2) Les types de variables primitifs & constantes 3) Les types références 4) Opérateurs arithmétiques & relationnels 5) Afficher / lire des données 6) Les instructions conditionnelles 7) Les instructions itératives 8) Les tableaux C- Principes orientés objet 1) Notions de Classes 2) Notions d’objets 3) Les attributs 4) Les méthodes 5) Passage de paramètres à une méthode 6) Notions de packages 7) L’encapsulation, les modificateurs de visibilité 8) Les attributs & méthodes de classe 9) Le constructeur 10) L’instanciation & l’opérateur « new » 11) L’affectation d’objets 12) Les opérateurs « . » et « this » 13) L’Héritage 14) Les Interfaces & la notion d’Implémentation 15) Le polymorphisme D- Concepts avancés 1) Le « garbage collector » 2) Les objets « wrappers » 3) Manipulation des chaînes de caractères 4) Les collections d’objets 5) La gestion des Exceptions 6) Les entrées / sorties & la Sérialisation 7) JDBC : Java & les bases de données
Page 3 sur 94
4 10
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
A- L’environnement de développement Java Avant de pouvoir commencer à écrire des programmes en Java, le développeur à besoin d’installer premièrement le JDK (Java Developpement Kit), c’est un pack contenant un ensemble de programmes nécessaires pour programmer en Java comme le compilateur Java, etc. Deuxièmement, un IDE (Integrated Developpement Environnement), c’est l’application dans laquelle le programmeur pourra créer ses propres programmes. Ce tutoriel utilise le JDK 6, téléchargeable gratuitement sur la page suivante : http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u27-download440405.html, et comme IDE, Eclipse 3.4 (nom de code : ganymede), téléchargeable aussi gratuitement sur la page suivante : http://www.eclipse.org/downloads/packages/eclipseclassic-342/ganymedesr2 Pour un meilleur accompagnement de l’étudiant, il est recommandé d’avoir aussi la « documentation Java » (javadoc), qu’on peut télécharger sur la page suivante : http://oss.org.cn/ossdocs/java/se/jdk6/docs a- Installation du JDK Une fois le JDK téléchargé sur la page indiquée avant, l’installation se déroule facilement. Double cliquez sur le fichier téléchargé. L’assistant d’installation du JDK se lance. L’écran suivant apparaît.
Page 4 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Cliquez sur le bouton ’Next’. L’écran suivant apparaît.
Cliquez sur ’Next’. L’installation se poursuit avec l’écran suivant :
Vous verrez ensuite l’écran suivant : Page 5 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Vous arrivez à l’écran de fin d’installation, qui vous précise que l’installation s’est bien déroulée.
Page 6 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
b- Installation d’Eclipse Eclipse est un logiciel qui ne s’installe pas, on doit juste décompresser le contenu du fichier .rar qu’on a téléchargé dans le dossier voulu, c:\ECLIPSE par ex. Une fois que cela sera fait, on lance Eclipse pour la 1ière fois, il proposera donc une fenêtre pour choisir le dossier « workspace », c’est le dossier destiné à contenir tous les projets qu’on créera avec Eclipse.
On choisit un dossier dans l’arborescence en cliquant sur ‘browse’, et on accède à la page de démarrage d’Eclipse :
Page 7 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
c- Installation de la javadoc Après avoir téléchargé la documentation Java sur la page indiquée précédemment (voir page 4), décompresser le fichier téléchargé dans un dossier sur le disque dur, ouvrir Eclipse, et aller au menu ‘Window – Preferences’
Dans l’écran qui suit sélectionner les options suivantes :
Page 8 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Vous aurez ensuite la boîte de dialogue suivante, effectuez les sélections indiquées :
Vous aurez une nouvelle boîte de dialogue, dans la zone de texte, coller le chemin du dossier ‘api’ de l’arborescence que vous avez décompressée auparavant, et cliquez sur OK
Page 9 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
B- Syntaxe du langage Java 1) Un premier programme en Java Pour programmer sous Eclipse, il faut créer un projet, chaque projet est loger dans le workspace d’Eclipse dans un dossier portant le même nom, c’est ce dossier qui contiendra tout le contenu du projet. Choisir le menu File – New – Java Project
La fenêtre suivante vous proposera donc de nommer votre projet :
Page 10 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Vous donnez et validez le nom du projet, une autre fenêtre de confirmation s’ouvrira :
Cliquez sur finish, et votre projet est créé, à présent il vous faut écrire votre 1ier fichier source en Java.
Page 11 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
En Java, rien ne se programme en dehors d’une « Classe » (chap. C : Principes orienté objet). Donc pour créer une 1ière classe, un click avec le bouton droit de la souris sur le dossier « src » (dossier qui contiendra tout le code source) nous donnera le menu suivant, choisir l’élément New – Class
Nommer ensuite la classe et valider (par convention en Java, le nom d’une classe commence toujours par une majuscule)
Vous aurez la page de saisie du code source. Tapez donc l’exemple suivant :
Page 12 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple1 :
Enregistrez et cliquez ensuite sur le bouton d’exécution :
Choisissez ensuite l’option d’exécution : Java Application
Le résultat d’exécution est visible dans la vue console :
Page 13 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Commentaires sur ce 1ier exemple : La ligne import java.util.Date; sert à « importer » la classe Date, qui se trouve dans le « package » (chap.C) java.util. Le fait d’importer une classe est nécessaire si l’on compte l’utiliser dans son programme. Toute la bibliothèque de classes Java est organisée dans un système de packages. La fonction main est obligatoire, c’est le point de départ de l’exécution de tout le projet, et c’est elle qui sera exécutée par la machine virtuelle de Java lors de l’exécution du programme. L’instruction Date d = new Date(); crée et initialise un nouvel « objet » (chap.C) nommé d, de type Date. SimpleDateFormt est une classe qui sert à formater une date selon le format et les paramètres linguistiques voulus. L’instruction System.out.println(…); sert à imprimer du contenu à l’écran (chap. B, Afficher & lire des données). Chaque instruction se termine obligatoirement par un « ; »
Page 14 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
2) Les types primitifs & constantes Les types de base en Java, ou types primitifs, ou types simples, sont pratiquement les mêmes qu’en langage C : char : 16 bits (caractère) short : 16 bits (entier signé) int : 32 bits (entier signé) long : 64 bits (entier signé) float : 32 bits (réel) double : 64 bits (réel) byte : 8 bits (entier signé) boolean : 1 bit (true / false) Le nom d’une variable simple ne doit pas contenir d’espaces, ne doit pas commencer par un symbole (sauf le symbole _ ou $), et ne doit pas être un mot réservé de Java. Liste des mots réservés de Java :
Page 15 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
La déclaration et l’initialisation se font de la même manière qu’en langage C, sauf pour le cas où une valeur numérique est affectée à un type dont la taille est inférieure, dans ce cas il s’agit d’une erreur de compilation Les réels sont par défaut des « double », sauf s’ils sont suivis d’un ‘f’ ou ‘F’ pour indiquer qu’il s’agit d’un « float » Les valeurs numériques sont initialisées par défaut à 0, les caractères par le caractère nul (‘\0’), et les booléens à false. Les constantes sont déclarées avec le mot clef final, leur contenu ne peut pas être modifié.
Exemple2 : int a = 5; int x = a - 15; int n1, n2; int n3 = 100, n4 = -2; short b = (short) a; //cast pour éviter une erreur de compilation float y = 5.06F; double z = 0.23; boolean test = (y >= z); char s = 'A'; char p = '*'; final int k = 15; k = 16; // erreur de compilation
Remarque : En Java le type String (chaîne de caractères) est un type référence et non un type simple. 3) Les types références Les types références sont les types prédéfinis de Java (String, Jtable, ArrayList, …), les types créés par le programmeur, et les tableaux (chap. B, Les tableaux de variables). Pour les types simples, la zone mémoire allouée contient la valeur associée au nom de la variable, tandis que pour les types références ou objets (chap. C, Principes orientés objets), cette zone mémoire contient l’adresse (en hexadécimal) de l’endroit où sont stockés les champs de cet objet. (En Java les objets et les tableaux sont des types références) Les références seront traitées en détails dans les parties « chap. B, Les tableaux de variables » & « chap. C, Principes orientés objets »
Page 16 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
4) Opérateurs arithmétiques, relationnels, logiques & d’affectation Les opérateurs arithmétiques : effectuent des calculs mathématiques sur des variables numériques Opérateur +/* / % ++ / --
Signification Addition / Soustraction Multiplication Division Modulo (reste de la division) Incrémentation / Décrémentation
Priorité 5 4 4 4 1
L’opérateur ++ fonctionne de la manière suivante (idem pour l’opérateur --) : Si l’opérateur figure après le nom de la variable (ex. i++), le contenu de la variable est augmenté de 1 après le fait de donner le résultat. (C.à.d. résultat = valeur de la variable avant l’opération). Si l’opérateur figure avant le nom de la variable (ex. ++i), le contenu de la variable est augmenté de 1 avant de donner le résultat. (C.à.d. résultat = valeur de la variable après l’opération). Exemple2 :
Page 17 sur 94
S.ELYAHYAOUI
Les opérateurs relationnels : Opérateur </> <= / >= == !=
JAVA - Programmation Orientée Objet
Signification Inférieur / Supérieur Inférieur ou égal / Supérieur ou égal Egale Différent
Priorité 7 7 8 8
Les opérateurs logiques : rassemblent des expressions booléennes (vrai/faux) pour exprimer des conditions Opérateur ! & ^ | && ||
Signification Le « NON » Le « ET » Le « XOR » Le « OU » Le « ET » conditionnel, n’évalue le second booléen que si le premier est « true » Le « OU » conditionnel, n’évalue le second booléen que si le premier est « false »
Priorité 2 9 10 11 12 13
Exemple3 :
Les opérateurs d’affectation : Opérateur = += -= *= /=
Page 18 sur 94
Signification « Reçoit », affecte la valeur de droite à la variable de gauche Ajoute la valeur de droite à la variable de gauche Soustrait la valeur de droite de la variable de gauche Multiplie la variable de gauche par la valeur de droite Divise la variable de gauche par la valeur de droite
Priorité 15 15 15 15 15
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple4 :
5) Afficher & lire des données Comme on le remarque dans les exemples précédents, l’instruction System.out.println(…) sert à afficher toutes sortes de données (numériques, chaînes de caractères, …), tout en passant à la ligne suivante. System : cette classe utilitaire permet, entre autres, d'utiliser l'entrée standard (le clavier) et la sortie standard (l’écran). out : objet de type PrintStream, et attribut de la classe System, cet attribut gère la sortie standard. println : méthode de l’objet out qui écrit dans la console les informations passées en paramètre (chaînes de caractères, nombres, …) print : idem que println, sans retour à la ligne. Pour faire une concaténation entre des chaînes de caractères, ou entre chaînes et variables, on utilise l’opérateur « + » Pour lire des données depuis le clavier, c’est une autre histoire, c’est un peut plus complexe et il y a plusieurs façons de le faire, la plus simple est d’utiliser la classe Scanner, qui se trouve dans le package java.util, et l’attribut in de la classe System, qui est un objet de type InputStream. (les notions de classes, d’attributs et de méthodes seront détaillées dans le chapitre C : Principes Orientés Objet)
Page 19 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple5 :
Exercices Exercice 1 Quels sont les résultats d’affichage du code suivant: int i, j, n; i = 0; n = i++; System.out.println("A : i = " + i + "
n = " + n);
i = 10; n = ++i; System.out.println("B : i = " + i + "
n = " + n);
i = 20; j = 5; n = i++ * ++j; System.out.println("C : i = " + i + "
j = " + j + "
i = 15 ; n = i+= 3; System.out.println("D : i = " + i + "
n = " + n);
i = 3; j = 5; n = i*= --j; System.out.println("E : i = " + i + "
j = " + j + "
Page 20 sur 94
n = " + n);
n = " + n);
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercice 2 Ecrire un programme qui lit 2 variables numériques x et y, et qui échange leurs valeurs Exercice 3 Un élève a passé un examen de 2 matières à coefficients C1 et C2 entiers. Connaissant les notes obtenues par cet élève dans chaque matière N1 et N2, calculer et afficher sa moyenne d’examen M.
6) Les instructions conditionnelles Les instructions conditionnelles sont des instructions dont l’exécution dépend de tests, effectués par des « structures conditionnelles » ou « alternatives », il s’agit des mêmes qu’en langage C, le « if/else », le « switch », et l’opérateur ternaire « ? : »
La structure if – else
if(conditions){ instructions }
-
Ou bien
if(conditions){ instructions }else{ autres instructions }
Les conditions peuvent être un booléen, ou une combinaison de booléens par le biais d’opérateurs logiques (&, |, …. Tableau, page 20) Les instructions peuvent être soit des instructions normales, soit des instructions conditionnelles, ou itératives. Si les accolades ne contiennent qu’une seule instruction, alors elles ne sont pas obligatoires. Sans les accolades, uniquement la 1ière instruction est concernée par le if ou le else, les autres seront exécutées normalement.
Exemple6 : int i; System.out.print("tapez un entier"); Scanner scn = new Scanner(System.in); i = scn.nextInt(); if(i > 0) System.out.print("positif"); else{ if(i < 0) System.out.print("négatif"); else System.out.print("null"); }
Page 21 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
La structure switch Supposons qu’on veut tester si la valeur d’une variable X est l’une des valeurs suivantes 0, 2,4 ou 8, ou si elle ne correspond à aucune de ces valeurs. Si on utilise la structure if, cela donnera le code suivant : if(x==0) instruction1 else if(x==2) instruction2 else if(x==4) instruction3 else if(x==8) instruction4 else instruction
Le switch permet d'avoir une écriture beaucoup plus simplifiée et nettement plus lisible qu'une pile de if /else : switch(x) { case 0: case 2: case 4: case 8: default }
Page 22 sur 94
instruction1 instruction2 instruction3 instruction4 : instruction
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple7 : System.out.println("tapez un jour (entier)"); Scanner sc = new Scanner(System.in); int jour = sc.nextInt(); switch(jour){ case 1: System.out.println("lundi"); break; case 2: System.out.println("mardi"); break; case 3: System.out.println("mercredi"); break; case 4: System.out.println("jeudi"); break; case 5: System.out.println("vendredi"); break; case 6: System.out.println("samedi"); break; case 7: System.out.println("dimanche"); break; default: System.out.println("jour incorrect"); }
-
-
L’instruction break sert à sortir du switch en ignorant les « cases » suivants Le block default est exécuté si la valeur de jour ne correspond à aucune des valeurs testées dans les « cases » du switch. La variable utilisée dans le switch doit impérativement être de type int ou compatible. Les « cases » qui contiennent le même traitement peuvent être regroupés.
L’opérateur « ? : »
-
Opérateur utilisé pour des affectations conditionnelles. Sa forme générale est : if(conditions){ instruction1 }else{ Instruction2 }
condition ? instruction1 : instruction2
Exemple8 : int i = (n > 5) ? n : 5; // si n est > 5 alors i reçoit n, sinon reçoit 5
Page 23 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 4 Un patron décide de calculer le montant de sa participation au prix du repas de ses employés de la façon suivante : o Si le salarié est célibataire participation de 20% o S’il est marié participation de 25% o S’il a des enfants participation de 10% supplémentaires par enfant o Si le salaire mensuel est inférieur à 5000 DH la participation est majorée de 10% o La participation est plafonnée à 50% Ecrire le programme qui lit les informations au clavier et affiche le montant de la participation à laquelle aura droit le salarié Exercice 5 Résoudre dans C l’équation de 2ième degré aX2 + bX + c = 0 a, b et c seront lus au clavier Exercice 6 Ecrire le programme qui lit le nombre d’enfant d’un couple, et qui affiche le montant de l’allocation familiale de cette manière : Si la famille ne contient pas d’enfants, aucune allocation Entre 1 et 3 enfants, le couple reçoit une allocation de 150DH Entre 4 et 6, le couple reçoit une allocation de 250DH Pour plus de 7 enfants, le couple reçoit une allocation de 350DH Exercice 7 Écrire le programme qui affiche le signe du produit de deux nombres A et B sans faire le calcule du produit Exercice 8 Ecrire le programme qui calcule le salaire brut d’un ouvrier connaissant le nombre d’heures nbr_h et le tarif horaire tarif_h, sachant que les heures supplémentaires (au delà de 172 heures) sont payées 50% en plus du tarif normal
Page 24 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
7) Les instructions itératives Les instructions itératives sont des instructions qui doivent être répétées un certain nombre de fois, ou jusqu’à ce qu’une condition soit réalisée. Pour cette fin on utilise des structures appelées souvent « boucles »
La boucle while o Forme générale while (condition booléenne) { instructions à répéter } o Définition La boucle while teste la condition booléenne avant d’exécuter les instructions de la boucle, tant qu’elle est true, les instructions seront toujours répétées, si la condition booléenne devient false, on arrête la répétition et sort de la boucle. Exemple9 : On se propose d’écrire un programme qui produit l’affichage suivant :
Les chiffres de dizaines entre 10 et 100 sont imprimés à l’écran, séparés par des tabulations (une tabulation correspond au caractère \t) En utilisant la boucle while : public class Test { public static void main(String[] args) { int x = 10; while(x <= 100){ System.out.print(x + "\t"); x += 10;
// instruction 1 // instruction 2
} } }
Remarque ! Si la boucle ne contient qu’une seule instruction, alors les accolades ne sont pas obligatoires. Mais si la boucle contient plusieurs instructions, comme c’est le cas pour l’exemple précédent, alors les accolades deviennent obligatoires, sinon c’est uniquement la 1ière instruction qui sera concernée par la boucle, les autres ne seront pas répétées. Exemple10 : On se propose cette fois-ci de réécrire le programme précédent de manière à ne pas utiliser les accolades de la boucle while, il faudra donc remplacer les 2 instructions de la boucle par une seule. C.à.d. afficher et incrémenter X en même temps.
Page 25 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
public class Test { public static void main(String[] args) { int x = 0; while(x <= 90) System.out.print((x += 10) + "\t"); } }
La boucle do – while o Forme générale do { instructions à répéter } while (condition booléenne); o Définition La boucle do – while a le même comportement que la boucle while, sauf que la condition booléenne n’est pas testée au début de la boucle mais à la fin. Ceci veut dire que les instructions seront exécutées au moins une 1ière fois, même si la condition est false. Exemple11 : Refaire l’exemple 9 avec la boucle do – while public class Test { public static void main(String[] args) { int x = 10; do{ System.out.print(x + "\t"); x += 10; }while(x <= 100); } }
Exemple12 :
Page 26 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
On remarque que les instructions de la boucle sont exécutées une 1ière fois, même si la condition (x <= 100) est false.
La boucle for Cette boucle est utilisable uniquement quand on utilise un compteur d’itérations dont on connait les valeurs initiale et finale. o Forme générale for (valeur initiale ; valeur finale ; incrémentation) { instructions à répéter } o Définition Les instructions de la boucle seront répétées pour toutes les valeurs qui se trouvent entre la valeur initiale et la valeur finale du compteur. Exemple13 : Refaire l’exemple 9 avec la boucle for public class Test { public static void main(String[] args) { for(int x = 10; x <= 100; x += 10) System.out.print(x + "\t"); } }
Exemple14 : Refaire le même affichage mais dans le sens inverse :
On remarque ici que : - Valeur initiale : 100 - Valeur finale : 10 - Le compteur est décrémenté de 10 à chaque itération public class Test { public static void main(String[] args) { int x; for(x = 100; x >= 10; x -= 10) System.out.print(x + "\t"); } }
Page 27 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 9 Écrire un programme qui lit un entier N et calcule et affiche la somme suivante : 1 + 1/2 + 1/3 + … + 1/N Exercice 10 Écrire un programme qui lit un entier N et qui affiche la ligne suivante : N N-1 N-2 … 3 2 1 <> 1 2 3 … N-2 N-1 N Exercice 11 Écrire un programme qui lit un entier N et calcule et affiche son factoriel (N! = N * (N-1) * (N-2) * … * 3 * 2 * 1) Exercice 12 Écrire un programme qui lit 2 entiers X1, puis X2, et qui calcule la somme des entiers compris entre X1 et X2. (La valeur de X1 doit être inférieure à celle de X2, sinon on les échange) Exercice 13 Écrire un programme qui lit un entier N et qui affiche les entiers de 1 à N, 5 par 5, séparés par des tabulations : 1 2 3 4 5 6 7 8 9 10 … Indication : pour l’affichage utiliser l’opérateur modulo (%) Exercice 14 Écrire un programme qui lit un entier N et calcule et affiche la somme suivante : 1 + 1/2 - 1/3 + 1/4 - 1/5 + … + 1/N Boucles imbriquées Exercice 15 Écrire un programme qui lit un entier N et qui produit l’affichage suivant (en escaliers) : 1 2 3 4 ……… N
Page 28 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercice 16 Ecrire un algorithme qui lit un entier N et qui affiche un carré d’étoiles : **** **** **** … ****
…* …* …*
N lignes
…*
N étoiles Exercice 17 Ecrire un algorithme qui lit un entier N et qui affiche un triangle d’étoiles de N lignes, la dernière ligne contient N étoiles : * ** *** Exercice 18 Ecrire un algorithme qui lit un entier N et qui affiche un triangle d’étoiles de N lignes, la dernière ligne contient N étoiles : *** ** *
Page 29 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
8) Les tableaux de variables a- Les tableaux de dimension 1 Un tableau est aussi une variable, mais en Java, il a les spécificités suivantes : Il est considéré comme une référence et non pas une variable simple (voir 3 - Les types références) Il peut contenir plusieurs valeurs selon sa taille, et ces valeurs doivent être du même type. (tableau d’entiers, de réels, de chaînes de caractères, …) L’indexation des éléments d’un tableau de taille n commence par 0, puis, 1, …, le dernier élément a l’indice n-1 indices: 0 1 2 … n-1 …
Déclaration du tableau : la déclaration d’un tableau de dimension 1 se fait comme pour une simple variable mais avec des crochets [ ]
Exemple 15 : Déclaration de 2 tableaux de types int et float int[] x; // déclaration d’un tableau d’entiers float y[]; // déclaration d’un tableau de réels
Lors de la déclaration du tableau, la taille ne doit pas être spécifiée (sinon erreur de compilation) car l’allocation de l’espace mémoire qu’occupera le tableau ne se fera pas lors de la déclaration, mais lors de l’initialisation. Initialisation du tableau : l’initialisation du tableau se fait soit par l’opérateur new, soit par affectation directe de la liste des éléments du tableau. o Initialisation par l’opérateur new
// déclaration int[] x; // initialisation x = new int[3]; // remplissage x[0] = 15; x[2] = 5; x[1] = -24;
15
// déclaration & initialisation float y[] = new float[2]; // remplissage y[0] = 1.05F; y[1] = y[0] * 10;
1.05F
// déclaration & initialisation char c[] = new char[3]; // remplissage c[0] = 'A'; c[1] = 'a'; c[2] = '*';
5
10.5
'A' 'a' '*'
o Initialisation par affectation int[] x = {15, -24, 5}; float y[] = {1.05F, (float)(1.05 * 10)}; char c[] = {'A', 'a', '*'};
Page 30 sur 94
-24
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Remarque : Une déclaration, suivie d’une initialisation par affectation est une erreur de compilation int[] x; x = {15, -24, 5}; // erreur de compilation
Exemples : Exemple 16 : Lire les éléments d’un tableau d’entiers de taille 5 depuis le clavier int i; int t[] = new int[5]; Scanner sc = new Scanner(System.in); for(i = 0 ; i <= 4 ; i += 1){ System.out.println("tapez un entier"); t[i] = sc.nextInt(); }
Exemple 17 : Déclarer & remplir un tableau nommé B qui contiendra 5 réels, le dernier sera la moyenne des 4 autres double B[0] = B[1] = B[2] = B[3] = B[4] =
B[] = new double[5]; 1251.05556; 0.25; 10; -10; (B[0] + B[1] + B[2] + B[3]) / 4;
Exemple 18 : Lire les éléments d’un tableau de chaînes de caractères de taille 4 depuis le clavier, et afficher ces éléments sur une seule ligne rattachés par des tirets
Page 31 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 19 Écrire un programme qui demande à l'utilisateur de saisir les notes d’examen de 10 élèves, qui seront stockées dans le tableau notes. Le programme doit afficher le nombre d'élèves qui ont la moyenne Exercice 20 Soit une suite numérique définie comme ceci : Un = (Un-1)² - 5, avec U0 = 3. Calculer et afficher la somme des 10 premiers termes de cette suite. Exercice 21 Ecrire un programme qui demande à l'utilisateur de saisir 10 entiers qui seront stockés dans un tableau T_ENTIER. Le programme doit ensuite afficher la valeur du plus grand élément de ce tableau Indication : stocker le 1ier élément dans une variable plusGrand, comparer ensuite tous les autres éléments un par un avec plusGrand, chaque fois qu’un élément est supérieur à plusGrand, plusGrand devient cet élément là. Exercice 22 Lire les éléments d’un tableau de chaînes de caractères de taille 4 depuis le clavier, et afficher ensuite celle qui contient le plus de caractères Indication : s’inspirer de l’exercice 21 et utiliser la méthode length() de la classe String Exercice 23 Ecrire un programme qui lit les valeurs de 2 tableaux de chiffres A et B de tailles N et M lues au clavier, et qui regroupe les éléments de A et B dans un tableau C. Afficher ensuite les éléments de C à la manière de l’exemple 18. Exemple :
Page 32 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercice 24 Ecrire un programme qui demande à l’utilisateur de taper 5 entiers qui seront stockés dans un tableau T. Le programme doit trier le tableau par ordre croissant et ensuite l’afficher les éléments du tableau. Indication (algorithme de tri « bulle »): On parcourt le tableau en comparant T[0] et T[1] et en échangeant ces éléments s'ils ne sont pas dans le bon ordre. on recommence le processus en comparant T[1] et T[2],... et ainsi de suite jusqu'à T[3] et T[4]. Lors de chaque itération, on compte le nombre d'échanges effectués. On fait autant d’itérations que nécessaire jusqu'à ce que le nombre d'échanges soit 0 : le tableau sera alors trié. Exercice 25 Ecrire un programme qui demande à l’utilisateur de taper 5 chiffres qui seront stockés dans un tableau T, le programme doit remplir un autre tableau R avec les éléments de T mais à l’envers. Afficher ensuite les éléments de R. Exemple : 11
2
0
45.258
1
T
1
45.258
0
2
11
R
Exercice 26 Ecrire un programme qui lit une chaîne de caractères S et qui teste si oui ou non cette chaine est un palindrome. Indications : - Un palindrome est une chaîne de caractères qui se lit de la même manière aussi bien de droite à gauche que de gauche à droite. Ex. "kayak", "OTO", … - Transférer les caractères de S dans un tableau de caractères T en utilisant la méthode toCharArray de la classe String - Créer un autre tableau R et s’inspirer de l’exercice précédent pour chercher si S est un palindrome. - La taille d’un tableau est indiquée par l’attribut de tableaux length Exercice 27 Ecrire un programme qui lit les éléments des tableaux d’entiers V1 et V2 de même taille N qui sera lue au clavier, et qui stocke les sommes des éléments de V1 et V2 dans un autre tableau V3 :
Afficher ensuite les éléments de V3
Page 33 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercice 28 Ecrire un programme qui lit une chaine de caractères et qui la stocke dans un tableau de caractères, parcourir ensuite les caractères de cette chaîne pour afficher le nombre d’espaces qu’elle contient. Indication : la taille d’un tableau est indiquée par l’attribut de tableaux length Exercice 29 En utilisant une boucle, remplir un tableau d’entiers par les 10 1ières puissances de 2 (2, 4, 8, 16, 32, …, 1024). Afficher ensuite les éléments du tableau séparés par des tabulations 2 4 8 16 32 64 128 256 512 1024 Exercice 30 Refaire l’exercice précédent avec l’affichage suivant : 2 4 8 16 32 64 128 256 512 1024
Page 34 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
b- Les tableaux de dimension 2 Un tableau à 2 dimensions, ou matrice, est une grille de cases ou cellules, caractérisée par un nombre de lignes et un nombre de colonnes. Et comme pour les tableaux à dimension 1, l’indexation des lignes et des colonnes commence par 0. Par exemple, une matrice de réels, de 4 lignes et 6 colonnes peut être représentée comme ceci :
La syntaxe de déclaration d’un tableau à dimensions 2 se fait comme pour celle d’un tableau à dimension 1, mais avec 2 paires de crochets, la 1ière pour les lignes, et la 2ième pour les colonnes. Exemple 19 : La déclaration du tableau précédent se fera donc comme ceci double[][] D = new double[4][6];
Les règles de déclaration et d’initialisation sont les mêmes que pour les tableaux à dimension 1. Chaque case est désignée par le numéro de sa ligne et de sa colonne en utilisant les crochets.
Exemple 20 : double[4][6] D; // erreur de compilation final float PI = 3.14F; float t[][] = new float[5][3]; t[0][0] = 12.5; t[1][1] = PI; t[2][2] = 12.5; t[4][1] = 1.02; t[3][0] = t[4][1] + t[0][0];
Page 35 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple 21 : Lire les éléments d’un tableau d’entiers de taille [3][3]. Sans utiliser de boucles, le code ressemblera à ceci : // lecture des éléments de la ligne 0 System.out.print("tapez un entier\t"); t_int[0][0] = scn.nextInt(); System.out.print("tapez un entier\t"); t_int[0][1] = scn.nextInt(); System.out.print("tapez un entier\t"); t_int[0][2] = scn.nextInt(); // lecture des éléments de la ligne 1 System.out.print("tapez un entier\t"); t_int[1][0] = scn.nextInt(); System.out.print("tapez un entier\t"); t_int[1][1] = scn.nextInt(); System.out.print("tapez un entier\t"); t_int[1][2] = scn.nextInt(); // lecture des éléments de la ligne 2 System.out.print("tapez un entier\t"); t_int[2][0] = scn.nextInt(); System.out.print("tapez un entier\t"); t_int[2][1] = scn.nextInt(); System.out.print("tapez un entier\t"); t_int[2][2] = scn.nextInt();
Evidemment, il ne s’agit pas de la meilleure manière de remplir une grille, d’où l’intérêt des boucles dans le traitement des tableaux. On se propose donc de refaire l’exemple précédent avec une boucle. Comme on peut le remarquer, la boucle de parcours des lignes, contient elle-même une autre boucle, celle du parcours des colonnes. Exemple 22 :
Page 36 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple 23 : Affichage des éléments du tableau d’entiers initialisé dans l’exemple précédent
Exemple 24 : Afficher uniquement les éléments de la 1ière diagonale du tableau d’entiers initialisé dans l’exemple précédent, c.à.d. les éléments : 98, 99 et 3, sur la même ligne
Page 37 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 31 Remplir deux matrices M1 et M2 de 2 lignes et 2 colonnes depuis le clavier, et afficher la matrice S qui représente leur somme. Exemple : 1
M1 1
1 1
4
M2 4
4 4
5
S 5
5 5
Exercice 32 Remplir une matrice A comme ceci : 1 2 3 4
1 4 9 16
1 8 27 64
1 16 81 256
1 32 243 1024
5 5 5 5
1ières puissances de 1 1ières puissances de 2 (21, 22, 23, …) 1ières puissances de 3 (31, 32, 33, …) 1ières puissances de 4 (41, 42, 43, …)
Afficher ensuite la moyenne de chaque ligne comme ceci : Moyenne Moyenne Moyenne Moyenne
de de de de
la la la la
ligne ligne ligne ligne
1 2 3 4
: : : :
1.0 12.4 72.6 272.8
Exercice 33 Ecrire un programme qui remplit une matrice M de 3 lignes et 3 colonnes et qui décale les lignes de M d’une position vers le bas. Afficher ensuite M Exemple :
Exercice 34 Ecrire un programme qui lit un entier n, et qui remplit un tableau de caractères de taille [n][n] par des étoiles. Exemple : si l’entier tapé est 3, le tableau sera comme ceci '*' '*' '*' '*' '*' '*' '*' '*' '*'
Afficher ensuite le contenu du tableau à la manière de l’exemple 23
Page 38 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercice 35 Faire de même que dans l’exercice 30, mais le tableau doit être comme ceci (pour l’exemple n = 3): '*' ' ' ' ' '*' '*' ' ' '*' '*' '*'
Exercice 36 Faire de même que dans l’exercice 30, mais le tableau doit être comme ceci (pour l’exemple n = 3): '*' '*' '*' '*' '*' ' ' '*' ' ' ' '
Exercice 37 Faire de même que dans l’exercice 30, mais le tableau doit être comme ceci (pour l’exemple n = 3): '*' '*' '*' ' ' '*' '*' ' ' ' ' '*'
Exercice 38 Ecrire un programme qui lit un entier n et qui affiche le triangle de Pascal d’ordre n de la manière suivante : (utiliser un tableau d’entiers) Tapez 1 1 1 1 2 1 3 1 4 1 5
l’ordre du triangle : 1 3 1 6 4 1 10 10 5
Page 39 sur 94
1
5
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
C- Principes orientés objet 1) Notions de Classes En POO une classe peut être considérée comme une « catégorie », ou une « famille » d’individus (objets, voir paragraphes suivants), qui ont les mêmes propriétés (attributs, voir paragraphes suivants) et les mêmes comportements (méthodes, voir paragraphes suivants). Exemple 25 : Tous les individus de la classe Personne ont les mêmes propriétés : - Nom - Prénom - Adresse - Age - Taille - Poids - … Et les mêmes comportements : - Penser - Parler - Manger - Marcher - …
Tous les individus de la classe Voiture ont les mêmes propriétés : - Marque - Pays - Model - Année - Couleur - Matricule - Energie - … Et les mêmes comportements : - Démarrer - Accélérer - Freiner - …
En Java, une classe est définie en utilisant le mot clef class. Tout le contenu de la classe doit être délimité par des accolades {…} La syntaxe générale de définition d’une classe est celle-ci: class nom_de_la_classe{ } Exemple 26 : class Personne{ // déclaration des attributs & méthodes } // fin de la classe Personne
Un fichier source .java peut contenir la définition de plusieurs classes, mais si l’une d’elles est déclarée avec le modificateur d’accès « public » (voir paragraphe 7), alors le fichier source doit absolument porter le même nom que cette classe, sinon c’est une erreur de compilation
Page 40 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple 27 :
Exemple 28 : On se propose cette fois de déclarer la classe Personne comme étant public, dans un fichier nommé Test.java, ce qui provoquera une erreur de compilation :
On voit ici que Eclipse nous donne les 2 propositions suivantes : soit on renomme le fichier en Personne.java au lieu de Test.java, soit on renomme le type (c.à.d. la classe) en Test au lieu de Personne
Page 41 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
2) Notions d’objets En POO chaque individu d’une classe est appelé Objet ou Instance, et la classe est considérée comme le type de cette objet, ou, la catégorie à laquelle appartient cet objet. Les valeurs des propriétés d’une classe varient d’un objet à un autre. Exemple 29 : Soient les 2 objets v1 et v2 de la classe Voiture : v1
v2 -
Marque : Mercedes Pays : Allemagne Model : C 220 Année : 2000 Couleur : Blanc Matricule : 1-8-445901 Energie: Diesel
-
Marque : LARAKI Pays : Maroc Model : Fulgura Année : 2004 Couleur : Gris argenté Matricule : 1-7-985042 Energie: Essence
3) Les attributs La syntaxe de base de déclaration d’un attribut dans une classe est celle-ci: type nom_de_l’attribut [= valeur_par_defaut]; Exemple 30 : class Personne{ // attributs String nom; String prenom; String adresse; int age; double taille = 1.75; double poids; }
Page 42 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 39 Traduireclass en Java les classes UML suivantes ex31 Module
Etudiant -
numCne: int nom: String prenom: String adresse: String
-
code: int nom: String volumeHoraire: int volHorairePrat: int coefficient: int
4) L’instanciation & l’opérateur « new » Le fait de déclarer un objet, ne signifie pas qu’il a des attributs ou des méthodes, il doit d’abord être « construit » pour pouvoir utiliser ses attributs et méthodes. Pour construire l’objet on appelle le constructeur de la classe, c’est une méthode spéciale qui doit porter le même nom que la classe. On appelle le constructeur en utilisant l’opérateur new. (La notion de constructeur sera détaillée dans le paragraphe 9.) Exemple 31 : class TestPersonne{ public static void main(String[] args){ Personne p1; // déclaration p1 = new Personne(); // construction p1.nom = "ELYAHYAOUI"; p1.adresse = "MAROC"; } }
Remarque : L’appel d’un attribut d’un objet non construit, mène à une erreur de compilation. Exemple 32 :
Page 43 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
5) Les méthodes Comme il a été dit dans le paragraphe 1 (notions de classes), les méthodes d’une classe représentent les comportements communs à tous les objets de cette classe, comme l’action freiner ou démarrer dans l’exemple de la classe Voiture (voir exemple 25). Tout comme les attributs, les méthodes doivent être déclarées toutes à l’intérieur de la classe. La syntaxe de base de déclaration d’une méthode est la suivante : type_de_retour nom_de_la_méthode(signature){ Corps de la méthode }
Type de retour : Le type de la valeur que doit retourner la méthode (int, String, float[], …). Si la méthode ne renvoi rien, on écrit void Si la méthode indique dans sa déclaration un type de retour, int par ex, alors à la fin du corps de la méthode, elle doit retourner une valeur de type entier (sinon c’est une erreur de comilation), par l’instruction : return valeur ; Signature : Nombre & type des arguments que doit prendre la méthode
Exemple 33 :
Les méthodes d’une classe sont utilisées à travers les objets de cette classe, sauf les méthodes « statiques », on n’a pas besoin d’instancier la classe pour les utiliser. (Voir paragraphe 11, Membres statiques) Pour utiliser une méthode d’un objet, on fait simplement l’appel de cette méthode, en utilisant l’opérateur point « . »: nom_de_l’objet.nom_de_la_méthode(arguments);
Page 44 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple 34 :
A
B C
Remarques : Ligne A : Une méthode d’un objet X, a tout à fait le droit d’utiliser ou modifier la valeur d’un attribut du même objet X. Ligne B : On construit l’instance v en utilisant le constructeur par défaut, car la classe Voiture ne contient pas de constructeur. (la notion de constructeur sera détaillée dans les chapitres suivants) L’appel d’une méthode d’un objet non construit, mène à une erreur de compilation. Ligne C : Appel de la méthode démarrer de l’objet v
Page 45 sur 94
S.ELYAHYAOUI Exemple 35 :
Page 46 sur 94
JAVA - Programmation OrientĂŠe Objet
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
6) Passage d’arguments à une méthode a. Passage d’une variable simple à une méthode Soit l’exemple suivant : Exemple 36 :
La méthode annuler de la classe Test, est sensée mettre à zéro tout entier qu’on lui passe en paramètre. Or lors de l’exécution on obtient le résultat suivant :
On voit que la variable a garde sa valeur après l’appel de la méthode annuler. Ceci est dû au fait qu’en Java, les arguments d'une méthode sont toujours passés « par valeur » : c'est à dire que la valeur du paramètre effectif (a) est recopiée dans le paramètre formel correspondant (x). En conclusion, une méthode ne peut pas modifier les paramètres effectifs.
Page 47 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
b. Passage d’un objet à une méthode Essayons à présent de passer un objet en paramètre à une méthode. Soit l’exemple suivant : Une classe Point qui a 2 attributs réels, x et y. (l’abscisse et l’ordonné) Une autre classe Test qui contient la méthode main et une méthode qui prend en paramètre un objet de type Point. Exemple 37 :
Lors de l’exécution on obtient le résultat suivant :
Cette fois-ci, l’objet à été modifié, car en Java le passage d’arguments objets à une méthode se fait « par référence ». Mais là encore, ce n’est pas l'objet lui-même qui est passé à la méthode, mais une copie de la référence sur l’objet. C'est donc la valeur de la référence qui est dupliquée dans le paramètre formel : il n'y a pas construction d'un nouvel objet.
Page 48 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
7) Notions de packages Toute la bibliothèque des classes Java qu’on utilise dans nos programmes (String, Scanner, Integer, Double, …), est répertoriée dans des packages. Par exemple, les classes d’entrées/sorties se trouvent dans le package java.io, la classe Scanner, se trouve elle, dans le package java.util, la classe String dans le package java.lang. Quand un programme utilise l’une des classes prédéfinies dans la bibliothèque Java, il doit contenir l’instruction import nom_du_package.nom_de_la_classe ; importation la classe Scanner
utilisation de la classe Scanner
Cela dit, le programmeur peut créer ses propres packages. D’ailleurs Eclipse déconseille d’utiliser le package par default dans un projet, car c’est une mauvaise pratique. Il est plutôt recommandé d’organiser ses classes dans des packages. 1
2
Page 49 sur 94
S.ELYAHYAOUI 3
4
5
6
Page 50 sur 94
JAVA - Programmation OrientĂŠe Objet
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 40 Réaliser en Java les deux packages ci-dessous
8) L’encapsulation & les modificateurs de visibilité a. L’encapsulation : définition Java est un langage qui respecte scrupuleusement les principes de l’orienté objet. L’encapsulation est l’un des principes fondamentaux de la POO : un objet ne doit pas permettre que ses données et traitements confidentiels soient accessibles depuis l’extérieur (c.à.d. par d’autres méthodes que les siennes). données visibles Objet :
données privées
Uniquement les données qui se trouvent dans la partie visible de l’objet sont accessibles depuis l’extérieur. On se propose d’étudier l’exemple de 2 classes A et B. La classe A a déjà été exposée dans l’exemple 33, la classe B contient la méthode main, qui accède à la méthode m3 d’un objet x de type A. Exemple 38 :
Page 51 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
On voit dans cet exemple que la méthode main dans la classe B utilise la méthode m3 de l’objet x (de type A) pour afficher la longueur de la chaîne "bonjour" (voir définition de la classe A dans l’exemple 33). Cela ne respecte pas le principe d’encapsulation, pour permettre à la classe A de rendre ses données « privées », et ne montrer que la partie qu’elle souhaite laisser « publique », on doit ajouter des modificateurs de visibilité lors de la déclaration des attributs de A. b. Les modificateurs de visibilité En Java, il existe quatre catégories d'autorisations d'accès, spécifiées par les modificateurs suivants : Public : si une classe déclare un attribut « public », il devient accessible pour n’importe quelle autre classe dans le projet. Certains éléments doivent être déclarés publics. Par ex. : o Un fichier source .java peut contenir plusieurs classes, mais pour qu’il puisse être exécuté, la classe qui comporte la définition de la méthode main doit être publique.
exécution impossible
o Pour permettre à une classe X de pouvoir construire des objets de type Y, le constructeur de la classe Y doit être déclaré public. Si on essaie de construire un objet d’une classe dont le constructeur n’est pas public, cela mène à une erreur de compilation Private : ce niveau d’autorisation est le plus restrictif, il ne permet l’accès à un attribut ou une méthode privés d’une classe qu’à cette classe elle-même. Protected : si une classe X déclare un attribut ou une méthode protégés, alors ils seront accessibles pour les classes du même package que la classe X, et aux classes filles de la classe X (voir la notion d’héritage dans les paragraphes suivants). Si l’attribut ou la méthode sont déclarés sans modificateurs d’accès, alors il s’agit du niveau d’autorisation « package ». C’est le niveau d’autorisation par défaut en Java. Cela signifie que l’élément est accessible pour les classes qui sont dans le même package.
Page 52 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple 39 : Soient les packages suivants :
Réaliser ces packages en Java sachant que les attributs des classes sont décrits comme suit : Module : o nom, coefficient : protégés o volumeHoraire : privé Prof : o nom, prénom, numTel, salaire, nbrHeuresParSemaine : privés Classe : o nom, niveau, nbrGroupes : publiques Etudiant : o nom, prénom, cne : publiques o adresse : privé GestionEcole : o la méthode main
Page 53 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
c. getters & setters (les accesseurs) Les attributs privés d’une classe A sont donc invisibles pour les autres classes. Les « accesseurs » sont des méthodes qui permettent à la classe A de donner le droit aux autres classes d’accéder à ses attributs (en lecture et en écriture), tout en contrôlant cet accès. Les getters permettent aux autres classes de consulter la valeur des attributs privés d’une classe. Les setters permettent aux autres classes de modifier la valeur des attributs privés d’une classe. Syntaxe de déclaration des getters : public type_de_l’attribut getXXX(){ return nom_de_l’attribut ; } Syntaxe de déclaration des setters : public void setXXX(type_de_l’attribut valeur){ nom_de_l’attribut = valeur; } Exemple 40 : Prenons l’exemple d’une classe Personne, qui contient 2 attributs privés « nom » et « âge ». public class Personne { private String nom; private int age; }
Pour permettre aux objets de cette classe (Personne) d’autoriser les autres objets de consulter leurs attributs privés (nom et âge), on doit ajouter, dans la définition de la classes Personne, des accesseurs pour nom et âge.
Page 54 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple 41 : On se propose de réétudier l’exemple 39 en ajoutant des accesseurs pour les attributs de la classe Prof.
Remarque : Bien entendu, les accesseurs doivent être déclarés publiques.
Page 55 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 41 Reprendre l’exemple 39 et ajouter des accesseurs pour les classes qui contiennent des attributs privés. 9) Les opérateurs « . » et « this » a. L’opérateur « . » L’opérateur « . » sert à accéder aux attributs et aux méthodes d’un objet, aux attributs et méthodes statiques d’une classe (Les membres statiques seront détaillés dans le paragraphe 11), et aux classes et sous-packages d’un package. Exemple 42 : Prenons la classe GestionEcole de l’exemple 39, on se propose de créer dans la méthode main, un petit programme qui utilise la classe Prof. accès aux classes d’un package
accès aux sous-packages d’un package accès à l’attribut in de la classe System (voir p.19)
accès à la méthode getNom de l’objet p
Page 56 sur 94
accès à la méthode length du type String (la méthode getNom retourne une chaine de caractères)
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
b. L’opérateur « this » En JAVA, this est une référence qui renvoie l’objet courant lui-même. En d’autres termes, ce mot clé permet de désigner l'objet dans lequel on se trouve, c.à.d. que lorsqu’une méthode a besoin de désigner l'objet dans lequel elle se trouve, on utilise this. Cet opérateur est très utile pour lever l’ambiguïté de code dans certains cas, comme par ex., lors de la génération automatique d’accesseurs dans ECLIPSE : Exemple 43 : Prenons l’exemple de la classe Voiture, qui contient les attributs privés marque, matricule et prix.
Pour générer automatiquement les accesseurs des attributs de la classe, on clique avec le bouton droit de la souris dans le code de la classe, et on choisit le menu suivant :
Page 57 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Cocher alors les accesseurs souhaités dans la fenêtre suivante :
Page 58 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Les getters & setters sélectionnés sont alors automatiquement ajoutés dans la classe :
On remarque ici l’utilisation du mot this dans les setters pour distinguer l’attribut de l’argument de la méthode, puisqu’ils ont le même nom.
Page 59 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
10) Le constructeur Le constructeur d’une classe X est une méthode spéciale qui doit porter le même nom que la classe. Chaque fois qu’on a besoin de créer un nouvel objet, on doit appeler le constructeur de la classe. a. Constructeur par défaut Nous avons déjà ce type de constructeur dans les exemples précédents. (Voir exemples 31, 34, …) Ce constructeur est utilisé quand la classe ne définit pas son, ou ses propres constructeurs, et il ne prend pas de paramètres lors de l’appel. Exemple 44 :
Il est inutile de passer par les accesseurs car la méthode main appartient elle-même à la classe Point
Page 60 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
b. Constructeur sans paramètres Ce constructeur doit être définit avec une signature vide, c.à.d. sans aucun paramètre. Lors de la construction d’un nouvelle objet de la classe, c’est ce constructeur là qui est appelé, et non pas le constructeur par défaut. La définition du constructeur sans paramètres se fait comme ceci : Exemple 45 :
Définition du constructeur sans paramètres
Page 61 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
c. Constructeur avec paramètres Ce constructeur se définit de la même manière que le précédent, mais cette fois-ci, avec des paramètres. On se sert de ce genre de constructeurs pour initialiser les attributs de l’objet à l’instant même de sa création, au lieu de créer un objet « vierge », et d’en initialiser les attributs chacun à part. Exemple 46 : reprenons la classe Point de l’exemple précédent, mais cette fois en lui définissant un constructeur avec paramètres
Définition du constructeur avec paramètres
Page 62 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple 47 : Reprenons l’exemple de la classe Personne, qui contient 2 attributs privés « nom » et « âge ». Le constructeur avec paramètres de cette classe prendra donc 2 paramètres, l’un de type chaîne, et l’autre de type entier.
Page 63 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Remarques : Le constructeur d’une classe X doit toujours être publique, car sinon, il sera impossible de créer des objets de type X. Exemple 48 : Prenons l’exemple de 2 classes A et B. la classe A contient un constructeur privé, et la classe B contient la méthode main, qui essaie de créer un objet de type A ; cela mène à une erreur de compilation.
Le constructeur est la seule méthode qui ne doit pas mentionner un type de retour lors de sa déclaration, sinon il ne sera pas considéré par le compilateur comme un constructeur. Une classe peut définir plusieurs constructeurs, à condition que leurs signatures soient différentes. On parle ici de l’un des plus importants principes orientés objets, la surcharge. (ce principe sera détaillé dans les paragraphes suivants) Exemple 49 : Reprenons la classe Point abordée dans l’exemple 46, en y ajoutant un constructeur sans paramètres, qui initialise les coordonnées de l’objet créé à 0, et un 3ième constructeur qui ne prend qu’un seul paramètre, avec lequel il initialise les deux attributs de l’objet.
Page 64 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Dans le même package que la classe Point, la classe TestPoint contient la méthode main
Page 65 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
d. Constructeur par recopie Le constructeur par recopie d’une classe A, doit prendre en paramètre un objet de type A, pour créer un autre objet dont les valeurs des attributs seront recopiés à partir des attributs de l’objet passé en paramètre. Exemple 50 : On continue toujours avec la classe Point, qui contiendra cette fois un constructeur avec paramètres et un constructeur par recopie. Ces deux constructeurs seront utilisés dans la classe TestPoint
Page 66 sur 94
S.ELYAHYAOUI
Page 67 sur 94
JAVA - Programmation OrientĂŠe Objet
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
11) Les attributs & méthodes « de classe » (static) Un membre qui est dit « statique » ou par fois « de classe », qu’il soit attribut ou méthode, est un membre qui appartient à la classe elle-même, et non pas aux objets, c.à.d.: On n’a pas besoin de créer un objet de la classe pour accéder à un membre statique. Un membre statique est le même pour tous les objets de la classe, au contraire d’un membre non-statique, qui prend une valeur (s’il s’agit d’un attribut), ou un comportement (s’il s’agit d’une méthode) spécifique à l’objet auquel il appartient. Exemple : Pour une classe Etudiant (nom, prénom, âge, …), la donnée « nombre d’étudiants » (c.à.d. nombre d’objets de type Etudiant créés dans le programme), est une donnée qui ne dépend pas de chaque objet à part, mais de la classe Etudiant elle même. Donc cette donnée doit être un attribut statique dans cette classe. a. Attribut statique Pour déclarer un attribut statique, il faut ajouter le mot-clef static lors de la déclaration : modificateur_de _visibilité static type nom_de_l’attribut Exemple 51 : Soit la classe Etudiant citée précédemment, et la classe TestEtudiant qui contient la méthode main
Page 68 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
b. Méthode statique Pour déclarer une méthode statique, il faut ajouter le mot-clef static lors de la déclaration : modificateur_de _visibilité static type_de_retour nom_de_la_méthode(signature){ // code de la méthode } Exemple 52 : Utilisation des méthodes statiques de la classe Math
Page 69 sur 94
S.ELYAHYAOUI Exemple 53 :
Page 70 sur 94
JAVA - Programmation OrientĂŠe Objet
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 42 Soient les 2 classes suivantes : Personne : numCin, nom, adresse (privés) TestPersonne : méthode main Dans la méthode main, proposer à l’utilisateur d’entrer les données de 3 personnes, qui seront stockées dans un tableau de personnes, et afficher ensuite les données de la personne qui a le nom le plus long. La classe Personne doit contenir un constructeur avec paramètres Exercice 43 Soient les 2 classes suivantes : Point : x : réel, y : réel (privés) Cercle : centre : Point, rayon : réel (privés) TestCercle : méthode main Dans la méthode main, proposer à l’utilisateur d’entrer les coordonnées des centres, et les rayons de 2 cercles c1 et c2, et afficher ensuite si oui ou non ces 2 cercles sont identiques (pour que 2 cercles soient identiques, il faut que les coordonnées de leurs centres soient identiques, et leurs rayons soient égaux). Les classes Point et Cercle ne doivent pas contenir des constructeurs avec paramètres. Exercice 44 Ecrire un programme qui demande à l’utilisateur de taper les données de 5 élèves (numéro, nom, et moyenne générale), ces 5 élèves seront stockés dans un tableau d’élèves, qui sera trié dans l’ordre croissant selon la moyenne générale des élèves. Afficher les informations de chaque élément du tableau après le tri.
Page 71 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
12) L’Héritage & les classes abstraites a. L’Héritage L’héritage est aussi l’un des principes fondamentaux des la P.O.O., ce principe consiste à spécifier une classe d’ordre « général », en des classes plus spécifiques et plus spécialisées, qui contiennent les données de la classe générale (sauf les données privées), appelée souvent « classe mère » ou « superclasse », mais aussi leur propres données à elles. Ce principe a vaguement été énoncé lors de la définition du modificateur de visibilité protected, qui permet aux classes « dérivées » ou « filles » d’une classe, d’accéder à un attribut de la classe mère. Prenons l’exemple des classes Personne et Etudiant. Il est claire que la classe Personne représente le cas général, et Etudiant, le cas spécifique, vu que tout individu de la classe Personne n’est pas forcément un Etudiant, mais chaque Etudiant est déjà une Personne. Ces deux familles d’objets présentent donc une relation « d’héritage », qui va de Etudiant à Personne. Cette relation est traduite en Java par l’ajout du mot-clef « extends » lors de la déclaration de la classe dérivée (Etudiant). (Ne pas confondre extends en Java avec extends en UML pour les cas d’utilisation) class Etudiant extends Personne { // contenu de la classe Etudiant }
Règle générale n°1 : Lors qu’une classe C1 hérite d’une classe C2, tous les attributs de C2 sont alors visibles depuis C1, sauf les attributs privés.
Exemple 54 : class ex31 Reproduisons en Java le diagramme UML suivant : Personne # # # -
adresse: String age: int nom: String numSecurSoc: int
Héritage
Etudiant -
numCne: int
Page 72 sur 94
On remarque ici que les attributs : adresse, âge et nom sont déclarés protégés ( # ) dans la classe Personne, ces attributs seront donc visibles pour la classe Etudiant. Ce qui n’est pas le cas pour l’attribut numSecurSoc, qui est déclaré privé ( - )
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
L’objet a de type Personne n’autorise pas l’accès à l’attribut numSecurSoc, même pour la méthode main de la classe Etudiant qui hérite de Personne
Règle générale n°2 : Lors qu’une classe C1 hérite d’une classe C2, tous les attributs de C2 sont alors hérités par la classe C1, elle n’aura donc pas besoin de les re-déclarer, sauf les attributs privés.
Exemple 55 : Reprenons les classes de l’exemple précédent, mais cette fois-ci, l’objet utilisé dans la méthode main sera de type Etudiant, sans modifier la classe Personne.
Page 73 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
On remarque ici que l’objet a de type Etudiant hérite de tous les attributs de la classe Personne, sauf l’attribut privé numSecurSoc
Règle générale n°3 : Si la classe mère contient un constructeur, alors elle n’utilise plus le constructeur par défaut, dans ce cas la classe fille doit elle aussi définir son constructeur, sinon cela mène à une erreur de compilation. Le constructeur de la classe mère est appelé à l’intérieur de celui de la classe fille pour initialiser les attributs hérités.
Exemple 56 : Gardons les classes Etudiant et Personne, en ajoutant un constructeur à la classe Personne.
Page 74 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
On voit que si la classe fille ne contient pas de constructeur, on obtient une erreur de compilation
Pour contourner ce problème, on ajoute un constructeur à la classe Etudiant :
1
2
3
Remarque 1 : l’appel du constructeur de la superclasse se fait en utilisant le mot-clef super, auquel on doit passer les paramètres que prend le constructeur de la superclasse. Remarque 2 : les paramètres nom, âge, adresse et numSecurSoc sont présents dans la signature du constructeur Etudiant, car ils le sont dans la signature du constructeur Personne. Remarque 3 : même si le paramètre numSecurSoc figure dans la définition du constructeur Etudiant, il n’appartiendra pas à l’objet Etudiant qui sera construit, car cet attribut est déclaré privé dans la superclasse Personne
Page 75 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
e1 possède les attributs nom, âge et adresse même si la classe Etudiant ne les a pas déclarés
Règle générale n°4 : Un objet de la classe dérivée peut être considéré comme un objet de la superclasse, l’inverse est faux, le fait de considéré un objet de la superclasse comme étant objet de la classe dérivée génère une exception lors de l’exécution
Dans cet exemple, on passe un objet Etudiant à la méthode m2 qui, dans sa définition, prend un paramètre de type Personne. Pour la méthode m1, on fait l’inverse. L’exécution donne le résultat suivant :
On voit que l’appel de la méthode m2 qui prend en paramètre un objet de type Personne, s’est déroulé sans problèmes, car un objet Etudiant est déjà une personne. Tandis que l’appel de la méthode m1 qui prend en paramètre un objet de type Etudiant, à provoqué une erreur, car un objet Personne n’est pas forcément un Etudiant Page 76 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Règle générale n°5 : L’héritage multiple est interdit en Java, une classe ne peut pas hériter de plusieurs classes à la fois, sinon cela génère une erreur de compilation. Mais on peut dériver plusieurs classes à partir de la même classe mère.
Exemple 57 :
On voit ici que Eclipse signale une erreur de compilation, et propose de remplacer « extends » (héritage) par « implements » (implémentation). Le principe d’implémentation sera détaillé dans les paragraphes suivants.
b. Les classes abstraites Une classe abstraite est une classe qui est déclarée avec le modificateur abstract, elle peut contenir plusieurs, ou aucune, méthode abstraite. Une méthode abstraite est une méthode qui n’a pas de corps. Exemple 58 :
Une classe abstraite peut ne pas contenir de méthodes abstraites, mais si une classe contient au moins une méthode abstraite, alors elle doit être déclarée abstraite, sinon c’est une erreur de compilation
Au contraire des classes concrètes, on ne peut pas créer des instances (ou objets) à partir d’une classe abstraite, ce genre de classes n’est pas fait pour être instancié.
Page 77 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Si une classe X hérite d’une classe abstraite, alors elle doit définir toutes les méthodes abstraites de la classe mère, sinon c’est une erreur de compilation, sauf si X elle-même est une classe abstraite. Exemple 59 : Soit la classe abstraite A qui contient 2 méthodes abstraites
X est une classe concrète qui hérite de A, elle doit donc définir les 2 méthodes m1 et m2, si l’une de ces méthodes est encore abstraite dans la classe X, Eclipse signalera une erreur de compilation.
On voit ici que Eclipse propose soit de rendre la méthode m1 concrète, soit de rendre la classe X abstraite
Page 78 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
c. Intérêt d’utiliser des classes abstraites & méthodes abstraites Soit la situation suivante (cette situation est très souvent rencontrée par les programmeurs): Des classes X, Y et Z partagent toutes les mêmes comportements (méthode), et les mêmes données (attributs), ces comportements et données appartiennent tous à un type A, qui est le type générique des types X, Y et Z. Dans ce genre de cas, il vaut mieux mettre ces données & comportements communs dans une superclasse (A), dont les autres classes (X, Y et Z) vont hériter, pour ne pas répéter dans X, Y et Z la déclaration des éléments communs entre X, Y et Z. D’autre part, si X, Y et Z héritent toutes d’une méthode m de A, alors chacune de ces 3 classes a le droit de définir la méthode m à sa manière. On se propose d’étudier un exemple concret : les classes Tigre, Aigle et Crocodile ont tous le comportement « se déplacer », mais chacune réalise ce comportement à sa propre manière. Donc on pourrait créer la classe Animal, qui contiendrait la méthode abstraite seDeplacer() pour exp60 qu’elle soit héritée et définie par les classes Tigre, Aigle et Crocodile. class Animal # #
age: int taille: double
#
seDeplacer() : void
Aigle
Crocodile #
seDeplacer() : void
En UML, la notation italique signifie que l’élément est abstrait
#
seDeplacer() : void
Exemple 60 : Traduisons en Java le diagramme ci-dessus
Page 79 sur 94
Tigre #
seDeplacer() : void
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
On ajoutera une classe de test, qui contient la méthode main, où on créera 3 instances de types Tigre, Crocodile et Aigle
Page 80 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Etudions un autre cas, celui des classes Véhicule, Voiture et Moto. Il est claire que les classes Voiture et Moto sont des sous-classes de Véhicule. Et on sait aussi que chaque véhicule possède le comportement démarrer, mais, tous les véhicules ne démarrent pas de la même manière, car le mot « véhicule » a un sens large et générique. Il faudra donc spécifier et détailler d’avantage ce sens, pour savoir de quel genre de class exp61 véhicules on parle, d’où – encore une fois – l’intérêt de l’héritage. Moto Vehicule # # # #
marque: String couleur: String modele: String
#
demarrer() : void
demarrer() : void
Voiture #
demarrer() : void
Exemple 61 : Traduisons en Java le diagramme ci-dessus
Page 81 sur 94
S.ELYAHYAOUI
Classe de test
Page 82 sur 94
JAVA - Programmation OrientĂŠe Objet
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
d. L’héritage successif 1. Définition : Java autorise l’héritage successif, c.à.d. qu’on peut hériter une classe C d’une classe B, qui elle-même hérite d’une classe A, et ainsi de suite, en fonction des besoins. Exemple 62 : La classe Véhicule est la classe mère de la classe Avion, qui elle-même est la classe Hydravion. class exp62 Vehicule
Av ion
Hydrav ion
Traduisons en Java le diagramme ci-dessus
2. Visibilité & héritage des attributs et méthodes dans l’héritage successif : Dans l’héritage multiple, les attributs et méthodes de la classe source sont hérités par toutes les classes, jusqu’aux classes du plus bas niveau de l’échelle. Exemple 63 : Reprenons les classes de l’exemple précédent, en ajoutant un attribut protégé dans la classe source Véhicule. Cet attribut sera hérité par toute la hiérarchie descendante de la classe Véhicule.
Page 83 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
On voit ici que l’objet de type Hydravion contient l’attribut « nbrHeuresVol » hérité de la classe Avion, et l’attribut « couleur », hérité de la classe Véhicule
e. La redéfinition des méthodes Soit une classe concrète A qui contient une méthode m, si une classe B hérite de A, elle a le droit de définir la méthode m à sa propre manière, si la définition de cette méthode dans la classe mère ne lui convient pas. On appelle cela la redéfinition. Dans la redéfinition, la méthode doit rester la même, c.à.d. qu’elle doit garder le même nom, le même type de retour, et la même signature, sinon il ne s’agirait plus d’une redéfinition. Exemple 64 : Soient les classes Voiture et VoitureElectronique, la 1ière contient une méthode démarrer, qui sera héritée par la 2ième. La classe VoitureElectronique va donner un nouveau code à la méthode qu’elle a héritée, sans modifier le nom ou la signature.
Page 84 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
class exp64 Voiture #
demarrer() : void
VoitureElectronique +
demarrer() : void
On voit ici que l’objet v2 de type VoitureElectronique ne contient qu’une seule méthode démarrer. C.à.d. que la définition de cette méthode héritée de Voiture a été écrasée dans VoitureElectronique
Page 85 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
f. La surcharge des méthodes dans l’héritage Si la classe dérivée redéfinie une méthode héritée en changeant sa signature, là on parle de surcharge, et non pas de redéfinition. Cela implique que la classe dérivée contient 2 méthodes, celle qui a été héritée, et celle qu’elle a définie. Exemple 65 : Prenons l’exemple d’une classe A qui est définie comme suit :
Cette classe sera héritée par une classe B, qui va changer la signature de la méthode calculerPuissance définie dans la classe A.
Page 86 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
On voit ici que la classe dérivée définie la méthode avec une signature différente, il s’agit donc d’une nouvelle méthode de la classe B : calculerPuissance(double, double), qui s’ajoute à celle déjà héritée de la classe A : calculerPuissance(int, int). Autrement dit, chaque instance de type B, aura 2 méthodes calculerPuissance
Remarque : En Java, toutes les classes héritent par défaut de la classe Object, donc n’importe quel objet contiendra déjà les méthodes héritées de cette classe.
Page 87 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exemple 66 :
On voit que la classe Exp66 ne contient que la méthode main, mais l’instance de type Exp66 contient malgré cela toute une liste de méthodes, qui ont été héritées de la classe Object.
g. Le modificateur « final » Si une classe (concrète) est déclarée avec le modificateur final, alors cette classe ne peut pas être héritée, sinon il s’agit d’une erreur de compilation. (Les classes abstraites ne peuvent pas être déclarées avec ce modificateur) Exemple 67 :
Rappel : Nous avons déjà vu que ce mot clef sert à désigner les constantes.
Page 88 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
13) Les Interfaces & la notion d’Implémentation Une interface est un type de classes qui a les spécificités suivantes : Se déclare avec le mot-clef interface au lieu de class Ne doit contenir que des méthodes non définies et déclarées avec le modificateur « public » Il n’est pas obligatoire d’ajouter le modificateur « abstract » pour les méthodes d’une interface. Tous les attributs doivent être initialisés à la déclaration. Pour les interfaces (ne pas confondre avec interfaces graphiques) on parle d’implémentation et non pas d’héritage. Si une classe concrète implémente une interface, elle sera obligée de fournir une implémentation pour toutes les méthodes déclarées dans l'interface, sinon le compilateur signalera une erreur de compilation. Ce n’est pas le cas pour les classes abstraites. Exemple 68 :
14) Le polymorphisme Le polymorphisme est la description de quelque chose qui change de forme. En programmation orientée objet, cette notion représente le 3ième plus grand principe après l’encapsulation et l’héritage. Il y a plusieurs sortes de polymorphismes : Le polymorphisme d’héritage : dans l’exemple 60, on a vu que la méthode seDeplacer agit différemment selon le type effectif de l’objet manipulé, même si pour nous, ce sont tous des animaux. Cette multifonction de la méthode seDeplacer est l’une des variétés du polymorphisme. La surcharge des méthodes : on parle de surcharge lors que la même méthode peut être appelée avec plusieurs signatures, qu’il s’agisse d’héritage ou non.
Page 89 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
o Surcharge avec héritage : le cas de la méthode calculerPuissance étudiée dans l’exemple 65, est un cas de surcharge avec héritage. o Surcharge sans héritage : Dans l’exemple 49, on a surchargé le constructeur de la classe Point. Autre exemple de la surcharge sans héritage : Exemple 69 :
Surcharge de la méthode calculerPuissance
Page 90 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercices Exercice 45 (Synthèse) Soit l’étude de cas suivante : Le package produits contient les classes suivantes : Article : o Attributs (protégés) : numProduit, prixUnit, qteAchetee o Méthodes : constructeur avec paramètres calculerPrix() : retourne le prix en fonction de la quantité ArticleEnPromotion, type spécial d’articles qui sont vendus avec un pourcentage de réduction : o Attributs (privés) : pourcentage o Méthodes : constructeur avec paramètres calculerPrix() : retourne le prix en fonction de la quantité et en tenant compte du pourcentage de réduction Panier : o Attributs (privés) : listeArticles : tableau d’articles o Méthodes : initialiserArticle(int) : initialise listeArticles et lui donne une taille lue depuis le clavier Le package test contient la classe suivante : Ex45 : o Attributs (static) : p de type Panier o Méthodes : main, contient un menu de choix : créer un panier, vider le panier, modifier le panier, sortir du programme Créer un panier : demander à l’utilisateur le nombre de produits, les informations concernant les articles de chaque produit, calculer et afficher le montant du panier Modifier le panier : modifier la quantité d’articles de l’un des produits puis recalculer le montant du panier Sortir du programme : fin de l’exécution, le programme continuera de tourner jusqu’à ce que l’utilisateur choisisse de sortir du programme. Indications : Utiliser une boucle DO-WHILE pour que le menu se répète jusqu’à ce qu’on choisisse 0 Pour sortir d’un programme on utilise la méthode exit(int) de la classe System
Page 91 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Exercice 46 (Synthèse) Soit l’étude de cas suivante (location de voitures): Le package ex46 contient les classes suivantes : Véhicule : o Attributs : matricule, marque, modèle, prixLocationJournee o Méthode : calculerMontantLocation(int nbrJours) (abstraite) Moto (idem que Voiture) Voiture : o Méthodes : calculerMontantLocation(int nbrJours), retourne le montant de la location du véhicule en fonction du nombre de jours de location passé en paramètre, et en tenant compte de la réduction : nbrJours = 3 à 5 jours: réduction de 25% nbrJours = 6 à 10 jours: réduction de 30% nbrJours = 11 à 15 jours: réduction de 40% nbrJours >= 1 mois: réduction de 50% consturcteur avec paramètres VoitureUtilitaire : o Le prixLocationJournee ne doit pas être inférieur à 500dh la journée VoitureDeLux : o Aucune réduction lors du calcul du montant de location Location : o Attributs (privés): numLocation, matriculeVehicule, numCinClient, nbrJours Agence : o Attributs (privés): listeVehicules tableau contenant tous les véhicules de l’agence o Méthodes : main : contient un menu de choix : remplir la liste de voitures de l’agence, vider la liste, afficher les informations d’un véhicule, modifier le prix de location d’une voiture, ajouter et calculer le prix d’une location ajouter une méthode dans la classe Agence pour chaque fonctionnalité du menu. la condition de sortie du programme est identique à celle de l’exercice précédent. L’étudiant identifiera lui-même les classes qui seront liées par l’héritage.
Page 92 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
D- Concepts avancés 1) Le Garbage Collector En langage C++, lors qu’on construit un objet, on doit la détruire, en utilisant le destructeur, c’est une méthode de la classe, qui fait le travail inverse du constructeur. La notion de destructeur n’existe pas en Java, les instances et les références qui ne pointent plus sur aucune adresse sont détruite par le Garbage Collector ou ramasse miettes, qui est un programme intégré à la machine virtuelle de Java. Ce programme surveille les références qu’on utilise dans nos programmes, détecte celles qui ne sont plus utilisées et les retire de la mémoire. Contrôler le Garbage Collector : Le ramasse miettes intervient lors qu’il y a un manque de mémoire, il est impossible de contrôler son passage. Mais on peut forcer son intervention en appelant la méthode statique gc de la classe System. 2) Les objets « Wrappers » Définition : Exemple 70 : Pour envelopper un entier dans objet i, cet objet doit être de type Integer
Les enveloppeurs les plus utilisés en Java :
Page 93 sur 94
S.ELYAHYAOUI
JAVA - Programmation Orientée Objet
Utilité des enveloppeurs : Comme il a été dit dans leur définition, les enveloppeurs présentent l’avantage d’associer des valeurs primitives à des méthodes permettant de les manipuler. Principales utilisations des objets enveloppeurs : Exemple 71 : Quelques tests de la classe Integer
Page 94 sur 94