2013-09-01 17 views
5

Ho un paio di domande su istanze della classe Classele istanze della classe Classe

1) Ho capito bene che dire per il cane di classe esiste una sola istanza della classe di classe. In altre parole, dato le seguenti righe

Dog dog1 = new Dog(); 
Dog dog2 = new Dog(); 

Class dog1Class = dog1.getClass(); 
Class dog2Class = dog2.getClass(); 
Class dogClass = Dog.class; 

esiste una sola istanza della classe di classe - Class<Dog>.

Se si confrontano questi riferimenti con ==, si ottiene che sono lo stesso oggetto.

La domanda è esattamente, getClass e static. Class restituiscono sempre la stessa istanza durante l'esecuzione di un metodo principale?

2) Quando vengono create esattamente queste istanze?

+6

Se si dispone di più classloader, le cose si fanno più complicate ... –

+0

Abbastanza buona domanda in realtà e come già detto @Oli, più classloader e soprattutto il caricamento dinamico potrebbero lanciare una collezione di chiavi nelle opere. Davvero curioso di vedere quale sia la risposta. – Esko

risposta

5

sarà getClass e .class statiche tornare sempre la stessa istanza

No, non esattamente. Il metodo dog.getClass() restituisce il tipo di runtime del cane.

considerare le seguenti classi:

class Animal { } 
class Dog extends Animal { } 

E poi nel metodo principale:

Animal dog = new Dog();  
System.out.println(dog.getClass()); // Prints class Dog 
System.out.println(Animal.class);  // Prints class Animal 

Quando sono esattamente queste istanze create?

Quando la classe viene caricata per la prima volta da JVM. Dalla documentazione Class:

oggetti classe vengono costruiti automaticamente dalla macchina virtuale Java come classi vengono caricate e chiamate al metodo defineClass nel caricatore di classe.

Per studio dettagliato:

1

C'è solo un esempio Class rappresentano una classe; puoi star certo che è la stessa istanza, indipendentemente da come la ottieni.

Ad esempio, un metodo sincronizzato statico utilizza quell'istanza esatta per il blocco; a quanto pare non funzionerà se ci sono più istanze. vedi http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3.6

+0

Esattamente)) Non ci ho pensato –

Problemi correlati