Que se passe t il dans le tas lorsque la classe A hérite de la classe B en Java


En java, nous supposons que nous avons deux classes et A et que B hérite de A et Un a 3 champs privés et constructeur avec trois paramètres

public class A {
private int a ;
private int b ;
private int c ;

 public A(int a, int b, int c) {
    this.a = a;
    this.b = b;
    this.c = c;
 }
}

Et voici une classe B

public class B extends A {        

  public B() {
    super(1,2,3);

 }
}

Nous considérons la classe de test suivante

public class TestA {

        public static void main(String[] args) {
            A a = new A(1,2,3);
            B b = new B();

        }

    }

La question est de savoir quel est le processus ordonné dans le tas qui se produit lors de la création de la classe A avec des champs privés et de son héritage par la classe B? Que se passe-t-il dans le tas lors de la création d'instances de ces deux classes? Comment l' l'allocation de mémoire se produisent et comment les classes interagissent dans l'ordinateur memry ?

Nous savons aussi qu'une sous-classe ne peut pas hériter des champs privés de sa superclasse, alors que se passe-t-il exactement lorsque le constructeur B() est appelé?

Author: pentanol, 2015-01-07

1 answers

Les objets de classe sont chargés dans le tas comme tout autre objet. Cet objet représente simplement la Classe.

Oracle officiel 'Comprendre la mémoire guide'

Et bon vieux spécifications java, vous pouvez lire tout le document comme le fonctionnement du chargeur de classe, vous ne trouverez rien qui "Les classes sont chargées dans le tas" .. De plus, vous pouvez faire une recherche initiale sur Internet pour plus de précisions.

Class B compiler parfaitement.

Maintenant, vos questions par leur ordre:

Quel est le processus ordonné dans le tas qui se produit lors de la création de la classe A avec des champs privés et de son héritage par la classe B?

Vous ne pouvez pas déterminer leur ordre à la jvm comme la façon dont elle gère leur ordre, les membres privés ne sont pas hérités mais existent dans l'objet instancié dans le parent (super).

En d'autres termes, Oui, les instances de la sous-classe auront des copies champ de la classe parent. Ils ne seront cependant pas visibles pour la sous-classe, donc le seul moyen d'y accéder est via les méthodes de la classe parente.

Que se passe-t-il dans le tas lors de la création d'instances de ces deux classes?

Typiquement, la séquence sera quelque chose comme après avoir créé des instances de A et B

  1. référence à l'objet A.class (après avoir créé une instance de classe A)
  2. référence à l'objet B.class (après avoir fait B instance de classe)
  3. bloc de variables d'instance d'objet
  4. bloc de A variables d'instance (seulement a,b,c)
  5. bloc de B variables d'instance (aucun dans ce cas)

Cependant, chaque implémentation d'une JVM est libre de choisir comment elle alloue chacune d'elles.

Nous savons aussi qu'une sous-classe ne peut pas hériter des champs privés de sa superclasse, alors que se passe-t-il exactement lorsque le constructeur B() est appelé?

Quand vous appelez B()

B b = new B();

Il appellera le super(1,2,3)

Alors que se passera-t-il après cela ? rien les valeurs passées à super(); ne sont passées à A(int a, int b, int c) puis affectées aux variables d'instance de A mais cela ne signifie pas que ces champs privés sont maintenant accessibles à B.. vous venez de passer des valeurs au constructeur de super classe, c'est tout.

--MODIFIER {

Si vous voulez une bien meilleure compréhension du tas et de la pile, voir ceci question

--MODIFIER-2--

Si vous prenez le temps d'étudier ce wiki , il a tout sur la JVM, y compris son processus dans le tas et d'autres structures de mémoire

--MODIFICATION FINALE-3--

Dans le contexte du commentaire de l'OP concernant les membres privés de la Super classe

Jetez un oeil à ceci{[20] } Les réponses à cette question effaceront votre confusion concernant les membres hérités et les membres privés non accessibles, puisque l'instance de sous-classe est l'instance de la super classe, son instance a tous les champs de la classe père ! Les membres privés ne sont pas visibles pour cet enfant !! C'est à quoi JLS spécification vous faites référence! Ils prennent leur place à l'intérieur de l'objet. Ils ne sont pas visibles pour la classe enfant mais ils sont là dans cette instance.

 3
Author: Sharp Edge, 2017-05-23 12:24:27