2013-06-10 11 views
6

Mi chiedevo come una classe annidata lavora in un ciclo for:La classe annidata in ciclo for, ci saranno n istanze della classe?

  • sarà l'oggetto della classe essere distrutta dopo ogni iterazione per?
  • l'istanza della classe verrà distrutta automaticamente da "garbage"?
  • una volta terminato il ciclo for, l'oggetto della classe nidificata rimane in memoria? può essere richiamato da altri posti nel programma?

Questo è il codice:

class Outer { 
    int outer_x = 100; 

    void test() { 
    for(int i=0; i<10; i++) { 
     class Inner { 
     void display() { 
      System.out.println("display: outer_x = " + outer_x); 
     } 
     } 
     Inner inner = new Inner(); 
     inner.display(); 
    } 
    } 
} 

class InnerClassDemo { 
    public static void main(String args[]) { 
    Outer outer = new Outer(); 
    outer.test(); 
    } 
} 

risposta

9

Avere una definizione di classe all'interno di un metodo è solo la sintassi: è ancora una definizione di classe perfettamente normale.

Per i Inner oggetti (new Inner()) si crea, che significa:

  • ogni oggetto sarà per la garbage collection, proprio come qualsiasi altro oggetto, subito dopo il ciclo di iterazione
  • sì, l'oggetto verrà raccolto dalla spazzatura
  • l'oggetto si attarderà fino a quando non sarà raccolto dalla spazzatura, ma non sarà accessibile da altri luoghi (poiché non vi è alcun riferimento a esso trapelato).

Per la classe stessa, ciò significa:

  • classe verrà caricata normalmente (una sola volta)
  • classe non saranno nuovamente caricato su ogni iterazione
  • classe non verrà nemmeno ricaricato su una seconda chiamata di test
  • la classe può essere sottoposta a GC in base alle normali regole delle classi GCing (che sono piuttosto rigorose)
+0

Penso, * oggetto della classe * si riferiva all'istanza 'Class' di' Inner'. –

+0

@Andreas_D: Mi sono reso conto che avrebbe potuto volerlo dire e ha esteso la mia risposta. –

-1

GC dipende totalmente da JVM . Verrà eseguito se la memoria interna è bassa e GC ha la possibilità.

+0

Com'è correlato alla domanda? Non indirizza a nessuna delle domande dell'OP. –

0
  • No. L'oggetto verrà appendere fuori sul mucchio fino calci GC a.
  • Sì, una volta che i calci GC a.
  • Non persisterà. No non può.

Se, per esempio, superato nel caso classe esterna (this) alla classe interno attraverso il costruttore e assegnato al campo della classe interna, in questo caso l'oggetto classe interna dovrebbe rimanere nella memoria, come a lungo come l'istanza della classe esterna viene utilizzata da qualche parte.

Problemi correlati