Per curiosità, perché a volte vengono generati più file .class Java per una classe dopo la compilazione? Ad esempio, la mia applicazione ha sei classi. Per una classe, è stato generato un totale di 10 file .class, a partire da MyClass # 1 fino a MyClass # 10.File .class multipli generati per una classe?
risposta
Questi sono per inner classes e static nested classes. Quelli con i numeri sono classi interne anonime.
Ad esempio:
class Foo {
class Bar { }
static class Baz { }
void run() {
Helper t = new Helper() {
int helpMethod() {
return 2;
}
};
}
}
Ciò produrrà file di classe Foo.class
, Foo$Bar.class
, Foo$Baz.class
e Foo$1.class
(per l'implementazione dell'interfaccia Helper
)
Un file sorgente Java in grado di generare file di classe multipli, se la tua classe contiene classi interne. Le classi interne anonime sono rappresentate dai tuoi file di classe numerati.
Ogni classe in java appartiene a un file .java, ma un file .java può contenere più classi. Questo include classi interne e anonime. I file .class generati per le classi interne contengono un '$' nel loro nome. Le classi interne anonime ottengono numeri.
Più di una classe verrà generata nella compilazione, Solo se la classe ha una classe interna.
riferiscono: Why does Java code with an inner class generates a third SomeClass$1.class file?
Bene, un file sorgente può contenere anche classi separate e non nidificate (se non sono pubbliche). –
non SOLO se ha classi interne (ci sono anche classi anonime, classi annidate, ...). –
È possibile ottenere più fils .class da un singolo file di origine se
la classe contiene classi interne o classi interne statiche. Le classi interne possono nidificare. I loro nomi sono
<outer class name>$<inner class name>
.interfacce interne che sono sempre statiche.
anonimi classi interne (che in realtà sono semplici classi interne senza un nome) interfacce di accesso
pacchetto e le classi prima e dopo la classe principale. È possibile avere un numero arbitrario di classi e interfacce di accesso al pacchetto in un singolo file sorgente Java. Solitamente gli oggetti helper di piccole dimensioni utilizzati solo dalla classe vengono inseriti nello stesso file.
da aggiungere alle risposte di cui sopra, questo è un altro buon esempio di classi interne generate sulla base di comparatori (ogni comparatore viene compilato in un diverso MiaClasse $ X.class):
public class MyClass {
...
public void doSomething() {
...
Collections.sort(list, new Comparator<MyObj>() {
public int compare(MyObj o1, MyObj o2) {
...
}
});
...
}
...
}
Se esiste un file X.java e se contiene 4 collections.sort() {}, quindi dopo la compilazione X.class, X $ 1.class, X $ 2.class, X $ 3.class, X $ 4.class verrà generato.
In caso di classe interna e classe interna statica vengono generati altri file .class.
- 1. Recuperare l'attributo .class di una classe generica
- 2. . Namespace multipli per la singola classe
- 3. Log4j file multipli
- 4. Perché solo una classe per file
- 5. Findbugs esclude i file generati
- 6. Spring Boot - Come specificare una start-class alternativa? (Punti di ingresso multipli)
- 7. Perché una classe sub class di una classe deve essere statica per inizializzare la sottoclasse nel costruttore della classe?
- 8. Ricerca file multipli per più parole
- 9. Caricamento file multipli con jQuery
- 10. definizione della classe css con identificatori multipli
- 11. Cosa significa .class dopo il nome di una classe
- 12. Wrap enum class per cython
- 13. Indicare i campi generati dal codice PyCharm della classe
- 14. Quali sono i file "spec.ts" generati da Angular CLi per?
- 15. Come può Class essere della classe Class e non avere metodi di istanza di classe?
- 16. VS2010: file generati automaticamente e documentazione XML
- 17. NoClassDefFoundError per MockitoInvocationHandler class
- 18. Generazione .class programma per JVM
- 19. Come utilizzare URLClassLoader per caricare un file * .class?
- 20. Codeigniter file multipli upload estensione file mess
- 21. ASP.NET MVC individua i file cs generati da cshtml?
- 22. python mysqldb cursori multipli per una connessione
- 23. MySQL: Inserimenti multipli per una singola colonna
- 24. attributo Class per due istanze della stessa classe
- 25. Descrittori di file multipli per lo stesso file, C
- 26. Trovare il file .class compilato da Eclipse
- 27. Come eseguire il file .class Java da un altro file .class? (java newb)
- 28. Come applicare una classe CSS al passaggio del mouse sui pulsanti di invio generati dinamicamente?
- 29. Streaming Flash HTTP - File multipli
- 30. Utilizzo di PHPExcel per creare file excel generati automaticamente
Terminologia: non solo "classi interne" ma tutte "classi nidificate" sono compilate in tali file –
Vero - Ho aggiornato la risposta per rispecchiare questo –
Non dimenticare di classi anonime. Tecnicamente sono già coperti da "classi interne" ma non sempre sembrano classi, quindi le persone forse si sorprendono nel vederli apparire. Inoltre, il nuovo Java 8 lambda sembra che genererà classi aggiuntive al momento della compilazione. – ArtB