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 [2025/11/18 14:04] (Version actuelle) – [Les types "pointeurs"] bruno | ||
|---|---|---|---|
| Ligne 270: | Ligne 270: | ||
| </ | </ | ||
| - | Java se contente de mettre sa table de correspondance à jour, et ne crée par un nouvel espace mémoire: effectivement, | + | Java se contente de mettre sa table de correspondance à jour, et ne crée pas un nouvel espace mémoire: effectivement, |
| **Ce type d' | **Ce type d' | ||
| 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