47
1 Concepts OO avancés

Java uik-chap5-poo avance vf

Embed Size (px)

Citation preview

Page 1: Java uik-chap5-poo avance vf

1

Concepts OO avancés

Page 2: Java uik-chap5-poo avance vf

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

Page 3: Java uik-chap5-poo avance vf

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[];

Page 4: Java uik-chap5-poo avance vf

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;

Page 5: Java uik-chap5-poo avance vf

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.

Page 6: Java uik-chap5-poo avance vf

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];

Page 7: Java uik-chap5-poo avance vf

7

1. Les tableauxcréation de la référence tab de type

[ ]int

null

tabint []

Page 8: Java uik-chap5-poo avance vf

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

Page 9: Java uik-chap5-poo avance vf

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

Page 10: Java uik-chap5-poo avance vf

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.}

Page 11: Java uik-chap5-poo avance vf

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;

Page 12: Java uik-chap5-poo avance vf

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é.

Page 13: Java uik-chap5-poo avance vf

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;……}

Page 14: Java uik-chap5-poo avance vf

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;……}

Page 15: Java uik-chap5-poo avance vf

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

Page 16: Java uik-chap5-poo avance vf

16

3.Instanciation. 3.3 Mais que se passe t-il en mémoire

centrePoint

@1

@1rayonint0

cCercle

null

Page 17: Java uik-chap5-poo avance vf

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

Page 18: Java uik-chap5-poo avance vf

18

3.Instanciation. 3.3 Mais que se passe t-il en mémoire

centrePoint

@1

@1rayonint0

cCercle

@2ordint

@2absint

102

3

Page 19: Java uik-chap5-poo avance vf

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;}

}

Page 20: Java uik-chap5-poo avance vf

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));

Page 21: Java uik-chap5-poo avance vf

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

Page 22: Java uik-chap5-poo avance vf

22

3.Instanciation. 3.3 Mais que se passe t-il en mémoire

tab[1]Point

@1

@1tab[0]Point

tabPoint[]

null

null

Page 23: Java uik-chap5-poo avance vf

23

Remplir le tableautab[0] = new Point(2,3);tab[1]=new Point(5,6);

Page 24: Java uik-chap5-poo avance vf

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

Page 25: Java uik-chap5-poo avance vf

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.

Page 26: Java uik-chap5-poo avance vf

26

1. Encapsulation & Contrôle des Accèsclass MaDate {private int jour;private int mois;private int annee;}

Page 27: Java uik-chap5-poo avance vf

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.

Page 28: Java uik-chap5-poo avance vf

28

1.Encapsulation & Contrôle des accèsclass MaDateUser {public static void main(String args[]) {

MaDate mydate = new MaDate();mydate.jour = 21; // incorrect !}}

Page 29: Java uik-chap5-poo avance vf

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.

Page 30: Java uik-chap5-poo avance vf

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.

Page 31: Java uik-chap5-poo avance vf

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é.

Page 32: Java uik-chap5-poo avance vf

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.

Page 33: Java uik-chap5-poo avance vf

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.

Page 34: Java uik-chap5-poo avance vf

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.

Page 35: Java uik-chap5-poo avance vf

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

Page 36: Java uik-chap5-poo avance vf

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;}}

Page 37: Java uik-chap5-poo avance vf

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()

Page 38: Java uik-chap5-poo avance vf

38

1.Encapsulation & Contrôle des accès

Page 39: Java uik-chap5-poo avance vf

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.

Page 40: Java uik-chap5-poo avance vf

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.

Page 41: Java uik-chap5-poo avance vf

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

Page 42: Java uik-chap5-poo avance vf

42

public class Personne {String nom,prenom;public static void main(String args[]){

Personne p = new Personne();System.out.println(p);}}

Page 43: Java uik-chap5-poo avance vf

43

Personne@de6ced

Page 44: Java uik-chap5-poo avance vf

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());}}

Page 45: Java uik-chap5-poo avance vf

45

Afficher une référence c’est faire appel à la méthode toString()

Page 46: Java uik-chap5-poo avance vf

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());}}

Page 47: Java uik-chap5-poo avance vf

47

nom=a prenom=b