Que se passe-t-il exactement dans Java lorsque vous instanciez plusieurs fois le même objet?
Par exemple:
Test test = new Test();
puis plus tard, je l'appellerai à nouveau, Test test = new Test();
à nouveau ou à l'intérieur d'une boucle. L'instanciation précédente sera-t-elle supprimée?
1: Quelques mots: nous n'instancions pas du tout les objets, nous instancions les classes, et le produit d'une instanciation de classe est un objet (également appelé instance). Bien sûr, nous pouvons instancier une classe autant de fois que nécessaire pour créer un objet nouveau et différent à chaque instanciation.
2: Quoi qu'il en soit, vous ne pouvez pas avoir le code que vous proposez:
Test test = new Test();
Test test = new Test();
ni vous pouvez avoir ceci:
for (i=0; i<3; i++) {
Test test = new Test();
Test test = new Test();
}
Aucun ne sera compilé, car la partie Test test
est la déclaration de la variable test
(de type Test
), et aucun langage, y compris Java, ne permet de déclarer deux fois la même variable dans la même étendue.
Cependant vous pouvez assigner plusieurs fois la même variable (comme son nom l'indique), avec des objets différents, comme ceci:
Test test = new Test();
test = new Test();
La première ligne déclare test
et lui affecte un objet nouvellement créé. La deuxième ligne affecte à test
un autre objet, également nouvellement créé.
Notez également que les raccourcis sont autorisés en Java:
for (i=0; i<3; i++) {
Test test = new Test();
}
Cette boucle ne déclarera pas test
3 fois. Il s'agit d'assigner trois nouveaux objets différents en séquence à la variable test
qui ne sera déclarée qu'une seule fois. (comparer avec la boucle précédente).
3: Qu'arrive-t-il à la variable test
et aux deux objets de type Test
?
La variable test
se voit d'abord attribuer la référence d'un objet, puis d'un autre objet. Une variable ne conserve que la dernière référence affectée.
Le premier objet de type Test
n'est plus affecté à test
. Si aucune autre variable n'a été affectée à sa référence, alors cet objet ne peut en aucun cas être accédé par le programme, et est donc inutile. Il est rendu éligible au ramassage des ordures par le système. À un moment donné, le système (la JVM) exécutera son garbage collector qui l'effacera de la mémoire.
Le deuxième objet vivra tant qu’au moins une variable le référencera, puis le garbage collector s’en occupera également et l’apportera au cimetière des objets non référencés. C'est la vraie vie des objets Java :-(