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
2
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[];
3
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;
4
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.
5
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érence
int [] tab;
//instantiation
tab=new int[5];
6
7. 1. Les tableaux
création de la référence tab de type [ ]int
tabint []
null
7
8. 1. Les tableaux
instantiation et copie de l’adresse dans la référence
tabint[]
@1
@1 0 tab[0]int
0 tab[1]int
0 tab[2]int
0 tab[3]int
0 tab[4]int
8
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
9
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.}
10
11. 1. Les tableaux
remplir 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;
11
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é.
12
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;
……
}
13
14. 2. Principe d’agrégation
Une classe peut être class Cercle{
aussi constitué de type int rayon;
structuré Point centre;
……
class Point{ }
int abs,ord
Point(int a,int b)
{abs=a;
ord=b;}
}
14
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
15
18. 3.Instanciation.
3.3 Mais que se passe t-il en mémoire
cCercle
@1
@1 10
0 rayonint @2
2 absint
@2 centrePoint
3 ordint
18
19. 2. Principe d’agrégation
Une classe peut être class Cercle{
aussi constitué de type int rayon;
structuré
Point centre;
Cercle (int r,Point p)
class Point{
{
int abs,ord
rayon=r;
Point(int a,int b)
centre=p;
{abs=a;ord=b;}
}
}
}
19
23. Remplir le tableau
tab[0] = new Point(2,3);
tab[1]=new Point(5,6);
23
24. 3.Instanciation.
3.3 Mais que se passe t-il en mémoire
tabPoint[]
@1
2 abs
3 ord
@1 @2 tab[0]Point
5 abs
@3 tab[1]Point
6
ord
24
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.
25
26. 1. Encapsulation & Contrôle des Accès
class MaDate {
private int jour;
private int mois;
private int annee;
}
26
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.
27
28. 1.Encapsulation & Contrôle des accès
class MaDateUser {
public static void main(String args[])
{
MaDate mydate = new MaDate();
mydate.jour = 21; // incorrect !
}
}
28
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.
29
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 faux
d.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.
30
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é.
31
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.
32
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.
33
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.
34
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
35
36. 1.Encapsulation & Contrôle des accès
class 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;}
}
36
37. 1.Encapsulation & Contrôle des accès
void setAnnee(int nA)
void setJour(int nJ)
int getAnnee()
jour=30
mois=1
annee=2009
int getMois()
int getJour()
void setMois(int nM)
37
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.
39
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.
40
41. 1.Encapsulation & Contrôle des accès
Attribut ou Defaut (rien) public private
Méthode
Accessible dans la classe OUI OUI OUI
elle même
Accessible dans une autre OUI OUI NON
classe du même package
(répertoire)
Accessible dans une autre NON OUI NON
classe dans un autre
package (répertoire)
41
42. public class Personne {
String nom,prenom;
public static void main(String
args[]){
Personne p = new Personne();
System.out.println(p);
}
}
42
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());
}
}
44
45. Afficher une référence c’est faire appel à la
méthode toString()
45
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());
}
}
46