2011-10-03 20 views
5

Ok, quindi un file sorgente Java deve avere almeno una classe pubblica e il file deve essere chiamato "class-name.java". Giusto.Compilazione Java di un file .java senza una classe pubblica

Quindi, se ho una classe, allora la seguente sarebbe compilare:

public class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

Ma ciò che mi bug è che se tolgo il modificatore di accesso 'pubblico' dal codice di cui sopra, il codice viene compilato ancora. Io proprio non capisco. Rimuoverlo, il codice si presenta come:

class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

Nel codice di cui sopra, dal momento che ho rimosso il modificatore di accesso 'pubblico', la mia classe ha di default o un pacchetto accesso privato, vale a dire che non può essere l'accesso al mondo esterno , solo dall'interno del pacco.

Quindi la mia domanda è, come viene compilato il codice sopra? Il file HelloWorld.java in questo caso non ha una classe HelloWorld "pubblica" (solo un HelloWorld.class package-private) e quindi per la mia comprensione non dovrebbe essere compilata.

Apprezzo il tuo tempo nel rispondere alle mie domande!

saluti, anon

+0

* "il file di origine java deve avere almeno una classe pubblica" * Uh no, [non è necessario avere nulla.] (Http://stackoverflow.com/q/7791487/1134080) – ADTC

risposta

1

È possibile inserire classe non pubblica in un file, e non è un bug, ma caratteristica.

Il tuo problema è a livello di confezione, non compilato. Poiché è possibile compilare questo file con classe non-pubblico, ma non si può chiamare dall'esterno, quindi non è lavorare come classe base dell'applicazione

Ti piace questa:

// [+] single file: SomeWrapper.java 

public class SomeWrapper { 
    ArrayList<_PrivateDataType> pdt; 
} 
// [-] single file: SomeWrapper.java 

// [+] single file: _PrivateDataType.java 
class _PrivateDataType { 
    // members, functions, whatever goes here 
} 

// [-] single file: _PrivateDataType.java 
+0

Grazie , ma il mio punto non è aggiungere un tipo di dati privato o altro. La mia domanda è come compilare e/o lavorare il codice sopra visto che qui ho un file .java, ma senza alcuna classe pubblica al suo interno. L'unica classe al suo interno è una classe pacchetto-privata, non una classe pubblica. – anon1981

+0

E dov'è il problema? Puoi creare un'altra classe nello stesso pacchetto (con lo stesso effetto) e usare quella classe pacchetto-privata. –

+0

Ancora una volta, la mia domanda è di non aggiungere alcuna nuova classe all'interno del file. Mi interessa solo l'accesso privato al pacchetto. – anon1981

6

un file sorgente Java deve avere almeno una classe pubblica e il file deve essere chiamato class-name.java

Errato, una classe di livello superiore non deve essere dichiarata pubblica. Gli stati JLS;

Se una classe di livello superiore o un tipo di interfaccia non è dichiarato pubblico, è possibile accedervi solo dal pacchetto in cui è stato dichiarato.

Vedere sezione http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285 6.6.1.

+0

Grazie! Quindi stai dicendo che chiunque chiama main() lo chiama da qualche tipo di contesto del pacchetto? Cioè, il chiamante (presumibilmente la JVM) che chiama main() si trova nello stesso pacchetto della mia classe HelloWorld? Semplicemente confuso! Quindi grazie per aver preso il tempo di rispondere alle mie domande. – anon1981

+0

Inoltre, è possibile definire più classi non pubbliche in un file java. –

+0

Quindi la mia domanda è: HelloWorld è una classe privata del pacchetto nella classe predefinita, vero? Quindi dovrebbe essere accessibile dal pacchetto predefinito ma non dal pacchetto predefinito, giusto? Quindi deducendo ulteriormente, quando viene chiamato main(), deve essere richiamato da * all'interno * del pacchetto predefinito, vero? Oppure, chi chiama main() si trova nello stesso pacchetto della classe HelloWorld. Destra ? – anon1981

-1

Quando non si specifica il modificatore di accesso della classe (o il relativo campo o metodo), viene assegnato l'accesso "predefinito". Ciò significa che è accessibile solo all'interno dello stesso pacchetto (in questo caso, il pacchetto predefinito).

Il sito Web Javabeginner.com ha un articolo sull'argomento: è necessario acquisire familiarità con i modificatori di accesso in Java, da questo sito o da altri.

1

Un metodo principale è proprio come qualsiasi altro metodo. L'unica differenza è che è possibile invocare dalla riga di comando con il comando java. Anche se il metodo principale non è visibile dalla riga di comando, la classe può ancora essere utilizzata come qualsiasi altra classe Java e il metodo principale può essere invocato da un'altra classe nello stesso pacchetto. Quindi ho senso che compili.

Nella funzione principale Java non sono speciali in alcun senso. Esiste solo un comando di terminale che è in grado di invocare metodi statici chiamati principali ...

+1

Così ora, la classe HelloWorld ha accessibilità pacchetto-privata. Quindi, chi chiama main (la JVM?) Ora deve essere incluso nello stesso pacchetto, giusto? – anon1981

+0

Ho chiamato direttamente da una classe java e poi si. Le regole per la riflessione sono tuttavia leggermente diverse. Con la riflessione, qualsiasi metodo non privato può essere invocato. La JVM usa la riflessione per invocare il tuo metodo principale. –

1

che non è nulla di cui meravigliarsi. Suppongo che questo comportamento sia simile a quello di alcuni compilatori C/C++.

Codice come "void main() {/ ... /}" verrà compilato correttamente da quei compilatori, anche se non è un codice conforme agli standard. Detto semplicemente, il compilatore scambia il "vuoto" con "int".

Penso che un comportamento simile sia implementato dal compilatore java.

saluti, Xong

+0

Sembra che mi sbagli. =) – xong

1

Ci sono usi validi per un classi non pubbliche. Quindi il compilatore non dà errore quando si tenta di compilare il file.

Problemi correlati