Upload
amel-morchdi
View
1.052
Download
0
Embed Size (px)
Citation preview
1
Concepts OO avancés
2
Plan
1. Les tableaux
2. Le principe d’agrégation
3. Encapsulation et Contrôle des accès
4. Héritage
5. Polymorphisme
6. Surcharge
3
1. Les tableaux
Déclaration de tableaux Déclaration de tableaux de types
fondamentaux ou de classe :
int tab [];int [] tab;char s[];Point p[];
4
1. Les tableaux
En Java, un tableau est l’instance d’une classe, La déclaration ne crée pas l’objet lui-même. La déclaration créer simplement une référence Le format crochet ouvrant et fermant est hérité des
langages C et C++. Java offre une alternative de format en plaçant les crochets ouvrant et fermant avant la variable elle-même :
Création de deux référence de type tableau de char et tableau de
char [] s;int [] tab;
5
1. Les tableaux
Les tableaux comme les objets, sont crées en utilisant le mot clé new .
Les tableaux déclarés en dessous peuvent être crées comme suit :
s = new char[20];
tab = new int[100]; La première ligne crée un tableau de dimension 20
valeurs de type char. Le second crée un tableau de 100 variables de type
int.
6
1. Les tableaux
//création de la référence et instantiation
int [] tab = new int [5] ou
//création de la référenceint [] tab;//instantiationtab=new int[5];
7
1. Les tableauxcréation de la référence tab de type
[ ]int
null
tabint []
8
1. Les tableauxinstantiation et copie de l’adresse dans la référence
tab[1]int
tab[2]int
@1
@1tab[0]int0
0
0
tabint[]
0 tab[3]int
tab[4]int0
9
1. Les tableaux
Initialisation de tableaux Lorsqu’un tableau est créé, chaque élément
est initialisé à sa valeur par défaut Pour le tableau de int ci-dessus, chaque
élément est initialisé à la valeur 0
10
1. Les tableaux
Limites de tableau Dans le langage Java, les indices des tableaux sont
des entiers commençant à zéro. Java génère une exception en cas de dépassement
d’indice. L’obtention de la taille d’un tableau en utilisant la
variable membre length. Pour une itération de tableau le code suivant utilise cette variable :
int list[] = new int [10];for (int i = 0; i < list.length; i++){// faire quelque chose.}
11
1. Les tableauxremplir un tableau
int tab[] = {3, 5,9,10 }; La ligne de code au dessus est équivalente à la suivante :
int tab[];tab = new int[4];tab[0] = 3;tab[1] = 5;tab[2] = 9;tab[3] = 10;
12
1. Les tableaux
Notez que la limite de la boucle est déterminé par comparaison avec la variable list.length plutôt qu’une valeur immédiate 10.
Cette approche sécurise davantage le code engendré.
13
2. Principe d’agrégation
On a vu que les attributs d’une classe sont de type primitif
class Date{int jour,mois,annee;}class Cercle{int rayon;……}
14
2. Principe d’agrégation
Une classe peut être aussi constitué de type structuré
class Point{int abs,ordPoint(int a,int b){abs=a;ord=b;}}
class Cercle{int rayon;Point centre;……}
15
2. Principe d’agrégation
Création d’un Cercle de rayon 10 et de centre le Point(2,3)
Cercle c1=new Cercle();
//Le cercle est de rayon 0 et le centre est à null
16
3.Instanciation. 3.3 Mais que se passe t-il en mémoire
centrePoint
@1
@1rayonint0
cCercle
null
17
2. Principe d’agrégation
c1.rayon=10;c1.centre = new Point(2,3);//c à maintenant un rayon 10 et le centre est à null
18
3.Instanciation. 3.3 Mais que se passe t-il en mémoire
centrePoint
@1
@1rayonint0
cCercle
@2ordint
@2absint
102
3
19
2. Principe d’agrégation
Une classe peut être aussi constitué de type structuré
class Point{int abs,ordPoint(int a,int b){abs=a;ord=b;}}
class Cercle{int rayon;Point centre;Cercle (int r,Point p){rayon=r;centre=p;}
}
20
2. Principe d’agrégation
Point p=new Point(1,3)Cercle c=new Cercle(10,p)
Ou
Cercle c=new Cercle(10,new Point(2,3));
21
2. Principe d’agrégation
Les tableaux d’objets
Point tab []=new Point[2]Il s’agit d’un tableau de 2 référence de type Point
22
3.Instanciation. 3.3 Mais que se passe t-il en mémoire
tab[1]Point
@1
@1tab[0]Point
tabPoint[]
null
null
23
Remplir le tableautab[0] = new Point(2,3);tab[1]=new Point(5,6);
24
3.Instanciation. 3.3 Mais que se passe t-il en mémoire
tab[1]Point
@1
@1tab[0]Point
tabPoint[]
@3
@2
2
3
5
6
abs
abs
ord
ord
25
1.Encapsulation & Contrôle des accès L’encapsulation est la possibilité de ne
montrer de l’objet que ce qui est nécessaire à son utilisation,
Les avantages en sont : Simplification de l’utilisation des objets, Meilleure robustesse du programme, Simplification de la maintenance globale de
l’application.
26
1. Encapsulation & Contrôle des Accèsclass MaDate {private int jour;private int mois;private int annee;}
27
1.Encapsulation & Contrôle des accès L’utilisation du mot-clé private comme
modificateur de jour, mois et annee au sein de la classe MaDate a pour effet de rendre impossible tout accès à ces membres à partir de n’importe quel code, excepté les méthodes de la classe MaDate elle-même.
28
1.Encapsulation & Contrôle des accèsclass MaDateUser {public static void main(String args[]) {
MaDate mydate = new MaDate();mydate.jour = 21; // incorrect !}}
29
1.Encapsulation & Contrôle des accès Cela peut sembler une chose étrange à faire délibérément mais
présente en fait de gros avantages potentiels pour la qualité du programme qui utilise la classe MaDate.
Les différents éléments de données étant inaccessibles, le seul moyen de lire ou d’écrire dans ces éléments est d’utiliser des méthodes.
Ainsi, si une cohérence interne des membres de la classe est requise, cette cohérence peut être gérée par les méthodes de la classe elle-même.
30
1.Encapsulation & Contrôle des accès Considérons une classe de date permettant un accès arbitraire aux
membres depuis l’extérieur. Il serait alors très facile de coder pour effectuer l’une des opérations suivantes :
MaDate d = new MaDate();d.jour = 32;d.mois = 2; d.jour = 30; // plausible mais fauxd.mois = d.mois + 1; // omettre le contrôle
//pour retour au début Cette affectation, comme beaucoup d’autres, génère des valeurs incorrectes ou incohérentes dans les champs de l’objet date.
31
1.Encapsulation & Contrôle des accès Si les membres de données d’une classe ne
sont pas exposés, l’utilisateur de la classe est contraint de modifier les variables membres par l’intermédiaire de méthodes.
Du fait qu’elles correspondent à du code réel, ces méthodes peuvent réaliser des contrôles de validité.
32
1.Encapsulation & Contrôle des accès Considérez la méthode suivante comme faisant partie de la
classe MaDate :public void setJour(int nouveauJour) {if (nouveauJour > 31) {System.err.println(« jour invalide " +
nouveauJour);}else {jour = nouveauJour;}} La méthode vérifie si le jour qu’elle doit définir est en fait valide.
S’il ne l’est pas, elle ignore la requête et imprime un message. Vous pouvez voir que cette classe de dates est efficacement protégée contre les dates trop élevées.
33
1.Encapsulation & Contrôle des accès Outre protéger les données d’un objet contre une modification
incorrecte, forcer l’utilisateur à accéder aux données via une méthode permet de réutiliser plus simplement cette méthode en garantissant que les effets secondaires sont correctement gérés.
Si les données étaient entièrement accessibles, chaque utilisateur de la classe aurait à incrémenter la valeur jour, à la tester par rapport au nombre de jours contenus dans le mois en cours, et à gérer la boucle de fin du mois (voire de fin d’année). Cette opération est fastidieuse et source d’erreurs.
Ces besoins sont bien compris pour les dates, mais d’autres types de données présentent des contraintes similaires qui sont mal connues.
En forçant l’utilisateur à utiliser les méthodes fournies, chacun peut être assuré que les effets secondaires seront chaque fois gérés de façon cohérente et correcte.
34
1.Encapsulation & Contrôle des accès Cet aspect du regroupement des données et
du code dans un objet comme celui du masquage de données est généralement appelé encapsulation.
35
1.Encapsulation & Contrôle des accès Les get/set sont des méthodes permettant de
respectivement lire/modifier les attributs privés
Leur nom et normalisé getNomAttribu, setNomAttribu
Il doit exister une paire get/set pour chaque attribut
36
1.Encapsulation & Contrôle des accèsclass MaDate {private int day;private int month;private int year;int getDay(){return day;}int getMonth(){return month;}int getYear(){return year;}void setDay(int d){day=d;}void setMonth(int m){month=m;}void setYear(int y){year=y;}}
37
1.Encapsulation & Contrôle des accès
jour=30 mois=1 annee=2009
void setMois(int nM)
void setAnnee(int nA)
void setJour(int nJ)
int getJour()
int getMois()
int getAnnee()
38
1.Encapsulation & Contrôle des accès
39
1.Encapsulation & Contrôle des accès L’encapsulation permet d’offrir aux utilisateurs d’une classe la
liste des méthodes et éventuellement des attributs utilisables depuis l’extérieur.
Cette liste de services exportables est appelé l’interface de la classe et elle est composée d’un ensemble de méthodes et d’attributs dits publics.
Les méthodes et attributs réservés à l’implémentation des comportements internes à l’objet sont dits privés. Leur utilisation est exclusivement réservée aux méthodes définies dans la classe courante.
40
1.Encapsulation & Contrôle des accès Encapsulation : avantages 1. Simplification de l’utilisation des objets.
Pour utiliser un objet, inutile de connaître son implémentation, la connaissance de son interface suffit. Par exemple, il est inutile de savoir que les coordonnées du centre du cercle sont stockées dans deux variables cx et cy, qui sont de type int.
2. Meilleure robustesse du programme Une fois un objet testé et développé, un “bug” ne peut pas être généré
par du code extérieur à l’objet. Par exemple, si on tente par erreur de mettre une valeur de type int dans la variable cx ou cy, ce ne sera pas permis.
Nous somme donc obligé d’appeler la méthode publique move(int dx, int dy). Si un bug apparaît, c’est alors dans l’objet qu’il faut le chercher (notre méthode publique est-elle capable de traiter ce type d’erreur ?)
3. Simplification et maintenance de l’application En fonction de ce que nous avons dit précédemment, ce point en est
une conséquence logique.
41
1.Encapsulation & Contrôle des accèsAttribut ouMéthode
Defaut (rien) public private
Accessible dans la classe elle même
OUI OUI OUI
Accessible dans une autre classe du même package (répertoire)
OUI OUI NON
Accessible dans une autre classe dans un autre package (répertoire)
NON OUI NON
42
public class Personne {String nom,prenom;public static void main(String args[]){
Personne p = new Personne();System.out.println(p);}}
43
Personne@de6ced
44
public class Personne {String nom,prenom;public static void main(String args[]){
Personne p = new Personne();//System.out.println(p);System.out.println(p.toString());}}
45
Afficher une référence c’est faire appel à la méthode toString()
46
public class Personne{String nom,prenom;public String toString(){return « nom=« +nom+ « prenom=»+prenom;}
public static void main(String args[]){Personne p = new Personne();p.nom=«a »,p.prenom=« b »; System.out.println(p);//System.out.println(p.toString());}}
47
nom=a prenom=b