2014-09-17 29 views
8

Che aspetto ha l'utilizzo della memoria in Java quando si estende una classe base.Utilizzo della memoria Java in ereditarietà

La classe figlio contiene un'istanza della classe base (con il proprio overhead e tutto) o ha solo un overhead di 16 byte?

class Foo { 
int x; 
} 

class Bar extends Foo { 
int y; 
} 

Quindi, più precisamente, che cosa è l'utilizzo della memoria di un'istanza di Bar?

E 'Foo (including overhead) + Bar(including overhead)

o semplicemente Foo (excluding overhead + Bar(including overhead)

+0

C'è solo un'intestazione e un solo oggetto. I campi di Bar sono immediatamente dopo i campi di Foo in memoria. –

risposta

8

Non v'è alcun doppia testa.

Java prenderà la classe, le superclassi, calcolerà lo spazio necessario per tutti i campi e assegnerà lo spazio necessario per una singola istanza.

Formare solo un punto di vista della memoria, non esiste affatto la nozione di superclasse, ci sono istanze di Foo che hanno bisogno di memoria per un solo int, e istanze di Bar che necessitano di memoria per due interi, di cui uno è lì perché Bar capita di estendere Foo.

Quindi il sovraccarico (o la contabilità o qualsiasi altra cosa si voglia chiamare) avviene solo una volta.

Tuttavia, quando si sviluppa in Java, di solito è meglio non preoccuparsi troppo della memoria, a meno che non si abbiano casi molto specifici (e intendo molto molto specifici) in cui l'overhead di bookkeping sta causando seri problemi. In tal caso, dovrebbe essere considerato anche il padding da 8 byte.

Di solito, ci sono molti altri modi per migliorare l'ingombro della memoria dell'applicazione o le sue prestazioni generali, piuttosto che preoccuparsi del sovraccarico di memoria di ogni singola istanza.

+0

Diciamo che voglio solo usare una parte di una classe - fare in modo che un oggetto dell'intera classe occupi memoria. Se invece quella classe fosse divisa in una parte di superclasse e una sottoclasse che mi permettesse di istanziare solo la parte di cui ho bisogno, rendendo la mia applicazione un po 'più efficiente della memoria. È corretto? – Lealo