Non è possibile limitare l'accesso perché è già stato concesso un maggiore accesso nella super classe. per esempio.
SuperClass sc = new SubClass();
sc.foo(); // is package local, not private.
L'accesso di sc
è determinato dal tipo di riferimento non è quello che fa riferimento, perché è impossibile che il compilatore di conoscere in tutti i casi che tipo l'oggetto è in fase di esecuzione sc
. Affinché ciò sia un presupposto sicuro, la sottoclasse deve onorare il contratto dato dal genitore o non è una sottoclasse valida. Questo non è diverso dal genitore dicendo che un metodo è implementato ma la sottoclasse che dice di non essere (o non accessibile)
Si potrebbe aggirare questo dicendo che si può accedere al metodo della sottoclasse solo tramite il genitore, non direttamente. Il problema con questo è che non sai quando un genitore potrebbe aggiungere un metodo e quando fai un metodo private
lo fai perché vuoi che sia privato e non accessibile in un altro modo.
BTW È ancora possibile accedere a un metodo privato tramite la riflessione che ha l'effetto collaterale di causare tutti i tipi di problemi per la JVM. per esempio. deve mantenere i metodi privati anche se potrebbe determinare che non è possibile chiamarlo normalmente.
In breve, si desidera codice che significa ciò che dice e non ha una doppia personalità. È un pacchetto locale o privato non è una specie di intermedio, ma non proprio. Questo non è un problema nell'altro senso. Ad esempio, se la sottoclasse è pubblica. Significa solo che la sottoclasse può essere utilizzata in più posti rispetto al genitore, proprio come può implementare più metodi.
fonte
2013-07-07 07:39:54
Interessante domanda! Questo stesso caso * è * permesso in C++. – quamrana
"Ho una classe che ha un metodo il cui identificatore di accesso è di default pubblico". In realtà l'identificatore di accesso predefinito non è pubblico. Se non hai menzionato alcun specificatore di accesso specifico, allora è "predefinito" :). – pikrut
@quamrana E cosa succede in C++ quando si accede ad un oggetto attraverso una variabile tipizzata da superclasse? Il compilatore sicuramente lo lascia passare ... errore durante il runtime? –