Was ist der Standard-zugriffsmodifizierer?
Ich habe gerade angefangen, Lesen ein Java-Buch und fragte sich; die access-modifier ist die Standard-Einstellung, falls nichts angegeben ist?
- Der richtige Begriff lautet "access modifier'. Das Wort 'Planer' - erscheint nicht in der JLS.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Standard-Sichtbarkeit ist bekannt als das "private-Paket" (obwohl Sie nicht verwenden können, ist dies explizit), was bedeutet, das Feld ist zugänglich von innerhalb des gleichen Pakets zu dem die Klasse gehört.
Als mdma wies darauf hin, es ist nicht wahr, Schnittstelle für Mitglieder, obwohl, für die der Standardwert ist "public".
Sehen Java ist Zugriffsbezeichner
Standardwert hängt von Kontext.
Für Klassen-und interface-Deklarationen, das ist Standard-Paket privat. Dieser fällt zwischen protected und private, so dass nur Klassen im selben Paket Zugriff. (geschützt ist wie dieser, sondern auch Zugang zu den Unterklassen außerhalb des Pakets.)
Für interface-member (Felder und Methoden), die default-Zugriff ist public. Aber beachten Sie, dass die interface-Deklaration selbst wird standardmäßig auf package-private.
Wenn wir dann die Erklärung
Klassen mit MyInterface2 können dann sehen, Feld1 und methode1 aus dem super-interface, weil Sie öffentlich sind, auch wenn Sie nicht sehen können, die Erklärung von MyInterface selbst.
/* pp */
) ist nur eine bequeme Bezeichnung für Standard-access. Es ist nicht die Justiz, Freiheit und Sicherheit name.Wenn kein zugriffsspezifizierer angegeben ist, das Paket-level-Zugriff (es gibt keine explizite Bezeichner für diese) für Klassen und Klassenmember. Interface-Methoden sind implizit public.
Die Standard-Sichtbarkeit (kein Schlüsselwort) ist Paket was bedeutet, dass es verfügbar sein wird für jede Klasse, die sich im gleichen Paket.
Interessante Randnotiz ist, dass geschützt nicht begrenzen Sie die Sichtbarkeit der Unterklassen, sondern auch für die anderen Klassen im gleichen Paket
Es hängt davon ab, was die Sache ist.
Top-level-Typen (das heißt, Klassen, enums, interfaces, and annotation-Typen nicht deklariert werden, die innerhalb einer anderen Art) sind - Paket-private - standardmäßig. (JLS §6.6.1)
In den Klassen, alle Mitglieder (das heißt, Felder, Methoden und nested-type-Deklarationen) und Konstruktoren sind - Paket-private - standardmäßig. (JLS §6.6.1)
In enums, Konstruktoren sind private standardmäßig. In der Tat, enum contructors muss privat sein, und es wird ein Fehler gemeldet, um anzugeben, Sie als public oder protected. Enum-Konstanten sind immer öffentlichen, und erlauben keine zugriffsspezifizierer. Die anderen Mitglieder des enums sind - Paket-private - standardmäßig. (JLS §8.9)
Schnittstellen und annotation-Typen, alle Mitglieder (wieder, das heißt, Felder, Methoden und nested-type-Deklarationen) sind öffentlichen standardmäßig. In der Tat, die Mitglieder der Schnittstellen-und annotation-Typen muss öffentlich sein, und es wird ein Fehler gemeldet, um anzugeben, Sie als privat oder geschützt. (JLS §9.3 bis 9.5)
Lokale Klassen benannt werden Klassen deklariert, innerhalb einer Methode, Konstruktor oder block-Initialisierer. Sie sind , eingeschränkt auf die
{
..}
- block in dem Sie deklariert sind und erlauben keine zugriffsspezifizierer. (JLS §14.3) Mit Reflexion, Sie instanziieren können lokale Klassen, die von anderswo, und Sie sind - Paket-private -, obwohl ich bin mir nicht sicher, ob das detail ist in der JLS.Anonyme Klassen sind eigene Klassen erstellt, die mit
new
die angeben, ein Klasse Körper, die direkt in den Ausdruck. (JLS §15.9.5) Ihre syntax erlaubt keine zugriffsspezifizierer. Mit Reflexion, Sie instanziieren können anonyme Klassen, die von anderswo, und sowohl Sie als auch Ihre Konstruktoren erzeugt werden, sind - Paket-private -, obwohl ich bin mir nicht sicher, ob das detail ist in der JLS.Instanz-und statischen Initialisierer Blöcke haben keine Zugriffsbezeichner auf sprachlicher Ebene (JLS §8.6 & 8.7), aber statische Initialisierer Blöcke sind implementiert als Methode mit dem Namen
<clinit>
(JVMS §2.9), also die Methode muss intern haben einige zugriffsspezifizierer. Ich untersuchte Klassen kompiliert mit javac und durch Eclipse-compiler mit einem hex-editor und festgestellt, dass beide erzeugen die Methode als - Paket-private -. Sie können jedoch nicht nennen<clinit>()
innerhalb der Sprache, weil die<
und>
Zeichen sind ungültig im Namen einer Methode und die Reflexion Methoden sind fest verdrahtet, zu leugnen, seine Existenz, so effektiv seine access-specifier keinen Zugang. Die Methode kann nur aufgerufen werden, indem der VM, während der Klassen-Initialisierung. Instanz Initialisierer Blöcke werden nicht kompiliert als separate Methoden; Ihr code wird kopiert in jedem Konstruktor, so dass Sie nicht zugegriffen werden individuell, auch durch Reflexion.Standard ist ein Schlüsselwort, das verwendet wird als access-modifier für Methoden und Variablen.
Mit dieser access-modifier wird Ihre Klasse, variable, Methode oder Konstruktor zugreifbar, aus der eigenen Klasse oder ein Paket, es wird auch gesetzt, wenn kein zugriffsmodifizierer vorhanden ist.
wenn Sie mit einer Standard-in eine Schnittstelle, die Sie in der Lage, implementieren eine Methode gibt, wie dieses Beispiel
Aber es funktioniert nur ab der 8 Java-version
Offizielle Dokumentation
Sehen hier für mehr details. Der Standardwert ist keine private/public/protected, aber mit einem ganz anderen access-Spezifikation. Es ist nicht sehr verbreitet, und ich ziehe es vor, viel mehr spezifische in meiner access-Definitionen.
Standard access specifier Paket.Klassen können auf die Mitglieder anderer Klassen im gleichen Paket.aber auch außerhalb des Pakets scheint es, als private
Hier ist ein Zitat über den Paket-level-Sichtbarkeit aus einem interview mit James Gosling, der Erfinder von Java:
http://www.artima.com/intv/gosling2P.html
Update Java 8 Nutzung von
default
Schlagwort:Wie viele andere haben darauf hingewiesen, Die Standard-Sichtbarkeit (kein Schlüsselwort)
Nicht zu verwechseln mit dem neuen Java 8 Funktion ( Default-Methoden ), die erlaubt, dass eine Schnittstelle für eine Implementierung bereitstellen, wenn sein gekennzeichnet mit der
default
Stichwort.Finden Sie unter: Zugriffsmodifizierer
Es ist eine access-modifier als "default" in JAVA, die es ermöglicht direkte Instanz Schaffung dieser Einheit, die nur im Paket.
Hier ist ein nützlicher link:
Java-Zugriffsmodifizierer/Planer
Zunächst lassen Sie mich Ihnen eins sagen, es gibt keinen solchen Begriff wie "Access specifier" in java. Wir sollten alles als "Modifikatoren". Wie wir wissen, dass die endgültige, statische, synchronisiert, volatile.... genannt werden als Modifikatoren, auch Public, private, protected, default, abstract sollte auch genannt werden als Modifikatoren . Standardmäßig ist eine solche Modifikatoren, wo die physische Existenz nicht gibt, aber keine Modifikatoren gelegt wird, dann sollte es behandelt werden, als Standard-Modifikatoren.
Rechtfertigen diese nehmen sich ein Beispiel:
Ausgabe:
Hello Java
Nun ändern Sie den öffentlichen zu den privaten und zu sehen, welche compiler-Fehler erhalten Sie:
Es sagt "Modifizierer private ist hier nicht erlaubt"
Welche Schlussfolgerung ist jemand kann falsch sein, oder einige Tutorials kann falsch sein, aber der compiler kann nicht falsch sein.
So können wir sagen, es gibt keinen Begriff, der Zugriff auf Bezeichner in java ist alles Modifikatoren.