2013-12-12 11 views
6
abstract class A { 
    private int a; 
    public A(int x) { 
     a = x; 
    } 
    public int getA() { 
     return a; 
    } 
} 

class B extends A { 
    public B(int x) { 
     super(x); 
    } 
} 

class TestB { 
    public static void main(String args[]) { 
     B b = new B(5); 
     System.out.println(b.getA()); 
    } 
} 

In questa situazione quando dico B b=new B(5); il costruttore di super-classe si chiama e la variabile di istanza privato è inizializzato a 5. Quindi, quando dico getA() sull'oggetto class B s' A riferiti da b restituisce . Poiché la variabile di istanza a di class A è privata, non sarà ereditata dallo class B. Quindi, dove viene creata la variabile di istanza a (in heap). Se fosse stato un public sarebbe stato una parte dell'istanza class B su Heap. Anche class A è una classe abstarct quindi non può essere istanziata.Dove è una variabile di istanza privata di una classe astratta creata nell'heap?

+1

"Poiché la variabile di istanza a della classe A è privata, non verrà ereditata dalla classe B." - semplicemente sbagliato, ovviamente è ereditato! Semplicemente non è accessibile eccetto il metodo 'getA()' –

risposta

6

non c'è differenza dove le variabili di istanza sono assegnati, non importa se sono privato, pubblico, da una classe super, da una super classe astratta

in genere la sequenza sarà qualcosa di simile a

  1. riferimento ai B.class oggetto
  2. blocco di Object variabili di istanza (inclusi i campi helper per GC, il monitor per la sincronizzazione, ...)
  3. blocco di A i variabili nstance (solo a in questo caso)
  4. blocco di B variabili di istanza (nessuna in questo caso)

tuttavia ogni implementazione di una JVM è libero di scegliere come alloca ognuno

e il controllo degli accessi viene applicato sia dal compilatore che dalla JVM

+0

così quando l'oggetto della classe B viene creato su heap, avrà tutte le variabili di istanza della classe Object, Classe A e classe B. – Pankaj

+0

@Pankaj sì, ma ancora una volta è un modo comune per farlo, ci sono altri modi come allocare blocchi separati e collegarli come una lista collegata, ma l'altro è più veloce –

0

Tutto ciò che è astratto è dire "non puoi creare questo corso da solo". Tutto ciò che è definito all'interno della classe funziona esattamente come per una classe non astratta.

Quindi, in altre parole, rimuovere la parola chiave "abstract" sopra e il bytecode compilato risultante sembrerà quasi identico.

Cambia il modo in cui è possibile utilizzare la classe, non il comportamento di ciò che la classe contiene.

+0

Dato che non possiamo creare istanze di una classe astratta, dove il campo privato nella classe astratta riceverà la memoria? La classe astratta ha assegnato memoria nell'heap? – cnova

+1

Quando si crea una classe concreta che estende una classe astratta, tutti i membri per la classe astratta vengono creati/assegnati/allocati/ecc come parte dell'istanziazione di quella classe concreta, esattamente la stessa di qualsiasi classe non astratta. –

0

Regola base di ereditarietà !!!

Da oracle documentation

Una sottoclasse non eredita i membri privati ​​della sua classe genitore. Tuttavia, se la superclasse ha metodi pubblici o protetti per accedere ai suoi campi privati, questi possono anche essere usati dalla sottoclasse.

3

L'istanza della variabile 'a' verrebbe creata su heap all'interno dell'oggetto della classe 'B'. e, sarebbe comunque creato all'interno dell'oggetto della classe "B" dove l'istanza "a" è pubblica.

L'OBJECT di una sottoclasse deve contenere i campi privati ​​della superclasse. Non avere accesso a un membro privato non significa che non ci sia.

Come afferma lo JLS.

I membri di una classe dichiarata privata non vengono ereditati dalle sottoclassi di tale classe. Solo i membri di una classe dichiarata protetta o pubblica vengono ereditate dalle sottoclassi dichiarate in un pacchetto diverso da quello in cui è stata dichiarata la classe.

La sottoclasse non ha campi privati ​​di super classe. OGGETTI di sottoclassi contengono campi privati ​​delle loro superclassi. La sottoclasse stessa NON ha NOZIONE dei campi privati ​​della sua superclasse.

+0

+1. Unche Mits. :-) –

Problemi correlati