Maison  >  Article  >  Java  >  Explication détaillée du problème de création d'objets de classe parent dans l'héritage Java

Explication détaillée du problème de création d'objets de classe parent dans l'héritage Java

PHP中文网
PHP中文网original
2017-06-20 10:18:431737parcourir

Il est vrai que le constructeur de classe parent est appelé, mais l'objet de classe parent n'est pas créé du tout, mais le constructeur de classe parent est appelé pour initialiser les propriétés.

C'est vraiment absurde de dire qu'appeler la méthode constructeur de classe parent équivaut à créer un objet de classe parent.
La nouvelle instruction ouvre un espace, qui est utilisé pour stocker diverses références d'attributs d'objets. Si vous décompilez le bytecode, vous constaterez qu'il n'y a qu'une seule nouvelle instruction, donc un espace est ouvert et un objet est placé dedans. chaque espace.
Ensuite, la sous-classe appelle les propriétés, méthodes, etc. de la classe parent, qui n'est pas un objet instancié.
Dans le bytecode, la sous-classe aura un index de classe parent de type u2, qui appartient au type CONSTANT_Class_info peut être trouvé via la description de CONSTANT_Class_info, puis la classe parent spécifiée peut être trouvée.
Dans votre méthode, les noms d'attributs sont analysés à ce sujet, puis le contenu réel de la variable est stocké dans l'espace créé par new. . .
Le super mot-clé accède uniquement aux données dans une partie spécifique de cet espace (c'est-à-dire la partie de la mémoire dédiée au stockage des données de la classe parent). . . . . .

Le hashcode par défaut et ses égaux (directement utilisés == comparaison) sont les mêmes, donc c'est fondamentalement dans le même espace, et il n'y a pas d'objet de classe parent séparé.


Si une sous-classe peut être convertie de force en classe parent pour être utilisée, c'est parce que la machine virtuelle Java a les concepts de type statique (type d'apparence) et de type réel.
Par exemple, Object t=new Point(2,3);
Ensuite, Object appartient au type statique (type d'apparence) et Point appartient au type réel.
Le type statique et le type réel peuvent changer dans le programme. La différence est que le changement de type statique ne se produit que lors de son utilisation, tandis que le type statique de la variable elle-même ne changera pas et que le type statique final est connu pendant. compilation. ;Le résultat du changement du type réel de la variable ne peut être déterminé que pendant l'exécution. Le compilateur ne sait pas quel est le type réel de la variable lors de la compilation


Mémoire de objet java La disposition est déterminée par la classe à laquelle appartient l'objet. On peut aussi dire que lorsqu'une classe est chargée dans la machine virtuelle, la disposition des objets créés par cette classe a déjà été déterminée.

Disposition de la mémoire des objets Java dans Hotspot :
Chaque objet Java se compose d'un en-tête d'objet et d'un corps d'objet en mémoire.

L'en-tête de l'objet stocke les méta-informations de l'objet, y compris la référence à l'objet Class auquel l'objet appartient et certaines informations sur le hashcode et le moniteur.
Le corps de l'objet stocke principalement les champs d'instance de l'objet Java lui-même et les champs d'instance hérités de la classe parent, et la disposition interne satisfait aux règles suivantes :
Règle 1 : Tout objet est traité avec une granularité de 8 octets alignés.
Règle 2 : Les champs d'instance sont classés selon la priorité suivante : types longs et doubles ; types entiers et virgule flottante ; types caractères et types entiers courts ; types octets et types booléens, et enfin types référence. Ces champs d'instance sont alignés en fonction de leurs unités respectives.
Règle 3 : Les champs d'instance dans différentes relations d'héritage de classe ne peuvent pas être mélangés. Tout d'abord, les champs d'instance de la classe parent sont traités conformément à la règle 2, suivis par les champs d'instance de la sous-classe.
Règle 4 : Si la distance entre le dernier membre de la classe parent et le premier membre de la sous-classe est inférieure à 4 octets, elle doit être étendue à l'unité de base de 4 octets.
Règle 5 : Si le champ de première instance de la sous-classe est un double précision ou un entier long et que la classe parent n'a pas utilisé 8 octets, la JVM enfreindra la règle 2, selon l'entier (int), l'entier court ( court), type d'octet (octet), séquence de type de référence (référence), remplissant l'espace non rempli.

Ce qui précède sont les règles pour la disposition de la mémoire des objets Java.

Parlons ensuite de la méthode d'instanciation des objets Java, qui est la méthode
Lorsque nous créons un nouvel objet, le jvm a en fait alloué tout l'espace de l'objet et la disposition du domaine d'instance de l'objet entier a été déterminée.
La méthode d'instanciation consiste à définir la valeur du champ d'instance d'objet sur l'espace correspondant.

La méthode commence par appeler la méthode de la classe parent et se termine par sa propre méthode constructeur. La relation de position entre la déclaration du champ d'instance et le bloc d'instruction d'initialisation de l'instance affectera l'ordre du bytecode de la méthode

Illustrons avec un exemple :
class Parent {
private short six;
private int age;
}

class Sub extend Parent{
private String name;
private int age;
private float price;
>

La disposition de la mémoire de l'objet Sub actuel est la suivante :
super représente ce qu'on appelle le parent espace de stockage de classe Qu'est-ce que cela signifie ?
Je pense que le super rangement ici est le vert !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn