2009-01-21 3 views
6

Ich weiß, dass dies eine sehr grundlegende Frage ist, aber es ist eine, die mich immer gestört hat. Wie ich verstehe, wenn Sie ein Feld privat in Java deklarieren, dann ist es außerhalb dieser Klasse nicht sichtbar. Wenn es geschützt ist, ist es für vererbte Klassen und alles im selben Paket verfügbar (korrigiere mich, wenn eine dieser Definitionen falsch ist).Zugriffsstufen von Java-Klassenmitgliedern

Bedeutet dies, dass es nicht möglich ist, ein Feld zu deklarieren, das nur für vererbte Klassen und nicht für andere nicht vererbte Klassen im selben Paket verfügbar ist?

Ich weiß zu schätzen, dass es Möglichkeiten gibt, aber gibt es Fälle, in denen Sie diese Art von Verhalten haben möchten?

Offensichtlich gilt die obige Frage sowohl für Methoden als auch für Felder.

Vielen Dank.

+0

Nur eine Bemerkung über das Vokabular: Was Sie hier reden ist * Erreichbarkeit * von Variablen (oder Sichtbarkeit). Der Gültigkeitsbereich einer Variablen ist der Teil des Codes, in dem die Variable verwendet werden kann (der Bereich einer lokalen Variablen ist beispielsweise der Hauptteil der Methode oder der Block, in dem sie definiert ist). –

+0

Vielen Dank dafür Luc – chillysapien

Antwort

3

Grundsätzlich gilt:

  • privat: Erreichbar nur mit der Klasse.
  • public: Zugänglich für jede Klasse.
  • geschützt: Zugänglich durch die Klasse, alle geerbten Klassen und die Klassen des aktuellen Pakets (bearbeitet).
  • Kein Bereich definiert: Zugänglich für alle Klassen des aktuellen Pakets.

Weitere Informationen here.

+0

Geschützt hat Paket-Zugang, siehe die anderen Antworten hier sowie den Link. – Eek

2

Ja, der geschützte Zugriff von Java ist auf diese Weise ein bisschen seltsam. Ich kann nicht sofort sehen, warum es überhaupt wünschenswert ist. Persönlich stört es mich nicht für Felder wie ich nicht nicht private Felder trotzdem mag (andere als Konstanten), aber das gleiche gilt für andere Mitglieder.

. NET hat nicht das Konzept der Paket/Namespace-Zugriff Sichtbarkeit überhaupt, aber es hat eine Alternative, die Assembly (denke "JAR-Datei" - nicht genau das gleiche, aber nahe). Ehrlich gesagt würde ich gerne Namespace und Einsatz-Einheit Sichtbarkeit Optionen haben, aber es scheint, ich bin zum Scheitern verurteilt ...

+0

Könnte in JDK7-Modulen sein ... –

+0

Aber dann gibt es immer noch das Problem der Paket-Ebene Zugriff auf geschützte ... also ja, Module werden helfen, aber es ist immer noch nicht ideal :((Ich bevorzuge auch die "verschachtelt hat Zugriff auf äußere macht "C# -Konzept rückwärts in Java." –