Cosa succede nell'heap quando la classe A eredita la classe B in Java


In java supponiamo di avere due classi e A e tale che B erediti A e A ha 3 campi privati e costruttore con tre parametri

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;
 }
}

Ed ecco una classe B

public class B extends A {        

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

 }
}

Consideriamo la seguente classe di test

public class TestA {

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

        }

    }

La domanda è qual è il processo ordinato nell'heap che si verifica quando si crea la classe A con campi privati e la si eredita dalla classe B? Cosa succede nell'Heap quando si creano istanze di queste due classi? Come funziona il allocazione della memoria accadere e come le classi interagiscono nel memry computer ?

Sappiamo anche che una sottoclasse non può ereditare i campi privati della sua superclasse, quindi cosa succede esattamente quando viene chiamato il costruttore B()?

Author: pentanol, 2015-01-07

1 answers

Gli oggetti di classe vengono caricati nell'heap come qualsiasi altro oggetto. Questo oggetto rappresenta solo la Classe.

Oracle official 'Understanding Memory guide'

E il buon vecchio java spec , puoi leggere l'intero documento come funziona il caricatore di classi, non troverai nulla che "Le classi sono caricate in Heap" .. Inoltre più si può fare qualche ricerca iniziale su Internet per ulteriori chiarimenti.

Class B compilerà perfettamente.

Ora le vostre domande dal loro ordine:

Qual è il processo ordinato nell'heap che si verifica quando si crea la classe A con campi privati e la si eredita dalla classe B?

Non è possibile determinare il loro ordine fino a jvm come gestisce il loro ordine, i membri privati non sono ereditati ma esistono nell'oggetto istanziato nel genitore (super).

In altre parole, Sì, le istanze della sottoclasse avranno copie di un privato campo della classe genitore. Tuttavia non saranno visibili alla sottoclasse, quindi l'unico modo per accedervi è tramite i metodi della classe genitore.

Cosa succede nell'Heap quando si creano istanze di queste due classi?

In genere la sequenza sarà simile dopo aver creato le istanze di A e B

  1. riferimento all'oggetto A.class (dopo aver creato un'istanza di classe A)
  2. riferimento all'oggetto B.class (dopo aver effettuato B esempio di classe)
  3. blocco di variabili di istanza dell'oggetto
  4. blocco di variabili di istanza A (solo a,b,c)
  5. blocco di variabili di istanza B (nessuna in questo caso)

Tuttavia ogni implementazione di una JVM è libera di scegliere come allocare ciascuna di esse.

Sappiamo anche che una sottoclasse non può ereditare i campi privati della sua superclasse, quindi cosa succede esattamente quando viene chiamato il costruttore B ()?

Quando si chiama B()

B b = new B();

Chiamerà super(1,2,3)

Quindi cosa succederà dopo ? nulla i valori passati a super(); vengono passati a A(int a, int b, int c) e quindi assegnati alle variabili di istanza di A, ma ciò non significa che quei campi privati siano ora accessibili a B.. hai appena passato i valori al costruttore di super class questo è tutto.

--MODIFICA {

Se vuoi una comprensione molto migliore di Heap e Stack, vedi questo domanda

--MODIFICA-2--

Se ti prendi un po ' di tempo per studiare questo wiki, ha tutto su JVM incluso il suo processo in Heap e altre strutture di memoria

--MODIFICA finale-3--

Nel contesto del commento di OP riguardante i membri privati della Super class

Dai un'occhiata a questo Le risposte a questa domanda cancelleranno la tua confusione riguardo ai membri ereditati e ai membri privati non accessibili, poiché l'istanza della sottoclasse è l'istanza della super classe, la sua istanza ha tutti i campi della classe padre ! I membri privati non sono visibili a quel bambino !! Ecco a cosa ti riferisci alle specifiche JLS! Occupano il loro spazio all'interno dell'oggetto. Non sono visibili alla classe figlio ma sono lì all'interno di quell'istanza.

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