2009-02-27 16 views
11

Qualcuno può spiegarmi qual è la differenza tra protected/publicClassi interne?protected Inner Classes

So che le classi interne public devono evitare il più possibile (come spiegato in questo article).

Ma da quello che posso dire, non vi è alcuna differenza tra l'uso dei modificatori protected o public.

Date un'occhiata a questo esempio:

public class Foo1 { 
public Foo1() { } 

protected class InnerFoo { 
    public InnerFoo() { 
    super(); 
    } 
} 
} 

...

public class Foo2 extends Foo1 { 
public Foo2() { 
    Foo1.InnerFoo innerFoo = new Foo1.InnerFoo(); 
} 
} 

...

public class Bar { 
public Bar() { 
    Foo1 foo1 = new Foo1(); 
    Foo1.InnerFoo innerFoo1 = foo1.new InnerFoo(); 

    Foo2 foo2 = new Foo2(); 
    Foo2.InnerFoo innerFoo2 = foo2.new InnerFoo(); 
} 
} 

Tutto questo compila ed è valido se dichiaro InnerFooprotected oppure public.

Cosa mi manca? Per favore, indicami un caso in cui c'è una differenza nell'uso di protected o public.

Grazie.

risposta

19

Il modificatore di accesso protected limiterà l'accesso da classi diverse da quelle presenti nello stesso pacchetto e nelle relative sottoclassi.

Nell'esempio illustrato, lo public e lo protected avranno lo stesso effetto, in quanto sono nello stesso pacchetto.

Per ulteriori informazioni sui modificatori di accesso, la pagina Controlling Access to Members of a Class di The Java Tutorials potrebbe essere di interesse.

+0

Ok. Vedo la mia confusione. Perché le classi interne sono come membri della classe che racchiude io pensavo in termini di membri protetti. Grazie. –

+1

@bruno conde: le classi protette * sono * come membri protetti. –

+0

In altre parole, "protetto" in Java, sia applicato ai membri che alle classi interne, è diverso da C++ e C#. Concede l'accesso ad altre classi nello stesso pacchetto (spazio dei nomi). – Qwertie

1

Si può solo pensare che la classe interna protetta sia membro protetto, quindi accede solo per classe, pacchetto, sottoclasse ma non per il mondo.

Inoltre, per la classe esterna, è disponibile solo due modificatori di accesso. Solo pubblico e pacchetto.