recherche

Maison  >  Questions et réponses  >  le corps du texte

java类加载机制-类定义中new如何理解

高洛峰高洛峰2803 Il y a quelques jours891

répondre à tous(5)je répondrai

  • 黄舟

    黄舟2017-04-18 10:48:41

    Lors de l'exécution d'un programme Java, chaque classe n'est chargée qu'une seule fois. Il est impossible de recharger. Il n'y a donc pas de récursion comme mentionné dans la question.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 10:48:41

    Il est recommandé de comprendre d'abord la mémoire dans la machine virtuelle JVM

    Lors du processus d'instanciation des objets AVA, les principaux composants utilisés incluent la pile de machines virtuelles, le tas JAVA et la zone de méthode.
    Une fois les fichiers JAVA compilés, ils seront d'abord ajoutés à la zone de méthode JVM. Une partie très importante de la zone de méthode JVM est le pool de constantes d'exécution - utilisé pour stocker la version, le champ, la méthode, l'interface et d'autres descriptions de. le fichier de classe. Informations et constantes de compilation et variables statiques.
    L'endroit où les objets JAVA sont réellement instanciés se trouve dans le tas JAVA et la pile de la machine virtuelle, Object A = New Object(); dans la mémoire réelle, A est en fait équivalent au nom que nous donnons à l'implémentation de la classe Object. En programmation orientée objet, tout comme les chiens appartiennent à une catégorie d'animaux, mais nous donnerons un nom pour distinguer le chien spécifique. Object est utilisé pour marquer que A appartient à cette classe, et A fait référence à une implémentation spécifique d'Object, et New Object équivaut à créer une implémentation spécifique de cette classe. On peut donc comprendre qu'un objet doit d'abord être capable de spécifier la classe à laquelle il appartient, et ensuite il doit également être capable de spécifier à quelle implémentation spécifique il fait référence.
    Il existe deux méthodes de mise en œuvre correspondantes :

    1. Gérer l'objet d'accès

    2. Objet d'accès au pointeur direct
    Objet d'accès au pointeur direct

    HotSpot utilise la deuxième méthode d'implémentation.
    Le chargement de classe comprend 3 étapes : chargement, liaison et initialisation
    Chargement
    Comme le montre la figure ci-dessus, il n'est pas difficile pour nous de comprendre que lorsqu'un objet est instancié à ce moment, la JVM va divisez la zone mémoire dans le tas JAVA en fonction du type d'objet requis et générez un pointeur vers le type de données de l'objet de la zone de méthode pour identifier l'objet.
    Lien
    Le pointeur dans la table des variables locales (également appelée table des variables locales) dans la pile de la machine virtuelle pointe vers la zone de mémoire divisée dans le tas JAVA. La machine virtuelle JAVA utilise des liens dynamiques. Seul le fichier de classe compilé ne stocke pas la représentation de la méthode finale en mémoire.
    Initialisation
    L'initialisation est en fait un appel à la méthode d'initialisation dans le fichier de classe, et son noyau est un POP/PUSH du cadre de pile dans la pile de la machine virtuelle. Cela équivaut à effectuer le même processus de chargement sur les objets de la classe.
    À ce stade, le processus complet d'instanciation d'un objet a été introduit.

    La séquence d'initialisation interne de la classe est domaine statique->domaine non statique->constructeur

    Lire recommandée :
    [JAVA Notes-Tao] Explication détaillée du cycle de vie des objets
    [JAVA Notes-Tao] Compréhension de l'initialisation de classe

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:48:41

    Vous confondez chargement de classe et initialisation d'objet ?

    répondre
    0
  • 怪我咯

    怪我咯2017-04-18 10:48:41

    L'affiche réfléchit-elle trop profondément ? L'instanciation et la définition de la déclaration sont 2 concepts et étapes.
    A2 a plusieurs variables membres statiques qui sont instanciées lorsqu'elles sont déclarées, et le processus d'instanciation de la classe est terminé via le constructeur.
    On dirait qu'il y a une nidification ici, mais ce n'est pas le cas. Le compilateur peut déclarer des sauts d'instructions lors de la compilation de l'instruction d'instanciation, et l'adresse du saut est déterminée lors de la compilation secondaire.
    De cette façon, pendant la phase de déclaration de classe, lorsque a, b, c, d sont instanciés, le compilateur passera au bloc constructeur de A2(int i).
    Accédez au constructeur A() pendant la phase d'instanciation de la classe.
    Pour parler franchement, il appelle simplement les méthodes de construction correspondantes à différentes étapes. Il n'y a pas d'imbrication de boucles comme le pensait l'auteur.

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:48:41

    Lors du chargement d'une classe, l'ordre de chargement des variables statiques et des constructeurs est différent. Les méthodes constructeur sont également des méthodes statiques par nature.
    Je n'y connais pas grand chose, alors je vais d'abord m'asseoir

    répondre
    0
  • Annulerrépondre