2009-02-27 11 views
11

Kann mir bitte jemand erklären, was ist der Unterschied zwischen protected/publicInner Klassen?geschützt/öffentliche Inner Klassen

Ich weiß, dass public inneren Klassen so viel wie möglich zu vermeiden sind (wie in diesem article erklärt).

Aber von was ich sagen kann, gibt es keinen Unterschied zwischen protected oder public Modifikatoren zu verwenden.

bei diesem Beispiel Werfen Sie einen Blick:

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(); 
} 
} 

All dies kompiliert und ist gültig, ob ich erklären InnerFooprotected oder public.

Was fehlt mir? Bitte zeigen Sie mir einen Fall, in dem es einen Unterschied zwischen protected oder public gibt.

Danke.

Antwort

19

Der Zugriffsmodifizierer protected schränkt den Zugriff von anderen Klassen als denen im selben Paket und seinen Unterklassen ein.

In dem gezeigten Beispiel haben die public und protected den gleichen Effekt, wie sie in dem gleichen Paket sind.

Für weitere Informationen zu Zugriffsmodifizierern kann die Seite Controlling Access to Members of a Class von The Java Tutorials von Interesse sein.

+0

Ok. Ich sehe meine Verwirrung. Da innere Klassen wie Mitglieder der umschließenden Klasse sind, dachte ich in Bezug auf geschützte Mitglieder. Vielen Dank. –

+1

@bruno conde: geschützte Klassen * sind * wie geschützte Mitglieder. –

+0

Mit anderen Worten, "geschützt" in Java, ob auf Mitglieder oder innere Klassen angewendet, unterscheidet sich von C++ und C#. Es gewährt Zugriff auf andere Klassen in demselben Paket (Namespace). – Qwertie

1

Sie können einfach denken, geschützte innere Klasse ist geschütztes Mitglied, so dass es nur Zugriff für Klasse, Paket, Unterklasse, aber nicht für die Welt.

Darüber hinaus gibt es für die Außenklasse nur zwei Zugriffsmodifizierer. Nur öffentlich und Paket.