2010-08-16 9 views
11

io non sono in grado di capire il motivo per cui questo codice non viene compilato:più classi in un unico file: modificatore privata non è consentita qui

class A { 
    public static void main(String[] args) { 
     System.out.println("hi"); 
    } 
} 

private class B { 
    int a; 
} 

Mi risparmio il contenuto in un file chiamato A.java - e ottengo un errore:

modifier private not allowed here // where I have defined class B 

Questo accade sia quando provo B come privato e protetto. Qualcuno può spiegarmi la ragione di questo?

Grazie!

+0

Le classi interne possono essere private. –

+0

No, non sembra dipendere da A – SlowAndSteady

risposta

13

Dal Java Language specification:

The access modifiers protected and private pertain only to member classes within a directly enclosing class declaration

Quindi sì, l'i modificatori protette privato e non sono ammessi per le dichiarazioni di classe di primo livello.

Le classi di livello superiore possono essere pubbliche o meno, mentre private e protected non sono consentite. Se la classe è dichiarata pubblica, può essere indicata da qualsiasi pacchetto. Altrimenti si può fare riferimento solo dallo stesso pacchetto (spazio dei nomi).

Una classe privata di primo livello non avrebbe molto senso perché non è possibile fare riferimento a nessuna classe. Sarebbe inutilizzabile per definizione. private è OK per le classi membro di fare una classe riferibile solo alla sua classe di inclusione.

È possibile fare riferimento a una classe membro protetta da (1) qualsiasi classe dello stesso pacchetto e da (2) qualsiasi sottoclasse della classe che la contiene. Mappare questo concetto alle classi di alto livello è difficile. Il primo caso è coperto dalla classe di primo livello senza nessun modificatore di accesso. Il secondo caso non è applicabile per le classi di livello superiore, perché non esiste alcuna classe di inclusione o qualcos'altro da un pacchetto diverso con una relazione speciale con questa classe (come una sottoclasse). Per questo motivo, penso che protected non sia consentito perché il suo concetto di base non è applicabile per le classi di livello superiore.

+0

Grazie Andreas, ma puoi per favore farmi capire perché potrebbero gli sviluppatori Java imporre questa restrizione? So che questa domanda può sembrare assurda, ma sono curioso. Grazie ! – SlowAndSteady

+1

OK. Hai la logica per privato, ma per quanto riguarda protetto ?? 'Protetto' è sicuramente più aperto rispetto allo specificatore 'predefinito' - che è stato permesso! – SlowAndSteady

0

Non ha alcun modificatore privato/protetto.

+0

Volevo dire che ho provato sia privato che protetto separatamente, ma non funziona in entrambi i casi – SlowAndSteady

+0

Sto solo sperimentando il controllo degli accessi, voglio solo sapere il motivo dell'errore . – SlowAndSteady

0

B deve essere privato di qualcosa. Inseriscilo nella definizione di classe A o crea un altro file, B.java, e definiscilo lì, ma non può essere privato.

+0

È una regola in Java per rendere una classe/variabile privata o protetta "a qualcosa"? Non possiamo avere classi/variabili indipendenti private o protette? – SlowAndSteady

+0

La mia affermazione era più astratta che concettuale. Il problema fondamentale era che stavi dichiarando un'altra classe nel file A.java. Sembrava che volessi rendere B privato ad A o all'interno di "qualcosa". Tuttavia, la tua affermazione riguardo alle classi private o protette non ha senso perché i modificatori hanno un contesto solo quando sono relativi a qualcosa. – linuxuser27

2

rendono il B nidificati di A, in questo modo:

class A { 
    public static void main(String[] args) { 
     System.out.println("hi"); 
    } 

    private class B { 
     int a; 
    } 
} 

Oppure spostare B in un file separato. Inoltre è possibile attaccare con livello di accesso predefinito, in questo modo la classe è accessibile solo dall'interno del pacchetto:

class A { 
    public static void main(String[] args) { 
     System.out.println("hi"); 
    } 
} 

class B { 
    int a; 
} 
+0

Non desidero nidificare o passare a un altro file. Voglio solo sapere la causa dell'errore – SlowAndSteady

+0

L'errore è in realtà evidente. Se non lo fai, il file nidificato o separato non sarà accessibile da nessuna parte, poiché è privato. Non puoi renderlo pubblico anche perché java ha una limitazione di una classe pubblica di primo livello per file. –

+0

Ma che dire protetto? – SlowAndSteady

-1

Se non si utilizza la parola chiave pubblica per la classe sarà privata di default (visibile solo all'interno del file).

Ci può essere solo una classe pubblica per file .java, tutti gli altri devono essere privati. Quindi la classe A può essere pubblica e la classe B non ha bisogno di alcun modificatore nell'esempio. Il nome della classe pubblica deve corrispondere al nome del file .java (ad esempio A.java può contenere solo una classe pubblica chiamata "A").

+0

Questo non è corretto. Una classe di primo livello senza alcun modificatore è * pacchetto * privato. Può essere riferito da qualsiasi classe all'interno dello stesso pacchetto. –

-2

A.java non può contenere due classi.

+2

Sì, se solo uno è pubblico (quello che dà il nome al file sorgente) e tutti gli altri non pubblici (nessun modificatore di accesso, a.k.a pacchetto accessibile), un file sorgente può contenere più classi. –

+1

-1, mi dispiace che non sia corretto come spiega Andrei. – djna

1

privato e protetto non hanno senso per essere ammessi a una classe/interfaccia di livello superiore (non membro).

Sono applicabili solo ai membri della classe che possono essere variabili, costanti, costruttori, metodi, classi e interfacce.

Perché:

(1) privato: Quale può essere il significato/scopo se definiamo una classe come privato. Il suo scopo dovrebbe essere privato per alcune aree. l'accesso predefinito è già pacchetto privato. E nessuno vuole che una classe sia un file sorgente privato (indovinando il motivo) potrebbe non essere una buona pratica di programmazione da consentire perché le applicazioni java sono finalmente organizzate sotto forma di pacchetti, ma non in termini di file sorgente. Qualsiasi file sorgente dovrebbe essere parte di un pacchetto, quindi nella vista generale/finale ogni classe/interfaccia è parte di un pacchetto, non solo di un file .java. Quindi non applicabile.

(2) protetto: Se qualcosa è protetto, dovrebbe essere disponibile solo all'interno del pacchetto e solo alle sottoclassi in altri pacchetti. Per estendere una classe in un pacchetto diverso, dovrebbe essere disponibile per tutte le classi in altri pacchetti, ma protetta dice che la classe dovrebbe essere disponibile solo alle classi estese. È una specie di situazione di stallo. Quindi non applicabile.

Fonte: Le mie letture e intese

+0

Fintanto che non è pubblico, una classe può avere un nome diverso dal suo nome file. La classe può anche avere il metodo principale. Il file di classe verrà generato con il nome della classe ma non con il nome del file di origine. Il nome della classe dovrebbe essere usato per eseguirlo. – Venkataswamy

Problemi correlati