Question

  1. Lorsqu'un objet est instancié en Java, qu'est-ce qui va réellement dans la mémoire?
  2. Des copies des constructeurs parents sont-elles incluses?
  3. Pourquoi les membres de données masqués se comportent-ils différemment des méthodes remplacées lors de la diffusion?

Je comprends les explications abstraites généralement données pour vous aider à utiliser ces éléments correctement, mais comment la JVM le fait-elle vraiment.

Était-ce utile?

La solution

Lorsqu'un objet est instancié, seules les données non statiques sont réellement "créées", avec une référence au type d'objet qui les a créées.

Aucune de ces méthodes n'est jamais copiée.

Le " Référence " à la classe qui l'a créé est en fait une table de distribution de pointeur. Il existe un pointeur pour chaque méthode disponible pour la classe. Les pointeurs pointent toujours vers le " correct " (généralement la plus basse / la plus spécifique dans l’arborescence des objets), implémentation de la méthode.

Ainsi, si vous avez un appel de niveau supérieur à une autre méthode, mais que cette autre méthode a été remplacée, la méthode remplacée sera appelée, car c’est là que le pointeur de la table pointe. En raison de ce mécanisme, l'appel d'une méthode substituée ne devrait pas prendre plus de temps qu'une méthode de niveau supérieur.

La table de pointeur + les variables membres constituent "l’instance". d'une classe.

Le problème de la variable concerne un mécanisme complètement différent, les "espaces de noms". Les variables ne sont pas " Subclassed " du tout (ils ne vont pas dans la table de répartition), mais les variables publiques ou protégées peuvent être masquées par des variables locales. Tout cela est fait par le compilateur au moment de la compilation et n'a rien à voir avec vos instances d'objet d'exécution. Le compilateur détermine quel objet vous voulez vraiment et en ajoute une référence dans votre code.

Les règles de délimitation visent généralement à privilégier l'option "Le plus proche". variable. Tout ce qui est éloigné du même nom sera simplement ignoré (ombré) au profit de la définition la plus proche.

Pour en savoir plus sur l’allocation de mémoire si vous êtes intéressé: tous les "OBJECTS" sont alloués sur le "& tas; tas" & (En réalité, quelque chose de incroyablement plus efficace et beau qu'un vrai tas, mais le même concept.) Les variables sont toujours des pointeurs - Java ne copie jamais un objet, vous copiez toujours un pointeur sur cet objet. Les allocations de pointeur de variable pour les paramètres de méthode et les variables locales sont effectuées sur la pile, mais même si la variable (pointeur) est créée sur la pile, les objets pointés ne sont toujours pas alloués sur la pile.

Je suis tenté d’écrire un exemple, mais c’est déjà trop long. Si vous voulez que je tape quelques classes avec une relation d’extension et comment leurs méthodes et leurs données affectent le code généré, je peux… demander.

Autres conseils

Je pense que vous constaterez qu'il s'agit d'un exemple complet:

http://www.onjava.com /pub/a/onjava/2005/01/26/classloading.html

  1. La mémoire est allouée à partir du segment de mémoire pour contenir toutes les variables d'instance et les données spécifiques à l'implémentation de l'objet et de ses super classes. Les données spécifiques à l'implémentation incluent des pointeurs sur les données de classe et de méthode.

  2. Les variables d'instance des objets sont initialisées à leurs valeurs par défaut.

  3. Le constructeur de la classe la plus dérivée est appelé. La première chose qu’un constructeur fait est d’appeler le constructeur pour sa majuscule. Ce processus se poursuit jusqu’à ce que le constructeur de java.lang.Object soit appelé, java.lang.Object étant la classe de base de tous les objets java.

  4. Avant que le corps du constructeur ne soit exécuté, tous les initialiseurs de variables d'instance et les blocs d'initialisation sont exécutés. Ensuite, le corps du constructeur est exécuté. Ainsi, le constructeur de la classe de base se termine en premier et le constructeur de la classe la plus dérivée se termine en dernier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top