Java Language
Sichtbarkeit (Kontrolle des Zugriffs auf Mitglieder einer Klasse)
Suche…
Syntax
- Name des öffentlichen Typs [= Wert];
- Name des privaten Typs [= Wert];
- geschützter Typname [= Wert];
- Typname [= Wert];
- öffentlicher Klassenname {
- Klassenname{
Bemerkungen
Aus dem Java-Tutorial :
Zugriffsstufenmodifizierer bestimmen, ob andere Klassen ein bestimmtes Feld verwenden oder eine bestimmte Methode aufrufen können. Es gibt zwei Ebenen der Zugriffskontrolle:
- Auf der obersten Ebene -
public
oder package-private (kein expliziter Modifikator). - Auf Mitgliedsebene -
public
,private
,protected
oder package-private (kein expliziter Modifikator).
Eine Klasse kann mit dem Modifizierer public
deklariert werden. In diesem Fall ist diese Klasse für alle Klassen überall sichtbar. Wenn eine Klasse keinen Modifikator hat (der Standard, auch als package-private bezeichnet ), ist sie nur in ihrem eigenen Paket sichtbar.
Auf Mitgliedsebene können Sie ebenso wie bei Klassen der obersten Ebene und mit derselben Bedeutung den Modifizierer public
oder no modifier ( package-private ) verwenden. Für Mitglieder gibt es zwei zusätzliche Zugriffsmodifizierer: private
und protected
. Der private
Modifizierer gibt an, dass auf das Member nur in seiner eigenen Klasse zugegriffen werden kann. Der protected
Modifier gibt an, dass auf das Mitglied nur innerhalb seines eigenen Pakets (wie bei package-private ) und zusätzlich auf eine Unterklasse seiner Klasse in einem anderen Paket zugegriffen werden kann.
Die folgende Tabelle zeigt den Zugriff auf Mitglieder, die von jedem Modifikator zugelassen werden.
Zugangsebenen:
Modifikator | Klasse | Paket | Unterklasse | Welt |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
kein Modifikator | Y | Y | N | N |
private | Y | N | N | N |
Interface-Mitglieder
public interface MyInterface {
public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X {
}
class Y {
}
}
Die Mitglieder der Benutzeroberfläche sind immer öffentlich sichtbar, auch wenn das public
Schlüsselwort nicht angegeben wird. Daher sind sowohl foo()
auch bar()
, TEXT
, ANSWER
, X
und Y
öffentlich sichtbar. Der Zugriff kann jedoch immer noch durch die enthaltende Schnittstelle eingeschränkt sein. Da MyInterface
öffentlich MyInterface
ist, kann auf seine Mitglieder von überall her zugegriffen werden. Wenn MyInterface
jedoch MyInterface
hatte, waren seine Mitglieder nur aus demselben Paket heraus erreichbar.
Sichtbarkeit der Öffentlichkeit
Sichtbar für die Klasse, das Paket und die Unterklasse.
Sehen wir uns ein Beispiel mit der Klasse Test an.
public class Test{
public int number = 2;
public Test(){
}
}
Versuchen wir nun, eine Instanz der Klasse zu erstellen. In diesem Beispiel können wir auf die number
zugreifen, da sie public
.
public class Other{
public static void main(String[] args){
Test t = new Test();
System.out.println(t.number);
}
}
Private Sichtbarkeit
private
Sichtbarkeit kann auf eine Variable nur von ihrer Klasse zugegriffen werden. Sie werden häufig in Verbindung mit public
Getter und Setzern verwendet.
class SomeClass {
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
public class SomeOtherClass {
public static void main(String[] args) {
SomeClass sc = new SomeClass();
// These statement won't compile because SomeClass#variable is private:
sc.variable = 7;
System.out.println(sc.variable);
// Instead, you should use the public getter and setter:
sc.setVariable(7);
System.out.println(sc.getVariable());
}
}
Paket-Sichtbarkeit
Ohne Modifikator lautet die Standardeinstellung für die Paketsichtbarkeit. In der Java-Dokumentation "zeigt [Paketsichtbarkeit] an, ob Klassen in demselben Paket wie die Klasse (unabhängig von ihrer Abstammung) Zugriff auf das Member haben." In diesem Beispiel von javax.swing
package javax.swing;
public abstract class JComponent extends Container … {
…
static boolean DEBUG_GRAPHICS_LOADED;
…
}
DebugGraphics
befindet sich im selben Paket, sodass auf DEBUG_GRAPHICS_LOADED
.
package javax.swing;
public class DebugGraphics extends Graphics {
…
static {
JComponent.DEBUG_GRAPHICS_LOADED = true;
}
…
}
Dieser Artikel enthält einige Hintergrundinformationen zu diesem Thema.
Geschützte Sicht
Geschützte Sichtbarkeitsursachen bedeuten, dass dieses Member zusammen mit seinen Unterklassen für sein Paket sichtbar ist.
Als Beispiel:
package com.stackexchange.docs;
public class MyClass{
protected int variable; //This is the variable that we are trying to access
public MyClass(){
variable = 2;
};
}
Jetzt erweitern wir diese Klasse und versuchen, auf eines ihrer protected
Mitglieder zuzugreifen.
package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
public SubClass(){
super();
System.out.println(super.variable);
}
}
Sie können auch auf ein protected
Mitglied zugreifen, ohne es zu erweitern, wenn Sie von demselben Paket aus darauf zugreifen.
Beachten Sie, dass dieser Modifikator nur für Member einer Klasse und nicht für die Klasse selbst funktioniert.
Zusammenfassung der Zugriffsmodifizierer für Klassenmitglieder
Zugriffsmodifizierer | Sichtweite | Erbe |
---|---|---|
Privatgelände | Nur Klasse | Kann nicht vererbt werden |
Kein Modifikator / Paket | Im Paket | Verfügbar, wenn Unterklasse im Paket |
Geschützt | Im Paket | Verfügbar in Unterklasse |
Öffentlichkeit | Überall | Verfügbar in Unterklasse |
Es gab einmal einen private protected
(beide Schlüsselwörter gleichzeitig) Modifizierer, der auf Methoden oder Variablen angewendet werden konnte, um sie von einer Unterklasse außerhalb des Pakets aus zugänglich zu machen, sie jedoch für die Klassen in diesem Paket als privat zu definieren. Dies wurde jedoch in der Version von Java 1.0 entfernt .