2015-06-17 11 views
14

This answer mostra modificatori di visibilità di Java e il loro significato:Perché la visibilità del pacchetto ha la precedenza sulla visibilità della sottoclasse?

Modifier | Class | Package | Subclass | World 
————————————+———————+—————————+——————————+——————— 
public  | y | y | y  | y 
————————————+———————+—————————+——————————+——————— 
protected | y | y | y  | n 
————————————+———————+—————————+——————————+——————— 
no modifier | y | y | n  | n 
————————————+———————+—————————+——————————+——————— 
private  | y | n | n  | n 

La mia domanda è: perché non consentendo visibilità a tutte le sottoclassi implica che si deve dare visibilità a tutte le altre classi nel pacchetto? In altre parole, perché i creatori di Java rendono in questo modo, al contrario di:

Modifier | Class | Subclass | Package | World 
————————————+———————+—————————-+——————————+——————— 
public  | y | y | y  | y 
————————————+———————+—————————+——————————+——————— 
no modifier | y | y | y  | n 
————————————+———————+—————————+——————————+——————— 
protected | y | y | n  | n 
————————————+———————+—————————+——————————+——————— 
private  | y | n | n  | n 
+2

Vedere anche: http://programmers.stackexchange.com/questions/205646/in-java-why-were-protected-members-made-accessible-to-classes-of-the-same-packa e http: //programmers.stackexchange.com/questions/238581/why-is-there-no-subclasses-only-access-modifier-in-java – assylias

+0

"... perché i creatori di Java lo hanno reso così", IMHO, nessuno qui può rispondere. :) –

risposta

11

Un pacchetto è presumibilmente scritto e mantenuto dallo stesso team; è ok avere un controllo di accesso più flessibile all'interno di un pacchetto, supponendo che il programmatore abbia una conoscenza approfondita di tutto il codice.

Una sottoclasse è spesso scritta da qualcun altro; un vincolo più rigoroso su API è migliore.

1

Perché il contrario come si suggerisce non ha nella pratica (che ammetto non è così ovvio).

Supponiamo di avere un pacchetto, contenente una classe di base intesa per l'estensione da un client (terza parte, altro team ecc.), Nonché altre classi che interagiscono con la classe base (nello stesso pacchetto). Questo è un caso abbastanza comune.

Ora, la classe base può contenere membri/metodi intesi solo per l'utilizzo dal codice fornito nel pacchetto, ma che sono destinati ad essere inaccessibili al client che estende la classe.

Questo è semplice con il modificatore privato del pacchetto (predefinito) come lo è ora, ma sarebbe impossibile se si passa la forza. Si perderebbe la possibilità di nascondere le cose dalle classi figlio, pur continuando a renderle disponibili per i tuoi compagni nel pacchetto.

Problemi correlati