2013-04-17 13 views
6

Mi chiedo se faccia qualche differenza se un metodo è pubblico o protetto da un pacchetto in una classe protetta da un pacchetto.C'è qualche motivo per i metodi pubblici in una classe protetta da pacchetto?

class Example { 
    public void test() {} 
} 

invece di

class Example { 
    void test() {} 
} 

Credo che la massima visibilità è data dalla classe. E un metodo può solo ridurre la visibilità e aumentare la visibilità non ha alcun effetto.

Ma è una sintassi valida, quindi forse ho supervisionato qualcosa?

+0

thats un buona domanda, so che in C++ theres una combinazione di protezione + pubblico che non ha effetto in eredità, la mia ipotesi è che qui si ha effetto per le classi nello stesso package. – Infested

risposta

5

Se sottoclasse Example a una classe public, quindi codice esterno al pacchetto può accedere test() metodo che utilizza l'istanza sottoclasse se è public.

Esempio:

package A; 
class Example { 
    public void test() {} 
} 

package A; 
public class SubExample extends Example { 
} 

package B; 
import A.SubExample; 
class OutsidePackage { 
    public void some method(SubExample e){ 
    // Had test been defined with default access in class Example 
    // the below line would be a compilation error. 
    e.test(); 
    } 
} 
+0

Puoi farmi un esempio? Non posso seguirti. – tangens

+0

Ho provato a creare un esempio utilizzando il reflection. Ma ottengo l'eccezione 'java.lang.IllegalAccessException: Class other.Other non può accedere ad un membro di classe example.Example con modificatori "public"'. Quindi sembra che la protezione del pacchetto della classe protegga anche i suoi metodi pubblici. – tangens

+0

Buon esempio, grazie. Quindi fa davvero la differenza se il membro è protetto da pacchetti o pubblico! – tangens

5

Se Example ha implementato un'interfaccia di qualche tipo, è necessario renderli pubblici, poiché in questo caso non è possibile ridurre l'accesso. Tutti i metodi di interfaccia sono, per impostazione predefinita, pubblici.

+0

Buon punto. Quindi, renderesti sempre pubblici i tuoi "pacchetti protetti" quando la classe è già protetta da un pacchetto? – tangens

+0

Non tutti. Non renderei i costruttori pubblici, perché è questo il punto. – duffymo

0

Come scritto, non fa nulla. Se si tratta di una sottoclasse o di un'implementazione dell'interfaccia, è possibile che vengano implementati o sovrascritti metodi dichiarati pubblici altrove.

+0

In realtà, fa la differenza. Vedi la risposta di @ Noob-Unchained. – tangens

Problemi correlati