2i002 - uml (light), diagramme mémoire et pointeurs
TRANSCRIPT
2i002 - UML (light), diagramme mémoire et
pointeurs
Vincent Guigue
Vincent Guigue 2i002 - UML et mémoire 1/13
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
2i002 - Egalité entre objets, Clonage d’objet
Vincent Guigue
Vincent Guigue 2i002 - Egalité, clonage 1/6
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
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
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
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
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
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
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
2i002 - Cycle de vie des objets
Vincent Guigue
Vincent Guigue 2i002 - Cycle de vie des objets 1/10
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
(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
(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
(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
(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
(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
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
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
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
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
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
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
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
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
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
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
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
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