C'è qualche motivo specifico per cui le interfacce non vengono compilate in MyInterface.java compilato nel file .interface? Ma qualsiasi classe viene compilata in un file .class.!Perché le classi vengono compilate in .class ma l'interfaccia non lo fa .interface
risposta
Java considera le interfacce quasi come le classi, ad esempio condividono lo stesso spazio dei nomi (non è possibile avere un'interfaccia che abbia lo stesso nome di una classe) e un'interfaccia compilata è quasi identica a una classe astratta compilata.
Quindi non avrebbe senso memorizzarli in un formato diverso o con una diversa estensione di file. Al contrario, questo renderebbe molte cose più difficili. Ad esempio, quando carichi una classe o un'interfaccia per nome (Class.forName ("my.class.name")) Java non sa se si tratta di una classe o di un'interfaccia. Se ci fossero due diverse estensioni, Java avrebbe cercato di trovare un file "my/class/name.class" e quindi "my/class/name.interface", invece di provare solo il primo.
Durante il caricamento shouldn il programma di caricamento della classe sa se è una classe o un iterface. Può avere diversi overload per caricare i file.OOP concetto che vedi :) – Ravisha
Trovo che questa "interfaccia compilata è quasi identica a una classe astratta compilata" ? Le classi astratte possono avere variabili, definizioni di metodi, ecc. – fastcodejava
Class.forName() non può sapere se l'argomento è una classe o un'interfaccia, quando viene dato solo il nome come stringa. Altrimenti avresti bisogno di un altro metodo per le interfacce (o un parametro per dire al classloader cosa caricare, o una classe speciale per le interfacce). Ovviamente, Java avrebbe potuto essere progettato per gestire interfacce completamente diverse dalle classi. Ma perché complicarlo se esiste una soluzione più semplice? –
In java, si dispone di file di origine, chiamati .java e binari chiamati .class. È solo una scelta di denominazione.
Anche per le classi java e le interfacce non differiscono molto (una classe contiene solo molte informazioni extra come i corpi dei metodi).
Perché sto dicendo che mentre passiamo attraverso la riflessione basata sull'estensione del file sarà chiaramente distinguibile. Solo un aspetto di esso. comunque la mia domanda rimane ancora, le persone che hanno sviluppato java (previoulsy OAK) non volevano distinguere in base al file system? – Ravisha
fisico rappresentazione del codice byte sul file system non importa.
È la realizzazione logica (di classe o di interfaccia) che conta.
La risposta giusta, penso - da quello che ricordo delle specifiche del linguaggio Java, il modo in cui l'output del compilatore è memorizzato sul file system non fa parte della definizione del linguaggio.È solo una convenzione comune. Ma i file di classe potrebbero essere scritti direttamente in qualche database funky. –
Questo è il modo in cui i designer di lingue hanno deciso.
Ha senso in vari modi:
.class
file sono un sottoprodotto che normalmente non vede o manipolare a mano.- Le estensioni meno diverse utilizzate da un programma, più è facile da mantenere.
- In molti casi, non c'è alcuna distinzione nel codice tra una classe e un'interfaccia, quindi è logico che i file binari siano simili.
Francamente, non riesco a pensare ad una buona ragione per avere estensioni diverse per classi e interfacce compilate. Perché sarebbe importante distinguere tra loro?
@ Eli, è solo il dubbio che ho ottenuto dal primo istante in cui vedo un file .class presumo che sia una classe (solo la mia opinione sbagliata potrebbe essere) – Ravisha
È solo una scelta che hanno fatto. Non me ne preoccuperei. È comunque un file binario. Un modo per pensare è "Anche se è un'interfaccia è ancora in un file.java".
Perché il punto è indicare che il file è codice byte Java (e .class era l'estensione scelta per quello), non la costruzione della lingua specifica.
- 1. variabile neverHappen in classi compilate
- 2. Perché __unicode__ non funziona ma __str__ lo fa?
- 3. Puoi chiamare le classi JRuby compilate da java?
- 4. Perché in JPA EntityManager le query generano NoResultException ma find non lo fa?
- 5. Quando vengono caricate le classi?
- 6. Le espressioni bizzarre del C++ vengono compilate correttamente.
- 7. IAuthenticationRequest.RedirectToProvider non dovrebbe tornare, ma lo fa
- 8. java classi compilate contengono i segni del dollaro
- 9. Perché un localmacro funziona in Class Dec, ma non se lo metto in un oggetto Macro?
- 10. Perché `++ a ++` non viene compilato in C++ ma `(++ a) ++` fa?
- 11. Perché XmlSerializer può serializzare classi astratte ma non interfacce?
- 12. Perché le classi immutable.js non richiedono "nuovo"?
- 13. Perché le mie viste non vengono disegnate?
- 14. perché non l'ng-congedo/ng-ENTER classi vengono aggiunti
- 15. Objective-C: direttiva @class prima di @interface?
- 16. DBIx :: Class fa unioni?
- 17. Perché Eclipse non sta aggiornando le classi?
- 18. Perché le istanze di Metaclass sono Metaclass e non Class?
- 19. Perché le celle DataGridView non vengono aggiornate?
- 20. Perché le classi che non estendono altre classi devono estendersi dai tratti? (con non funziona)
- 21. Ant "JAVA_HOME non punta al JDK" - ma lo fa
- 22. Perché Eclipse lo compila, ma javac no?
- 23. Perché B: f non risolve l'ambiguità ma A :: f fa?
- 24. Perché le mie visualizzazioni MVC sono state compilate con PDB?
- 25. C# Le istruzioni di debug vengono compilate durante l'esecuzione in modalità di rilascio?
- 26. Perché una funzione che accetta IEnumerable <interface> non accetta IEnumerable <class>?
- 27. vengono risolti dall'ottimizzatore, ma non i riferimenti, perché?
- 28. Intellij java class diagram, frecce tra le classi
- 29. Perché dovrei usare le classi in python?
- 30. Il carattere di incremento funziona ma l'aggiunta non lo fa. Perché?
Per lo stesso motivo per cui un oggetto 'java.lang.Class' può rappresentare una classe, un'interfaccia, un tipo di annotazione o un tipo enum. –
E il nome del file è sempre ".java" indipendentemente dal tipo di classe. – fastcodejava