2010-02-10 6 views
9

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

+3

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. –

+2

E il nome del file è sempre ".java" indipendentemente dal tipo di classe. – fastcodejava

risposta

4

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.

+0

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

+1

Trovo che questa "interfaccia compilata è quasi identica a una classe astratta compilata" ? Le classi astratte possono avere variabili, definizioni di metodi, ecc. – fastcodejava

+2

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? –

2

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).

+1

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

5

fisico rappresentazione del codice byte sul file system non importa.

È la realizzazione logica (di classe o di interfaccia) che conta.

+3

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. –

3

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?

+0

@ 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

1

È 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".

13

Perché il punto è indicare che il file è codice byte Java (e .class era l'estensione scelta per quello), non la costruzione della lingua specifica.

Problemi correlati