So che questa domanda è ormai quasi tre anni, ma trovo che una parte della questione non è ancora risolta:
E: significa che la classe B non è più privato in fase di esecuzione?
Carlos Heubergers commento sulla skaffmans risposta suggerisce, classe B
è ancora private
per le altre classi nel pacchetto.
Probabilmente ha ragione per il linguaggio di programmazione Java, vale a dire che non è possibile fare riferimento alla classe B
da un'altra classe. Almeno non senza usare la riflessione (con la quale anche i membri della classe privata possono accedere dall'esterno), ma questo è un altro problema.
Ma, come la JVM non ha alcun concetto di una classe interna (come Stati skaffman), mi sono chiesto come un "accessibile da una sola classe di" visibilità si realizza a livello di bytecode. La risposta: non è affatto realizzata, per la JVM la classe interna appare come una normale classe privata del pacchetto. Questo è, se scrivi bytecode per te (o ne modifica uno generato dal compilatore) puoi accedere alla classe B
senza problemi.
È possibile accedere a tutti i metodi di accesso sintetici da tutte le classi nello stesso pacchetto. Pertanto, se si assegna un valore a un campo privato della classe A
in un metodo della classe B
, un metodo di accesso sintetico con visibilità predefinita (cioè privato del pacchetto) viene generato nella classe A
(denominata qualcosa come access$000
) che imposta il valore per l'utente. Questo metodo dovrebbe essere chiamato solo dalla classe B
(e infatti può essere chiamato solo da lì usando il linguaggio Java).Ma dal punto di vista della JVM, questo è solo un metodo come qualsiasi altro e può essere chiamato da qualsiasi classe.
Quindi, per rispondere alla domanda:
- Dal Java lingue punto di vista, di classe
B
è e rimane privata.
- Dal punto di vista della JVM, la classe
B
(o meglio: classe A$B
) non è privata.
OK, lo vedo. Per me questo significa che eviterò l'uso di classi interne come nell'esempio, può solo portare a confusione. – Gerard
Non vorrei lasciarti disturbare. Questo particolare avvertimento del compilatore non è molto utile a nessuno, i metodi sintetici sono sempre usati con le classi interne e non hanno alcun impatto significativo. – skaffman
IMHO i metodi sintetici sono stati un'aggiunta superflua alla lingua. Solo l'utilizzo dell'ambito del pacchetto per i membri "privati" (che comunque il compilatore fa sotto il cofano) era una soluzione soddisfacente. – finnw