« Programmation Java/Instanciation et cycle de vie » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 156 :
 
== Représentation des objets dans la mémoire ==
 
=== La pile ===
L'instruction <code>new</code> alloue la mémoire sur le tas pour les objets et les tableaux.
{{...}}
 
=== Le tas ===
La création d'un objet de classe C qui hérite de la classe B, elle-même héritant de la classe A, se déroule à peu près de la manière suivante :
=== Objets dans la pile ===
* Pour chacune des classes de la hiérarchie en partant de la classe racine (ordre A, B, C pour l'exemple), si cela n'a pas déjà été fait auparavant :
=== Constantes et membres static ===
** Charger la classe (Class, code des méthodes, ...), en lui allouant également l'espace nécessaire pour ses variables membres statiques.
=== Attributs ===
** Initialiser les variables membres statiques de la classe en appelant la méthode spéciale <code>&lt;clinit&gt;</code> qui contient la concaténation des assignations des membres statiques et des blocs de code statiques.
* Allocation de l'espace mémoire pour les membres d'instance de la classe C incluant les membres déclarés ainsi que ceux hérités des classes B et A.
* Appel [[#Les constructeurs|au constructeur]] (méthode spéciale <code>&lt;init&gt;</code>) de la classe C correspondant aux arguments fournis en lui passant la référence à la zone mémoire allouée dans <code>this</code> :
** Sa première instruction est un appel explicite ou implicite à un constructeur de la classe B (lui-même appelant un constructeur de la classe A).
** Les instructions suivantes sont la concaténation des assignations des membres d'instance et des blocs de code non statiques.
** Enfin, les instructions définies explicitement dans le constructeur sont appelées.
 
La création d'un tableau avec l'instruction <code>new</code> se déroule de la même façon (sachant que tout type de tableau hérite de la classe <code>java.lang.Object</code>), en allouant la place nécessaire pour le type des éléments multipliée par le nombre d'éléments voulu.
 
=== LaLe tas et la pile ===
 
Le tas est la zone mémoire où sont alloués les éléments de tableaux et les membres des objets.
C'est une zone mémoire très grande, partagée par tous [[../Processus légers et synchronisation|les processus légers (threads)]] de l'application Java.
C'est pourquoi l'accès à un même objet ou tableau par plusieurs threads nécessite des moyens de synchronisation.
 
La pile est une zone mémoire locale limitée, alloué pour chaque processus léger (thread).
Cette zone sert de stockage temporaire aux appels de méthodes pour y stocker la valeur des arguments, des variables locales, et de manière interne la valeur de retour.
 
<syntaxhighlight lang="java">
public class Test
{
int a;
int b = 50;
String c;
String d = "test";
 
// Code inclus dans tous les constructeurs :
{
c = d.toUpperCase();
System.out.println("C = "+c);
}
 
public static Object creerTest()
{
Object o; // Une référence nulle, allouée sur la pile
o = new Test(); // Objet alloué sur le tas
return o; // La méthode retourne la référence à l'objet alloué dans le tas
}
}
</syntaxhighlight >