53
2i002 - UML (light), diagramme mémoire et pointeurs Vincent Guigue Vincent Guigue 2i002 - UML et mémoire 1/13

2i002 - UML (light), diagramme mémoire et pointeurs

  • Upload
    others

  • View
    15

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2i002 - UML (light), diagramme mémoire et pointeurs

2i002 - UML (light), diagramme mémoire et

pointeurs

Vincent Guigue

Vincent Guigue 2i002 - UML et mémoire 1/13

Page 2: 2i002 - UML (light), diagramme mémoire et pointeurs

Philosophie

On ne programme pas pour soi-même... Mais pour les autres :� Respecter les codes syntaxiques : majuscules, minuscules...� Donner des noms explicites (classes, méthodes, attributs)� Développer une documentation du code (cf cours javadoc)� ... Et proposer une vision synthétique d’un ensemble de

classes : ) UML

� nom de la classe� attributs� méthodes (et constructeurs)

+ code pour visualiser public/private+ liens entre classes pour lesdépendances (cf cours sur lacomposition)

Vincent Guigue 2i002 - UML et mémoire 2/13

Page 3: 2i002 - UML (light), diagramme mémoire et pointeurs

Philosophie

On ne programme pas pour soi-même... Mais pour les autres :� Respecter les codes syntaxiques : majuscules, minuscules...� Donner des noms explicites (classes, méthodes, attributs)� Développer une documentation du code (cf cours javadoc)� ... Et proposer une vision synthétique d’un ensemble de

classes : ) UML

� nom de la classe� attributs� méthodes (et constructeurs)

+ code pour visualiser public/private+ liens entre classes pour lesdépendances (cf cours sur lacomposition)

Vincent Guigue 2i002 - UML et mémoire 2/13

Page 4: 2i002 - UML (light), diagramme mémoire et pointeurs

UML Client vs DéveloppeurPlusieurs types de diagrammes pour plusieurs usages :

� Pour les développeurs : représentation complète� Pour les utilisateurs : représentation public uniquement

Idée :Le code doit être pensé pour les autres :

� Tous les noms doivent être aussi clairs que possible� Un diagramme plus limité est plus facile à lire

Vincent Guigue 2i002 - UML et mémoire 3/13

Page 5: 2i002 - UML (light), diagramme mémoire et pointeurs

Philosophie (suite)

2 manières de voir l’UML :1 Outil pour une visualisation globale d’un code complexe2 Outil de conception / développement indépendant du langage

Dans le cadre de 2i002 : seulement l’approche 1

Limites de l’UML :� Vision architecte...� Mais pas d’analyse de l’exécution du code

Que se passe-t-il lors de l’exécution du programme :Nouveau type de représentation :

Diagramme mémoire

Vincent Guigue 2i002 - UML et mémoire 4/13

Page 6: 2i002 - UML (light), diagramme mémoire et pointeurs

Coté JVM : exécution du code

1 Po in t p = new Po in t ( 1 , 2 ) ;

Comment décrire cette ligne de code ?

La variable p, de type Point, référence une instance dont lesattributs x et y ont pour valeur respective 1 et 2.

Comment représenter cette ligne de code ?

� Représentation des classes sans les méthodes

� Valeur des attributs

� Type & noms des variables

� Lien de référencement

Vincent Guigue 2i002 - UML et mémoire 5/13

Page 7: 2i002 - UML (light), diagramme mémoire et pointeurs

Coté JVM : exécution du code

1 Po in t p = new Po in t ( 1 , 2 ) ;

Comment décrire cette ligne de code ?

La variable p, de type Point, référence une instance dont lesattributs x et y ont pour valeur respective 1 et 2.

Comment représenter cette ligne de code ?

� Représentation des classes sans les méthodes

� Valeur des attributs

� Type & noms des variables

� Lien de référencement

Vincent Guigue 2i002 - UML et mémoire 5/13

Page 8: 2i002 - UML (light), diagramme mémoire et pointeurs

Coté JVM : exécution du code

1 Po in t p = new Po in t ( 1 , 2 ) ;

Comment décrire cette ligne de code ?

La variable p, de type Point, référence une instance dont lesattributs x et y ont pour valeur respective 1 et 2.

Comment représenter cette ligne de code ?

double x = 1double y = 2

PointPoint p1

� Représentation des classes sans les méthodes

� Valeur des attributs

� Type & noms des variables

� Lien de référencement

Vincent Guigue 2i002 - UML et mémoire 5/13

Page 9: 2i002 - UML (light), diagramme mémoire et pointeurs

Types de base vs Objet : signification de =Les types de base et les objets ne se comportent pas de lamême façon avec =

� Liste des types de base :int, double, boolean, char, byte, short, long, float

1 double a , b ;2 a = 1 ;3 b = a ; // d u p l i c a t i o n de l a v a l e u r 1) Si b est modifié, pas d’incidence sur a

� et pour un Objet :

4 Po in t p = new Po in t ( 1 , 2 ) ;5 Po in t q = p ; // d u p l i c a t i o n de l a r é f é r e n c e . . .6 // 1 s e u l e i n s t a n c e !

2 variables, 2 références, mais 1 seule instance

Vincent Guigue 2i002 - UML et mémoire 6/13

Page 10: 2i002 - UML (light), diagramme mémoire et pointeurs

Types de base vs Objet : signification de =Les types de base et les objets ne se comportent pas de lamême façon avec =

� Liste des types de base :int, double, boolean, char, byte, short, long, float

1 double a , b ;2 a = 1 ;3 b = a ; // d u p l i c a t i o n de l a v a l e u r 1) Si b est modifié, pas d’incidence sur a

� et pour un Objet :

4 Po in t p = new Po in t ( 1 , 2 ) ;5 Po in t q = p ; // d u p l i c a t i o n de l a r é f é r e n c e . . .6 // 1 s e u l e i n s t a n c e !

2 variables, 2 références, mais 1 seule instance

Vincent Guigue 2i002 - UML et mémoire 6/13

Page 11: 2i002 - UML (light), diagramme mémoire et pointeurs

Types de base vs Objet : signification de =Les types de base et les objets ne se comportent pas de lamême façon avec =

� Liste des types de base :int, double, boolean, char, byte, short, long, float

1 double a , b ;2 a = 1 ;3 b = a ; // d u p l i c a t i o n de l a v a l e u r 1) Si b est modifié, pas d’incidence sur a

� et pour un Objet :

4 Po in t p = new Po in t ( 1 , 2 ) ;5 Po in t q = p ; // d u p l i c a t i o n de l a r é f é r e n c e . . .6 // 1 s e u l e i n s t a n c e !

double x = 1double y = 2

PointPoint pPoint q

2 variables, 2 références, mais 1 seule instanceVincent Guigue 2i002 - UML et mémoire 6/13

Page 12: 2i002 - UML (light), diagramme mémoire et pointeurs

Clonage vs copie de surface

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 Po in t p1 = new Po in t (1 , 2 ) ;3 Po in t p2 = p1 ;45 Po in t p3 = new Po in t (1 , 2 ) ;6 Po in t p4 = new Po in t (1 , 2 ) ;7 }

double x = 1double y = 2

PointPoint p1Point p2

double x = 1double y = 2

PointPoint p3Point p4

double x = 1double y = 2

Point

� Les variables p1 et p2référencent la mêmeinstance

� p3 et p4 référencentdes instancesdifférentes

Vincent Guigue 2i002 - UML et mémoire 7/13

Page 13: 2i002 - UML (light), diagramme mémoire et pointeurs

Références & arguments de fonctions

� Passer un argument à une fonction revient à utiliser un signe =� ... Objets et types de base se comportent différemment !

1 // c l a s s e UnObjet ,2 // ( c l a s s e sans impor tance )3 . . .4 p u b l i c v o i d maFonction1 ( Po in t p){5 . . .6 p . move ( 1 . , 1 . ) ;7 . . .8 }9

10 p u b l i c v o i d maFonction2 ( doub l e d){11 . . .12 d = 3 . ; // s yn t a x e c o r r e c t e13 // mais t r è s moche !14 . . .15 }

1 // dans l e main2 UnObjet ob j = new UnObjet ( ) ;34 Po in t p = new Po in t ( 1 . , 2 . ) ;5 doub l e d = 2 . ;67 ob j . maFonction1 ( p ) ;8 ob j . maFonction2 ( d ) ;9

10 // p a pour a t t r i b u t s ( x=2. , y=3.)11 // d vaut 2

� Quand un objet est passé en argument :il n’y a pas duplication de l’instance (simplement 2références vers 1 instance)

� Quand un type de base est passé en argument : duplication.

Vincent Guigue 2i002 - UML et mémoire 8/13

Page 14: 2i002 - UML (light), diagramme mémoire et pointeurs

Types de base vs Objet : signification de ==

� Opérateur == : prend 2 opérandes de même type et retourneun boolean

� Type de base : vérification de l’égalité des valeurs

� Objet : vérification de l’égalité des références

� ATTENTION aux classes enveloppes (qui sont des objets)

1 double d1 = 1 . ;2 double d2 = 1 . ;3 System . out . p r i n t l n ( d1==d2 ) ; // a f f i c h a g e de t r u e4 // dans l a c o n s o l e

5 Po in t p1 = new Po in t (1 , 2 ) ;6 Po in t p2 = p1 ;7 System . out . p r i n t l n ( p1==p2 ) ; // a f f i c h a g e de true89 Po in t p3 = new Po in t (1 , 2 ) ;

10 Po in t p4 = new Po in t (1 , 2 ) ;11 System . out . p r i n t l n ( p3==p4 ) ; // a f f i c h a g e de false12 Double d3 = 1 . ; // c l a s s e enve l oppe Double = ob j e t13 Double d4 = 1 . ;14 System . out . p r i n t l n ( d3==d4 ) ; // a f f i c h a g e de false

Vincent Guigue 2i002 - UML et mémoire 9/13

Page 15: 2i002 - UML (light), diagramme mémoire et pointeurs

Types de base vs Objet : signification de ==

� Opérateur == : prend 2 opérandes de même type et retourneun boolean

� Type de base : vérification de l’égalité des valeurs� Objet : vérification de l’égalité des références

� ATTENTION aux classes enveloppes (qui sont des objets)

1 double d1 = 1 . ;2 double d2 = 1 . ;3 System . out . p r i n t l n ( d1==d2 ) ; // a f f i c h a g e de t r u e4 // dans l a c o n s o l e5 Po in t p1 = new Po in t (1 , 2 ) ;6 Po in t p2 = p1 ;7 System . out . p r i n t l n ( p1==p2 ) ; // a f f i c h a g e de true89 Po in t p3 = new Po in t (1 , 2 ) ;

10 Po in t p4 = new Po in t (1 , 2 ) ;11 System . out . p r i n t l n ( p3==p4 ) ; // a f f i c h a g e de false

12 Double d3 = 1 . ; // c l a s s e enve l oppe Double = ob j e t13 Double d4 = 1 . ;14 System . out . p r i n t l n ( d3==d4 ) ; // a f f i c h a g e de false

Vincent Guigue 2i002 - UML et mémoire 9/13

Page 16: 2i002 - UML (light), diagramme mémoire et pointeurs

Types de base vs Objet : signification de ==

� Opérateur == : prend 2 opérandes de même type et retourneun boolean

� Type de base : vérification de l’égalité des valeurs� Objet : vérification de l’égalité des références

� ATTENTION aux classes enveloppes (qui sont des objets)

1 double d1 = 1 . ;2 double d2 = 1 . ;3 System . out . p r i n t l n ( d1==d2 ) ; // a f f i c h a g e de t r u e4 // dans l a c o n s o l e5 Po in t p1 = new Po in t (1 , 2 ) ;6 Po in t p2 = p1 ;7 System . out . p r i n t l n ( p1==p2 ) ; // a f f i c h a g e de true89 Po in t p3 = new Po in t (1 , 2 ) ;

10 Po in t p4 = new Po in t (1 , 2 ) ;11 System . out . p r i n t l n ( p3==p4 ) ; // a f f i c h a g e de false12 Double d3 = 1 . ; // c l a s s e enve l oppe Double = ob j e t13 Double d4 = 1 . ;14 System . out . p r i n t l n ( d3==d4 ) ; // a f f i c h a g e de false

Vincent Guigue 2i002 - UML et mémoire 9/13

Page 17: 2i002 - UML (light), diagramme mémoire et pointeurs

Classes enveloppes

Les types de base en JAVA sont doublés de wrappers ou classesenveloppes pour :

� utiliser les classes génériques (cf cours ArrayList)� fournir quelques outils fort utiles

int, double, boolean, char, byte, short, long, float )Integer, Double...

Outils1 Double d1 = Double .MAX_VALUE; // v a l e u r maximum p o s s i b l e2 Double d2 = Double . POSITIVE_INFINITY ; // v a l e u r s p é c i f i q u e3 // gé r é e dans l e s o p é r a t i o n s4 Double d3 = Double . v a l u e o f ( " 3 .5 " ) ; // S t r i n g => doub l e5 // Double . isNaN ( doub l e d ) , Double . i s I n f i n i t e ( doub l e d ) . . .

Documentation : http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

6 // c o n v e r s i o n s i m p l i c i t e s = ( un ) box ing ( d epu i s JAVA 5)7 double d4 = d1 ;8 Double d5 = d4 ;

Vincent Guigue 2i002 - UML et mémoire 10/13

Page 18: 2i002 - UML (light), diagramme mémoire et pointeurs

Classes enveloppes

Les types de base en JAVA sont doublés de wrappers ou classesenveloppes pour :

� utiliser les classes génériques (cf cours ArrayList)� fournir quelques outils fort utiles

int, double, boolean, char, byte, short, long, float )Integer, Double...

Outils1 Double d1 = Double .MAX_VALUE; // v a l e u r maximum p o s s i b l e2 Double d2 = Double . POSITIVE_INFINITY ; // v a l e u r s p é c i f i q u e3 // gé r é e dans l e s o p é r a t i o n s4 Double d3 = Double . v a l u e o f ( " 3 .5 " ) ; // S t r i n g => doub l e5 // Double . isNaN ( doub l e d ) , Double . i s I n f i n i t e ( doub l e d ) . . .

Documentation : http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

6 // c o n v e r s i o n s i m p l i c i t e s = ( un ) box ing ( d epu i s JAVA 5)7 double d4 = d1 ;8 Double d5 = d4 ;

Vincent Guigue 2i002 - UML et mémoire 10/13

Page 19: 2i002 - UML (light), diagramme mémoire et pointeurs

Classe enveloppe : des objets avant tout

Historique :� A l’origine : Philosophie tout objet

) propre, mais pas pratique� Evolution : plus de dérogation pour faciliter les usages

) classes enveloppes bcp moins utilisées

) Classe enveloppe = objet ! ! !1 double d1b = 1 . ;2 double d2b = d1b ;3 double d3b = 1 . ;4 System . out . p r i n t l n ( d1b == d2b ) ;5 System . out . p r i n t l n ( d1b == d3b ) ;

6 // t r u e & t r u e7 Double d1 = 1 . ;8 Double d2 = d1 ;9 Double d3 = 1 . ;

10 System . out . p r i n t l n ( d1 == d2 ) ;11 System . out . p r i n t l n ( d1 == d3 ) ;12 // t r u e & false

Vincent Guigue 2i002 - UML et mémoire 11/13

Page 20: 2i002 - UML (light), diagramme mémoire et pointeurs

Classe enveloppe : des objets avant tout

Historique :� A l’origine : Philosophie tout objet

) propre, mais pas pratique� Evolution : plus de dérogation pour faciliter les usages

) classes enveloppes bcp moins utilisées

) Classe enveloppe = objet ! ! !1 double d1b = 1 . ;2 double d2b = d1b ;3 double d3b = 1 . ;4 System . out . p r i n t l n ( d1b == d2b ) ;5 System . out . p r i n t l n ( d1b == d3b ) ;6 // t r u e & t r u e

7 Double d1 = 1 . ;8 Double d2 = d1 ;9 Double d3 = 1 . ;

10 System . out . p r i n t l n ( d1 == d2 ) ;11 System . out . p r i n t l n ( d1 == d3 ) ;12 // t r u e & false

Vincent Guigue 2i002 - UML et mémoire 11/13

Page 21: 2i002 - UML (light), diagramme mémoire et pointeurs

Classe enveloppe : des objets avant tout

Historique :� A l’origine : Philosophie tout objet

) propre, mais pas pratique� Evolution : plus de dérogation pour faciliter les usages

) classes enveloppes bcp moins utilisées

) Classe enveloppe = objet ! ! !1 double d1b = 1 . ;2 double d2b = d1b ;3 double d3b = 1 . ;4 System . out . p r i n t l n ( d1b == d2b ) ;5 System . out . p r i n t l n ( d1b == d3b ) ;6 // t r u e & t r u e7 Double d1 = 1 . ;8 Double d2 = d1 ;9 Double d3 = 1 . ;

10 System . out . p r i n t l n ( d1 == d2 ) ;11 System . out . p r i n t l n ( d1 == d3 ) ;

12 // t r u e & false

Vincent Guigue 2i002 - UML et mémoire 11/13

Page 22: 2i002 - UML (light), diagramme mémoire et pointeurs

Classe enveloppe : des objets avant tout

Historique :� A l’origine : Philosophie tout objet

) propre, mais pas pratique� Evolution : plus de dérogation pour faciliter les usages

) classes enveloppes bcp moins utilisées

) Classe enveloppe = objet ! ! !1 double d1b = 1 . ;2 double d2b = d1b ;3 double d3b = 1 . ;4 System . out . p r i n t l n ( d1b == d2b ) ;5 System . out . p r i n t l n ( d1b == d3b ) ;6 // t r u e & t r u e7 Double d1 = 1 . ;8 Double d2 = d1 ;9 Double d3 = 1 . ;

10 System . out . p r i n t l n ( d1 == d2 ) ;11 System . out . p r i n t l n ( d1 == d3 ) ;12 // t r u e & false

Vincent Guigue 2i002 - UML et mémoire 11/13

Page 23: 2i002 - UML (light), diagramme mémoire et pointeurs

Pointeur nullQue se passe-t-il quand on déclare une variable (sans l’instancier) ?

1 Po in t p ;

� p vaut null.� On peut écrire de manière équivalente1 Po in t p = nu l l ;

� On ne peut pas invoquer de méthode1 p . move ( 1 . , 2 . ) ; // => CRASH de l ’ e x é c u t i o n :2 // Nu l l P o i n t e r E x c e p t i o n

� N’importe quel objet peut être null et réciproquement, onpeut donner null à n’importe quel endroit où un objet estattendu... Même si ça provoque parfois des crashs.

1 // c l a s s e UnObjet ,2 // ( c l a s s e sans impor tance )3 . . .4 p u b l i c v o i d maFonction ( Po in t p ){5 . . .6 p . move ( 1 . , 1 . ) ;7 . . .8 }

1 // dans l e main2 UnObjet ob j = new UnObjet ( ) ;34 ob j . maFonction ( n u l l ) ;

Vincent Guigue 2i002 - UML et mémoire 12/13

Page 24: 2i002 - UML (light), diagramme mémoire et pointeurs

Pointeur nullQue se passe-t-il quand on déclare une variable (sans l’instancier) ?

1 Po in t p ;

� p vaut null.� On peut écrire de manière équivalente1 Po in t p = nu l l ;

� On ne peut pas invoquer de méthode1 p . move ( 1 . , 2 . ) ; // => CRASH de l ’ e x é c u t i o n :2 // Nu l l P o i n t e r E x c e p t i o n

� N’importe quel objet peut être null et réciproquement, onpeut donner null à n’importe quel endroit où un objet estattendu... Même si ça provoque parfois des crashs.

1 // c l a s s e UnObjet ,2 // ( c l a s s e sans impor tance )3 . . .4 p u b l i c v o i d maFonction ( Po in t p ){5 . . .6 p . move ( 1 . , 1 . ) ;7 . . .8 }

1 // dans l e main2 UnObjet ob j = new UnObjet ( ) ;34 ob j . maFonction ( n u l l ) ;

Vincent Guigue 2i002 - UML et mémoire 12/13

Page 25: 2i002 - UML (light), diagramme mémoire et pointeurs

Pointeur nullQue se passe-t-il quand on déclare une variable (sans l’instancier) ?

1 Po in t p ;

� p vaut null.� On peut écrire de manière équivalente1 Po in t p = nu l l ;

� On ne peut pas invoquer de méthode1 p . move ( 1 . , 2 . ) ; // => CRASH de l ’ e x é c u t i o n :2 // Nu l l P o i n t e r E x c e p t i o n

� N’importe quel objet peut être null et réciproquement, onpeut donner null à n’importe quel endroit où un objet estattendu... Même si ça provoque parfois des crashs.

1 // c l a s s e UnObjet ,2 // ( c l a s s e sans impor tance )3 . . .4 p u b l i c v o i d maFonction ( Po in t p ){5 . . .6 p . move ( 1 . , 1 . ) ;7 . . .8 }

1 // dans l e main2 UnObjet ob j = new UnObjet ( ) ;34 ob j . maFonction ( n u l l ) ;

Vincent Guigue 2i002 - UML et mémoire 12/13

Page 26: 2i002 - UML (light), diagramme mémoire et pointeurs

Execution d’une méthode

Une méthode est exécutée sur une instance...

1 Po in t p = new Po in t ( 1 , 2 ) ;2 Po in t p2 = p ;3 p . move ( 1 . , 1 . ) ;4 // méthode ex é cu t é e s u r l ’ i n s t a n c e5 // ( qu i e s t r é f é r e n c é e par p e t p2 )6 System . out . p r i n t l n ( p2 ) ;7 // [ x=2. , y =3. ]

) Il faut toujours se représenter se qui se passe dans la mémoirelors de l’exécution d’un programme.

Vincent Guigue 2i002 - UML et mémoire 13/13

Page 27: 2i002 - UML (light), diagramme mémoire et pointeurs

2i002 - Egalité entre objets, Clonage d’objet

Vincent Guigue

Vincent Guigue 2i002 - Egalité, clonage 1/6

Page 28: 2i002 - UML (light), diagramme mémoire et pointeurs

Problématique

� Le signe = se comporte de manière spécifique avec les objets...� Le signe == également spécifique avec les objets...

Vocabulaire (uniquement pour les opérations sur objets)

new Instanciation / Création d’instance

= Création de référence== Egalité référentielle

double x = 1double y = 2

PointPoint p

1 Po in t p = new Po in t ( 1 , 2 ) ;

2 Po in t q = p ;3 Po in t r = new Po in t ( 1 , 2 ) ;4 System . out . p r i n t l n ( ( p==q) +"�" + (p==r ) ) ; // t r u e f a l s e

Vincent Guigue 2i002 - Egalité, clonage 2/6

Page 29: 2i002 - UML (light), diagramme mémoire et pointeurs

Problématique

� Le signe = se comporte de manière spécifique avec les objets...� Le signe == également spécifique avec les objets...

Vocabulaire (uniquement pour les opérations sur objets)

new Instanciation / Création d’instance= Création de référence

== Egalité référentielle

double x = 1double y = 2

PointPoint pPoint q

1 Po in t p = new Po in t ( 1 , 2 ) ;2 Po in t q = p ;

3 Po in t r = new Po in t ( 1 , 2 ) ;4 System . out . p r i n t l n ( ( p==q) +"�" + (p==r ) ) ; // t r u e f a l s e

Vincent Guigue 2i002 - Egalité, clonage 2/6

Page 30: 2i002 - UML (light), diagramme mémoire et pointeurs

Problématique

� Le signe = se comporte de manière spécifique avec les objets...� Le signe == également spécifique avec les objets...

Vocabulaire (uniquement pour les opérations sur objets)

new Instanciation / Création d’instance= Création de référence

== Egalité référentielle

double x = 1double y = 2

PointPoint pPoint q

double x = 1double y = 2

PointPoint r

1 Po in t p = new Po in t ( 1 , 2 ) ;2 Po in t q = p ;3 Po in t r = new Po in t ( 1 , 2 ) ;4 System . out . p r i n t l n ( ( p==q) +"�" + (p==r ) ) ; // t r u e f a l s e

Vincent Guigue 2i002 - Egalité, clonage 2/6

Page 31: 2i002 - UML (light), diagramme mémoire et pointeurs

Comment dupliquer une instance ?

Idée (assez raisonnable somme toute)

Créer une nouvelle instance dont les valeurs des attributs sontidentiques

� Exemple de code dans la classe Point

1 pub l i c c l a s s Po in t {2 . . .3 pub l i c Po in t c l o n e ( ){4 re tu rn new Po in t ( x , y ) ;5 }6 }

� Usage :1 // main2 Po in t p = new Po in t ( 1 , 2 ) ;3 Po in t p2 = p . c l o n e ( ) ;

NB : construction de nouvelle instance sans new explicite dans le main

Vincent Guigue 2i002 - Egalité, clonage 3/6

Page 32: 2i002 - UML (light), diagramme mémoire et pointeurs

Clonage : syntaxe alternative

Avant le JAVA, il y avait le C++En C++ : la syntaxe standard = constructeur de copie

� Exemple de code dans la classe Point

1 // Con s t r u c t eu r de Po in t a p a r t i r d ’ un au t r e Po in t2 pub l i c Po in t ( Po in t p ){3 t h i s . x = p . x ; // t h i s f a c u l t a t i f4 t h i s . y = p . y ; // t h i s f a c u l t a t i f5 }

� Usage :1 Po in t p = new Po in t ( 1 , 2 ) ;2 Po in t p2 = new Po in t ( p ) ;

� Résultat ABSOLUMENT identique (depuis JAVA 1.5)� Avantage du clone en JAVA : il s’agit d’une méthode standard

(= + facile à lire)

Vincent Guigue 2i002 - Egalité, clonage 4/6

Page 33: 2i002 - UML (light), diagramme mémoire et pointeurs

Comment tester l’égalité structurelle ?

Idée (toujours assez raisonnable)

Créer une méthode qui teste l’égalité des attributs

� Solution 1 (simple mais pas utilisée)

1 // Dans l a c l a s s e Po in t

2 p u b l i c boo l e an e g a l i t e ( Po in t p ){

3 r e t u r n p . x == x && p . y == y ;

4 }

5 // e q u i v a l e n t s i m p l i f i é de

6 // i f ( p . x == x && p . y == y )

7 // r e t u r n t r u e

8 // e l s e

9 // r e t u r n f a l s e ;

1 // Dans l e main

2

3 Po in t p1 = new Po in t ( 1 . , 2 . ) ;

4 Po in t p2 = p1 ;

5 Po in t p3 = new Po in t ( 1 . , 2 . ) ;

6 Po in t p4 = new Po in t ( 1 . , 3 . ) ;

7

8 p1 . e g a l i t e ( p2 ) ; // t r u e

9 p1 . e g a l i t e ( p3 ) ; // t r u e

10 p1 . e g a l i t e ( p4 ) ; // f a l s e

- public boolean egalite(Point p) produit le résultat attendu

- ATTENTION à la signature :· la méthode retourne un booléen

· la méthode ne prend qu’un argument (on teste l’égalité entre

l’instance qui invoque la méthode et l’argument)

� Solution 2 : standard... mais un peu plus complexeVincent Guigue 2i002 - Egalité, clonage 5/6

Page 34: 2i002 - UML (light), diagramme mémoire et pointeurs

Méthode standard : boolean equals(Object o)

� equals existe dans tous les objets (comme toString)- mais teste l’égalité référentielle... Pas intéressant (commetoString)

� ) Redéfinition = faire en sorte de tester les attributsUn processus en plusieurs étapes :

1 Vérifier s’il y a égalité référentielle / pointeur null2 Vérifier le type de l’Object o (cf cours polymorphisme)3 Convertir l’Object o dans le type de la classe (idem)4 Vérifier l’égalité entre attributs

1 pub l i c boolean e qua l s ( Object ob j ) {2 i f ( t h i s == ob j ) re tu rn t rue ;3 i f ( ob j == nu l l ) re tu rn f a l s e ;4 i f ( g e tC l a s s ( ) != ob j . g e tC l a s s ( ) )5 re tu rn f a l s e ;6 Po in t o t h e r = ( Po in t ) ob j ;7 i f ( x != o th e r . x ) re tu rn f a l s e ;8 i f ( y != o th e r . y ) re tu rn f a l s e ;9 re tu rn t rue ;

10 }

Vincent Guigue 2i002 - Egalité, clonage 6/6

Page 35: 2i002 - UML (light), diagramme mémoire et pointeurs

2i002 - Cycle de vie des objets

Vincent Guigue

Vincent Guigue 2i002 - Cycle de vie des objets 1/10

Page 36: 2i002 - UML (light), diagramme mémoire et pointeurs

Cycle de vie : définition

Se placer du point de vue de l’objet :

(1) Instanciation Constructeur new

(2) Usage Invocation de méthodes

(3) Destruction Garbage collector

(1) création d’une

instance

(2) évolution de

l’instance

(3) condition de

destruction

Vincent Guigue 2i002 - Cycle de vie des objets 2/10

Page 37: 2i002 - UML (light), diagramme mémoire et pointeurs

(1) Instanciation

Coté fournisseur :

mise en route de l’objet

Instanciation = constructeur =contrat d’initialisation des attributs

Coté client :

création d’une instance

Instanciation = création d’une zonemémoire réservée à l’objet

1 // F i c h i e r Po in t . j a v a

2 p u b l i c c l a s s Po in t {

3 p r i v a t e doub l e x , y ;

4

5 p u b l i c Po in t ( doub l e x2 , doub l e y2 ){

6 x = x2 ;

7 y = y2 ;

8 }

9 }

1 // F i c h i e r Tes tPo in t . j a v a

2 p u b l i c c l a s s Tes tPo in t {

3 p u b l i c s t a t i c v o i d main

4 ( S t r i n g [ ] a r g s ){

5 // appe l du c o n s t r u c t e u r

6 // avec des v a l e u r s c h o i s i e s

7 Po in t p1 = new Po in t ( 1 . , 2 . ) ;

8 }

9 }

La variable p1, de type Point, référence un instance de Point dont

les attributs ont pour valeur 1 et 2.

Vincent Guigue 2i002 - Cycle de vie des objets 3/10

Page 38: 2i002 - UML (light), diagramme mémoire et pointeurs

(1) Instanciation

Coté fournisseur :

mise en route de l’objet

Instanciation = constructeur =contrat d’initialisation des attributs

Coté client :

création d’une instance

Instanciation = création d’une zonemémoire réservée à l’objet

1 // F i c h i e r Po in t . j a v a

2 p u b l i c c l a s s Po in t {

3 p r i v a t e doub l e x , y ;

4

5 p u b l i c Po in t ( doub l e x2 , doub l e y2 ){

6 x = x2 ;

7 y = y2 ;

8 }

9 }

1 // F i c h i e r Tes tPo in t . j a v a

2 p u b l i c c l a s s Tes tPo in t {

3 p u b l i c s t a t i c v o i d main

4 ( S t r i n g [ ] a r g s ){

5 // appe l du c o n s t r u c t e u r

6 // avec des v a l e u r s c h o i s i e s

7 Po in t p1 = new Po in t ( 1 . , 2 . ) ;

8 }

9 }

double x = 1double y = 2

PointPoint p1

La variable p1, de type Point, référence un instance de Point dont

les attributs ont pour valeur 1 et 2.

Vincent Guigue 2i002 - Cycle de vie des objets 3/10

Page 39: 2i002 - UML (light), diagramme mémoire et pointeurs

(2) Usage

� le fournisseur développe et garantit le bon fonctionnement desméthodes pour utiliser l’objet correctement,

� le client invoque les méthodes sur des objets pour les manipuler.

1 // F i c h i e r Po in t . j a v a

2 p u b l i c c l a s s Po in t {

3 p r i v a t e doub l e x , y ;

4 p u b l i c Po in t ( doub l e x2 , doub l e y2 ){

5 x = x2 ; y = y2 ;

6 }

7

8 p u b l i c v o i d move ( doub l e dx ,

9 doub l e dy ){

10 x += dx ; y += dy ;

11 }

12 . . .

13 }

1 // F i c h i e r Tes tPo in t . j a v a

2 p u b l i c c l a s s Tes tPo in t {

3 p u b l i c s t a t i c v o i d main

4 ( S t r i n g [ ] a r g s ){

5 // appe l du c o n s t r u c t e u r

6 // avec des v a l e u r s c h o i s i e s

7 Po in t p1 = new Po in t ( 1 . , 2 . ) ;

8 p1 . move ( 2 . , 3 . ) ;

9 // p1 => [ x=3, y=5]

10 }

11 }

Vincent Guigue 2i002 - Cycle de vie des objets 4/10

Page 40: 2i002 - UML (light), diagramme mémoire et pointeurs

(3) Destruction

1 Un objet est détruit lorsqu’il n’est plus référencé

2 La destruction est implicite (contrairement au C++) et traitée

en tâche de fond (garbage collector)

� Un objet peut être référencé plusieurs fois...

1 // F i c h i e r Tes tPo in t . j a v a2 pub l i c c l a s s Tes tPo in t {3 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){4 // appe l du c o n s t r u c t e u r5 // avec des v a l e u r s c h o i s i e s6 Po in t p1 = new Po in t ( 1 . , 2 . ) ;7 Po in t p2 = p1 ;8 }9 }

� mais quand est-il dé-référencé ?

Vincent Guigue 2i002 - Cycle de vie des objets 5/10

Page 41: 2i002 - UML (light), diagramme mémoire et pointeurs

(3) Destruction

1 Un objet est détruit lorsqu’il n’est plus référencé

2 La destruction est implicite (contrairement au C++) et traitée

en tâche de fond (garbage collector)

� Un objet peut être référencé plusieurs fois...

1 // F i c h i e r Tes tPo in t . j a v a2 pub l i c c l a s s Tes tPo in t {3 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){4 // appe l du c o n s t r u c t e u r5 // avec des v a l e u r s c h o i s i e s6 Po in t p1 = new Po in t ( 1 . , 2 . ) ;7 Po in t p2 = p1 ;8 }9 }

double x = 1double y = 2

Point

Point p1

Point p2

� mais quand est-il dé-référencé ?

Vincent Guigue 2i002 - Cycle de vie des objets 5/10

Page 42: 2i002 - UML (light), diagramme mémoire et pointeurs

Dé-référencement d’un objet

double x = 1double y = 2

Point

Point p1

Point p2

1 Dé-référencement explicite (usage de =

1 // F i c h i e r Tes tPo in t . j a v a2 pub l i c c l a s s Tes tPo in t {3 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){4 // appe l du c o n s t r u c t e u r5 // avec des v a l e u r s c h o i s i e s6 Po in t p1 = new Po in t ( 1 . , 2 . ) ;7 Po in t p2 = p1 ;

8 p2 = new Po in t ( 2 . 5 , 3 . ) ;9 }

10 }

2 Dé-référencement implicite (logique de bloc,

destruction de variables ) destruction de références)

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 {3 Po in t p1 = new Po in t ( 1 , 2 ) ;4 System . out . p r i n t l n ( p1 ) ;5 }6 System . out . p r i n t l n ( p1 ) ;7 // ERREUR DE COMPILATION8 // p1 n ’ e x i s t e p l u s i c i !9 }

Vincent Guigue 2i002 - Cycle de vie des objets 6/10

Page 43: 2i002 - UML (light), diagramme mémoire et pointeurs

Dé-référencement d’un objet

1 Dé-référencement explicite (usage de =

1 // F i c h i e r Tes tPo in t . j a v a2 pub l i c c l a s s Tes tPo in t {3 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){4 // appe l du c o n s t r u c t e u r5 // avec des v a l e u r s c h o i s i e s6 Po in t p1 = new Po in t ( 1 . , 2 . ) ;7 Po in t p2 = p1 ;8 p2 = new Po in t ( 2 . 5 , 3 . ) ;9 }

10 }

double x = 1double y = 2

Point

Point p1

Point p2 double x = 2.5double y = 3

Point

2 Dé-référencement implicite (logique de bloc,

destruction de variables ) destruction de références)

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 {3 Po in t p1 = new Po in t ( 1 , 2 ) ;4 System . out . p r i n t l n ( p1 ) ;5 }6 System . out . p r i n t l n ( p1 ) ;7 // ERREUR DE COMPILATION8 // p1 n ’ e x i s t e p l u s i c i !9 }

Vincent Guigue 2i002 - Cycle de vie des objets 6/10

Page 44: 2i002 - UML (light), diagramme mémoire et pointeurs

Dé-référencement d’un objet

1 Dé-référencement explicite (usage de =

1 // F i c h i e r Tes tPo in t . j a v a2 pub l i c c l a s s Tes tPo in t {3 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){4 // appe l du c o n s t r u c t e u r5 // avec des v a l e u r s c h o i s i e s6 Po in t p1 = new Po in t ( 1 . , 2 . ) ;7 Po in t p2 = p1 ;8 p2 = new Po in t ( 2 . 5 , 3 . ) ;9 }

10 }

double x = 1double y = 2

PointPoint p1

2 Dé-référencement implicite (logique de bloc,

destruction de variables ) destruction de références)

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 {3 Po in t p1 = new Po in t ( 1 , 2 ) ;4 System . out . p r i n t l n ( p1 ) ;5 }

6 System . out . p r i n t l n ( p1 ) ;7 // ERREUR DE COMPILATION8 // p1 n ’ e x i s t e p l u s i c i !9 }

Vincent Guigue 2i002 - Cycle de vie des objets 6/10

Page 45: 2i002 - UML (light), diagramme mémoire et pointeurs

Dé-référencement d’un objet

1 Dé-référencement explicite (usage de =

1 // F i c h i e r Tes tPo in t . j a v a2 pub l i c c l a s s Tes tPo in t {3 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){4 // appe l du c o n s t r u c t e u r5 // avec des v a l e u r s c h o i s i e s6 Po in t p1 = new Po in t ( 1 . , 2 . ) ;7 Po in t p2 = p1 ;8 p2 = new Po in t ( 2 . 5 , 3 . ) ;9 }

10 }

2 Dé-référencement implicite (logique de bloc,

destruction de variables ) destruction de références)

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 {3 Po in t p1 = new Po in t ( 1 , 2 ) ;4 System . out . p r i n t l n ( p1 ) ;5 }6 System . out . p r i n t l n ( p1 ) ;

7 // ERREUR DE COMPILATION8 // p1 n ’ e x i s t e p l u s i c i !9 }

Vincent Guigue 2i002 - Cycle de vie des objets 6/10

Page 46: 2i002 - UML (light), diagramme mémoire et pointeurs

Dé-référencement d’un objet

1 Dé-référencement explicite (usage de =

1 // F i c h i e r Tes tPo in t . j a v a2 pub l i c c l a s s Tes tPo in t {3 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){4 // appe l du c o n s t r u c t e u r5 // avec des v a l e u r s c h o i s i e s6 Po in t p1 = new Po in t ( 1 . , 2 . ) ;7 Po in t p2 = p1 ;8 p2 = new Po in t ( 2 . 5 , 3 . ) ;9 }

10 }

2 Dé-référencement implicite (logique de bloc,

destruction de variables ) destruction de références)

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 {3 Po in t p1 = new Po in t ( 1 , 2 ) ;4 System . out . p r i n t l n ( p1 ) ;5 }6 System . out . p r i n t l n ( p1 ) ;7 // ERREUR DE COMPILATION8 // p1 n ’ e x i s t e p l u s i c i !9 }

double x = 1double y = 2

PointPoint p1

Vincent Guigue 2i002 - Cycle de vie des objets 6/10

Page 47: 2i002 - UML (light), diagramme mémoire et pointeurs

Retour sur la logique de bloc...

1 le dé-référencement dépend de l’endroit où la variable est

déclarée (pas de l’endroit où la variable est initialisée)

2 ne pas confondre la destruction d’une variable et la

destruction d’une instance

1 pub l i c s t a t i c

2 vo id main ( S t r i n g [ ] a r g s ) {3

4

5 {6 Po in t p1 =7 new Po in t ( 1 , 2 ) ;8 System . out . p r i n t l n ( p1 ) ;9 } // d e s t r u c t i o n de

10 // l a v a r i a b l e p111

12 System . out . p r i n t l n ( p1 ) ;13 // ERREUR DE COMPILATION14 // p1 n ’ e x i s t e p l u s i c i !15 }

1 pub l i c s t a t i c

2 vo id main ( S t r i n g [ ] a r g s ) {3 Po in t p1 ; // d é c l a r a t i o n4 // avant l e b l o c5 {6 // i n i t i a l i s a t i o n de p17 p1 = new Po in t ( 1 , 2 ) ;8 System . out . p r i n t l n ( p1 ) ;9 } // pas de d e s t r u c t i o n de p1

10

11

12 System . out . p r i n t l n ( p1 ) ;13 // OK, pas de prob lème14

15 }

Vincent Guigue 2i002 - Cycle de vie des objets 7/10

Page 48: 2i002 - UML (light), diagramme mémoire et pointeurs

Retour sur la logique de bloc (2)

1 le dé-référencement dépend de l’endroit où la variable est

déclarée (pas de l’endroit où la variable est initialisée)

2 ne pas confondre la destruction d’une variable et la

destruction d’une instance

1 pub l i c s t a t i c

2 vo id main ( S t r i n g [ ] a r g s ) {3 Po in t p1 ; // d é c l a r a t i o n4 // avant l e b l o c5 {6 Po in t p2 = new Po in t ( 1 , 2 ) ;7 // i n i t i a l i s a t i o n de p18 p1 = p2 ;9 System . out . p r i n t l n ( p1 ) ;

10 } // d e s t r u c t i o n de p211

12 System . out . p r i n t l n ( p1 ) ;13 // OK, pas de prob lème14 }

double x = 1double y = 2

Point

Point p1

Point p2

� Fin de bloc = destruction des variables déclarées dans le bloc

� Destruction d’instance , instance plus référencée

Vincent Guigue 2i002 - Cycle de vie des objets 8/10

Page 49: 2i002 - UML (light), diagramme mémoire et pointeurs

Destruction des instances

Destruction d’instance , instance plus référencée

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 Po in t p1 = new Po in t ( 1 , 2 ) ;3 p1 = nu l l ;4 } double x = 1

double y = 2

Point

Point p1

� Pas besoin d’expliquer comment détruire un objet ( 6= C++)

� Le Garbage Collector planifie la destruction

1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

2 . . .

3 f o r ( i n t i =0; i <10; i ++){

4 // o p t im i s a t i o n p o s s i b l e :

5 // r é u t i l i s a t i o n de l a mémoire a l l o u é e

6 Po in t p1 = new Po in t ( ( i n t ) ( Math . random ()⇤10 ) ,

7 ( i n t ) ( Math . random ( )⇤ 1 0 ) ) ;

8 . . .

9 }

10 }

� Appel explicite au garbage collector (pour libérer la mémoire) :

1 System . gc ( ) ;

Vincent Guigue 2i002 - Cycle de vie des objets 9/10

Page 50: 2i002 - UML (light), diagramme mémoire et pointeurs

Destruction des instances

Destruction d’instance , instance plus référencée

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 Po in t p1 = new Po in t ( 1 , 2 ) ;3 p1 = nu l l ;4 } double x = 1

double y = 2

Point

Point p1

� Pas besoin d’expliquer comment détruire un objet ( 6= C++)

� Le Garbage Collector planifie la destruction

1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

2 . . .

3 f o r ( i n t i =0; i <10; i ++){

4 // o p t im i s a t i o n p o s s i b l e :

5 // r é u t i l i s a t i o n de l a mémoire a l l o u é e

6 Po in t p1 = new Po in t ( ( i n t ) ( Math . random ()⇤10 ) ,

7 ( i n t ) ( Math . random ( )⇤ 1 0 ) ) ;

8 . . .

9 }

10 }

� Appel explicite au garbage collector (pour libérer la mémoire) :

1 System . gc ( ) ;

Vincent Guigue 2i002 - Cycle de vie des objets 9/10

Page 51: 2i002 - UML (light), diagramme mémoire et pointeurs

Le mot de la fin...

... sur un exemple parlant :

1 Po in t p = new Po in t ( 1 , 2 ) ;

2 Po in t p2 = new Po in t ( 3 , 4 ) ;

3 // Po in t p3 = p ; // d i f f é r e n c e avec e t sans c e t t e l i g n e

4 p = p2 ;

� Cas 1 : ligne commentée.

- L’instance Point(1,2) est détruite à l’issue dure-référencement de p...

- ... de toutes façons, cette instance était inaccessible.

1 Po in t p = new Po in t ( 1 , 2 ) ;

2 Po in t p2 = new Po in t ( 3 , 4 ) ;

3 Po in t p3 = p ; // d i f f é r e n c e avec e t sans c e t t e l i g n e

4 p = p2 ;

� Cas 2 : ligne dé-commentée

- L’instance Point(1,2) est conservée...- On y accède par la variable p3

Vincent Guigue 2i002 - Cycle de vie des objets 10/10

Page 52: 2i002 - UML (light), diagramme mémoire et pointeurs

Le mot de la fin...

... sur un exemple parlant :

1 Po in t p = new Po in t ( 1 , 2 ) ;

2 Po in t p2 = new Po in t ( 3 , 4 ) ;

3 // Po in t p3 = p ; // d i f f é r e n c e avec e t sans c e t t e l i g n e

4 p = p2 ;

� Cas 1 : ligne commentée.

- L’instance Point(1,2) est détruite à l’issue dure-référencement de p...

- ... de toutes façons, cette instance était inaccessible.

1 Po in t p = new Po in t ( 1 , 2 ) ;

2 Po in t p2 = new Po in t ( 3 , 4 ) ;

3 Po in t p3 = p ; // d i f f é r e n c e avec e t sans c e t t e l i g n e

4 p = p2 ;

� Cas 2 : ligne dé-commentée

- L’instance Point(1,2) est conservée...- On y accède par la variable p3

Vincent Guigue 2i002 - Cycle de vie des objets 10/10

Page 53: 2i002 - UML (light), diagramme mémoire et pointeurs

Le mot de la fin...

... sur un exemple parlant :

1 Po in t p = new Po in t ( 1 , 2 ) ;

2 Po in t p2 = new Po in t ( 3 , 4 ) ;

3 // Po in t p3 = p ; // d i f f é r e n c e avec e t sans c e t t e l i g n e

4 p = p2 ;

� Cas 1 : ligne commentée.

- L’instance Point(1,2) est détruite à l’issue dure-référencement de p...

- ... de toutes façons, cette instance était inaccessible.

1 Po in t p = new Po in t ( 1 , 2 ) ;

2 Po in t p2 = new Po in t ( 3 , 4 ) ;

3 Po in t p3 = p ; // d i f f é r e n c e avec e t sans c e t t e l i g n e

4 p = p2 ;

� Cas 2 : ligne dé-commentée

- L’instance Point(1,2) est conservée...- On y accède par la variable p3

Vincent Guigue 2i002 - Cycle de vie des objets 10/10