java:memoire
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
java:memoire [2013/11/04 14:25] – [Construction d'objets] bruno | java:memoire [2013/11/04 16:11] (Version actuelle) – [Java l'amnésique] bruno | ||
---|---|---|---|
Ligne 508: | Ligne 508: | ||
{{ : | {{ : | ||
+ | Vous vous rappelez du " | ||
+ | |||
+ | C'est le processus de java qui s' | ||
+ | |||
+ | La dernière figure vous permettra de bien comprendre comment il fonctionne: tant qu'une zone de la mémoire reçoit une flèche, ça veut dire qu' | ||
+ | |||
+ | Une zone de mémoire qui ne reçoit plus de flèche est une zone dont les données ne pourront jamais être récupérées: | ||
+ | |||
+ | |||
+ | ==== Et les tableaux d' | ||
+ | |||
+ | Que se passe-t-il dans le cas de tableaux d' | ||
+ | |||
+ | Réfléchissez, | ||
+ | |||
+ | ===== Java l' | ||
+ | |||
+ | Et pour finir, parlons des pertes de mémoires de java! Je veux parler du problème suivant: | ||
+ | |||
+ | <code java> | ||
+ | Object o1 = new Object(); | ||
+ | Object o2 = new Animal(" | ||
+ | Object o3 = new Animal(" | ||
+ | Object o4 = new Pingouin(" | ||
+ | |||
+ | o4.jouer(); | ||
+ | |||
+ | o4.glisser(); | ||
+ | </ | ||
+ | |||
+ | Le compilateur java nous indique deux erreurs: | ||
+ | |||
+ | < | ||
+ | TypeConstruit.java: | ||
+ | o4.jouer(); | ||
+ | ^ | ||
+ | symbol: | ||
+ | location: variable o4 of type Object | ||
+ | TypeConstruit.java: | ||
+ | o4.glisser(); | ||
+ | ^ | ||
+ | symbol: | ||
+ | location: variable o4 of type Object | ||
+ | 2 errors | ||
+ | |||
+ | </ | ||
+ | |||
+ | Pourtant, //o4// a été construit avec un constructeur de // | ||
+ | |||
+ | Rappelez-vous que javac n'est qu'un programme, pas toujours très intelligent donc! | ||
+ | |||
+ | Ce que javac voit, c'est que //o4// est déclaré comme //Object//. | ||
+ | |||
+ | Il cherche donc les méthodes //jouer()// et // | ||
+ | |||
+ | Pourtant, si on regarde le dernier schéma, on voit bien que ces méthodes sont chargées dans la mémoire! | ||
+ | |||
+ | Il va donc falloir explicitement dire à Java de regarder un peu plus en détail. C'est le fameux **cast** ou **transtypage** que nous avons déjà vu avec les types primitifs, sauf que là il ne peut y avoir perte de données: soit l' | ||
+ | |||
+ | Nous allons donc définir une variable et lui dire de pointer dans la même zone mémoire que //o4//, en demandant à java d' | ||
+ | |||
+ | <code java> | ||
+ | Object o4 = new Pingouin(" | ||
+ | /* ça marche pas! | ||
+ | o4.jouer(); | ||
+ | o4.glisser(); | ||
+ | |||
+ | Animal a = (Animal)o4; | ||
+ | a.jouer(); | ||
+ | |||
+ | ((Pingouin)o4).glisser(); | ||
+ | </ | ||
+ | |||
+ | Je vous ai mis deux manières de faire: | ||
+ | * dans le premier cas, je déclare une variable //a//, et après j' | ||
+ | * dans le deuxième cas, je fais directement le cast sans passer par une variable: java créera une variable temporaire et appellera ensuite la méthode glisser(). | ||
+ | |||
+ | Et la question de la fin pour voir si vous avez bien compris: | ||
+ | |||
+ | // | ||
+ | |||
+ | ===== Codes complet des exemples ===== | ||
+ | |||
+ | Archive du code au format tar.gz : {{: | ||
+ | |||
+ | Vous pouvez exporter ce TP en pdf en utilisant le lien du menu de gestion de cette page (le dernier, petite icône en crayon) | ||
java/memoire.1383575151.txt.gz · Dernière modification : 2013/11/04 14:25 de bruno