Wahl der Leser
Populäre Artikel
Wir werden über Modifikatoren sprechen: Was Modifikatoren sind, Bereiche, Modifikatoren für Klassen, Felder, Methoden. Ich denke, es wird nicht langweilig.
Modifikatoren in Java sind Schlüsselwörter, die einer Klasse, einem Klassenfeld oder einer Methode bestimmte Eigenschaften verleihen.
Um die Sichtbarkeit einer Klasse ihrer Methoden und Felder anzuzeigen, gibt es 4 Zugriffsmodifikatoren:
Wenn Sie sich erinnern, hatten wir am Ende, als wir die Cat-Klasse bereits importiert hatten, immer noch einen Kompilierungsfehler.
Die Sache ist, dass wir keine Zugriffsmodifikatoren für unsere Felder und Methoden angegeben haben und sie über eine Standardeigenschaft verfügen (Klassenmitglieder sind innerhalb des Pakets sichtbar). Um den Kompilierungsfehler für unseren Code zu beheben und ihn schließlich auszuführen, müssen wir unseren Konstruktor und unsere Methoden öffentlich machen. Dann können sie aus anderen Paketen aufgerufen werden.
Sie fragen sich vielleicht: Wozu dient das alles? Warum machen Sie den Code nicht von jedem Paket oder jeder Klasse aus sichtbar, müssen aber den Zugriff einschränken? Diese Fragen verschwinden von selbst, wenn es darum geht, komplexe und umständliche Projekte zu schreiben. Wenn wir nun Anwendungen schreiben, deren Funktionalität auf eine oder zwei Klassen beschränkt ist, scheint es keinen Sinn zu machen, irgendetwas einzuschränken.
Stellen Sie sich vor, Sie haben eine Klasse, die ein Objekt eines bestimmten Produkts anzeigt. Zum Beispiel ein Auto. Das Auto kann einen Preis haben. Sie haben ein Preisfeld und viele andere Felder erstellt, eine Reihe von Methoden, die für die Funktionalität verantwortlich sind. Alles scheint in Ordnung zu sein. Ihr Klassenwagen ist Teil eines riesigen Projekts und alle sind glücklich. Aber nehmen wir an, dass jemand versehentlich oder absichtlich eine Instanz der Autoklasse erstellt und einen negativen Preis festgelegt hat. Kann ein Produkt einen negativen Preis haben? Dies ist ein sehr primitives Beispiel und wird wahrscheinlich nicht passieren wahres Leben, aber ich denke, die Idee ist klar. Manchmal müssen Sie den Zugriff nicht direkt, sondern über bestimmte Methoden gewähren. Es kann sein, dass der Code für die Funktionalität eines anderen Codes verantwortlich ist und Sie nicht möchten, dass jemand einen Teil Ihres Codes ändert und bearbeitet. Zu diesem Zweck besteht eine Zugangsbeschränkung.
Der Zugriffsmodifikator für Konstruktoren, Methoden und Felder kann alles sein. Eine Klasse kann nur entweder öffentlich oder standardmäßig sein und es kann nur eine öffentliche Klasse in einer Datei geben.
Genug über Zugriffsmodifikatoren für jetzt. Im Artikel „Objektorientierte Programmierung“ werden wir ausführlicher darüber sprechen, aber jetzt wollen wir über andere Modifikatoren sprechen, von denen es übrigens viele gibt.
Jetzt kommt der Modifikator statisch. Es kann vor einer Methode, einem Feld und sogar einer Klasse verwendet werden, wenn wir eine verschachtelte Klasse deklarieren möchten. In Java können Sie Klassen innerhalb anderer Klassen schreiben. Wenn der Modifikator vor der Klasse innerhalb der Klasse statisch ist, wird eine solche Klasse als verschachtelt bezeichnet. Wenn ein anderer Modifikator oder Standardwert ist, wird eine solche Klasse als intern bezeichnet. Zu verschachtelten und inneren Klassen wird es einen eigenen Artikel geben, da dort nicht alles so einfach ist.
Der statische Modifikator vor einer Methode oder einem Feld gibt an, dass sie nicht zu einer Instanz dieser Klasse gehört. Was bedeutet das für uns? Wenn wir ein Klassenfeld oder eine Methode als statisch deklariert haben, kann es aufgerufen werden, ohne eine Instanz der Klasse zu verwenden. Das heißt, anstelle dieser Konstruktion: Katze= neue Katze(); cat.method() können Sie einfach Cat.method() schreiben. Vorausgesetzt, die Methode ist als statisch deklariert. Statische Variablen sind für alle Klassenobjekte gleich. Sie haben einen Link.
öffentliche Klassenmodifikatoren (
static int anotherStaticField = 5 ;
public static void myStaticMethod() (
someField = "Mein Feld" ;
//nonStaticField = ""; Kompilierungsfehler
//Sie können keine nicht statischen Felder verwenden
//in statischen Methoden
public void myNonStaticMethod() (
anotherStaticField = 4 ; //statische Felder können verwendet werden
//in nicht statischen Methoden
// Die Hauptmethode verfügt auch über einen statischen Modifikator
new Modificators() .myNonStaticMethod() ;
Modificators.myStaticMethod(); //statische Methoden und Felder aufrufen
//über Classname.method
Ein weiterer wichtiger Punkt bei statischen Modifikatoren ist, dass statische Felder beim Laden der Klasse initialisiert werden. In verschiedenen Arten von Java-Tests finden Sie häufig den folgenden Code:
Frage: Was wird auf der Konsole ausgegeben? Sie müssen bedenken, dass der statische Block in jedem Fall zuerst ausgegeben wird. Als nächstes kommt der Standardblock. Schauen Sie sich als Nächstes den Konsolenbildschirm an:
Der nächste Modifikator, den wir uns ansehen werden, ist Finale.
Ich denke, das Wort „final“ spricht für sich. Durch die Verwendung des finalen Modifikators sagen Sie, dass Felder nicht geändert werden können, Methoden nicht überschrieben werden können und Klassen nicht vererbt werden können (zur Vererbung wird es einen separaten Artikel geben). Dieser Modifikator gilt nur für Klassen, Methoden und Variablen (auch lokale Variablen).
Wir werden im OOP-Artikel über den letzten Modifikator für Methoden und Klassen sprechen.
Als nächstes folgen Modifikatoren, die für Anfänger oder diejenigen, die diese Artikelserie von Grund auf lesen, nicht ganz klar sind. Und auch wenn ich Ihnen noch nicht alles erklären kann (da Sie das Begleitmaterial nicht kennen), rate ich Ihnen dennoch, sich einfach damit vertraut zu machen. Wenn es an der Zeit ist, diese Modifikatoren zu verwenden, werden Sie die meisten der unten verwendeten Begriffe bereits verstehen.
Modifikator synchronisiert– gibt an, dass die Methode jeweils nur von einem Thread verwendet werden kann. Auch wenn Ihnen das vielleicht nichts sagt, wird sich der Nutzen dieses Modifikators zeigen, wenn wir uns mit Multithreading befassen.
Modifikator vergänglich– gibt an, dass ein bestimmtes Feld während der Objektserialisierung ignoriert werden soll. Solche Felder speichern in der Regel Zwischenwerte.
Modifikator flüchtig- Wird für Multithreading verwendet. Wenn ein Feld mit dem Modifikator „volatil“ von mehreren Threads verwendet und geändert wird, stellt dieser Modifikator sicher, dass das Feld der Reihe nach geändert wird und es keine Verwechslungen damit gibt.
Modifikator einheimisch Zeigt vor der Deklaration einer Methode an, dass die Methode in einer anderen Programmiersprache geschrieben ist. Normalerweise in C-Sprache.
Modifikator strictfp— Stellt sicher, dass Operationen mit Float- und Double-Zahlen (Gleitkommazahlen) gemäß dem IEEE 754-Standard ausgeführt werden. Oder einfacher gesagt, es garantiert, dass innerhalb der Methode die Ergebnisse der Berechnungen auf allen Plattformen gleich sind.
Über den Modifikator habe ich noch nicht gesprochen abstrakt. Ich werde kurz darauf eingehen, denn ohne Kenntnisse der Grundlagen der objektorientierten Programmierung sehe ich keinen Sinn darin, darüber zu sprechen.
Eine Klasse mit dem abstrakten Modifikator kann keine Instanz erstellen. Der einzige Zweck besteht darin, es zu erweitern. Die abstrakte Klasse kann sowohl abstrakte als auch reguläre Methoden enthalten.
Wir werden im OOP-Artikel mehr über den abstrakten Modifikator sprechen.
Hier können wir den Artikel über Modifikatoren beenden. Über sie wurde nicht viel gesagt. Dies liegt jedoch daran, dass wir noch nicht über die Konzepte von OOP verfügen. Im Laufe mehrerer Artikel werden wir das Wissen über Modifikatoren erweitern und die Lücken schließen.
Schauen wir uns zunächst die Zugriffsmodifikatoren an. Es gibt nur vier davon:
Während der Vererbung ist es möglich, Zugriffsmodifikatoren in Richtung MEHR Sichtbarkeit zu ändern.
Konstruktoren, Methoden und Felder können beliebige Zugriffsmodifikatoren haben, aber bei Klassen und ihren Blöcken ist nicht alles so einfach. Eine Klasse kann nur entweder öffentlich oder standardmäßig sein und es kann nur eine öffentliche Klasse in einer Datei geben. Ein Block kann nur einen Modifikator haben – Standard.
Fassen wir alle Modifikatoren zusammen:
Klasse |
Innere Klasse |
Variable |
Methode |
Konstrukteur |
Logikblock |
|
öffentlich |
Ja |
Ja |
Ja |
Ja |
Ja |
Nein |
geschützt |
Nein |
Ja (außer lokale und anonyme Klassen) |
Ja |
Ja |
Ja |
Nein |
Standard |
Ja |
Ja |
Ja |
Ja |
Ja |
|
Privat |
Nein |
Ja (außer lokale und anonyme Klassen) |
Ja |
Ja |
Ja |
Nein |
Finale |
Ja |
Ja (und für lokale Variable) |
Ja |
Nein |
Nein |
|
abstrakt |
Ja |
Ja (außer anonyme Kurse) |
Nein |
Ja |
Nein |
Nein |
statisch |
Nein |
Ja (außer lokale und anonyme Klassen) |
Ja |
Ja |
Nein |
Ja |
einheimisch |
Nein |
Nein |
Nein |
Ja |
Nein |
Nein |
vergänglich |
Nein |
Nein |
Ja |
Nein |
Nein |
Nein |
synchronisiert |
Nein |
Nein |
Nein |
Ja |
Nein |
Ja (nur im Rahmen der Methode) |
flüchtig |
Nein |
Nein |
Ja |
Nein |
Nein |
Nein |
strictfp |
Ja |
Ja |
Nein |
Ja |
Nein |
Nein |
Die Java-Sprache bietet viele Modifikatoren, die in die folgenden Kategorien unterteilt sind:
Ein Modifikator wird zum Definieren einer Klasse, Methode oder Variablen verwendet, normalerweise am Anfang einer Anweisung. Zur Veranschaulichung das folgende Beispiel:
Öffentliche Klasse className ( // ... ) private boolean myFlag; statische letzte Doppelwochen = 9,5; protected static final int BOXWIDTH = 42; public static void main(String-Argumente) ( // Referenz )
In Java können Sie Zugriffskontrollsymbole verwenden, um den Zugriff auf Klassen, Variablen, Methoden und Konstruktoren zu schützen. Java unterstützt vier verschiedene Berechtigungen.
Standard, auch Standard genannt Standard, im selben Paket sichtbar sind, verwenden Sie keinen Modifikator.
Privat bis angegeben Privat ein Modifikator, der innerhalb derselben Klasse sichtbar ist.
Ja, um anzuzeigen allgemein ein Modifikator, der für alle Klassen sichtbar ist.
Geschützt, in geschützt Der Modifikator gibt an, dass alle Klassen und Unterklassen innerhalb desselben Pakets sichtbar sind.
Verwenden Sie Variablen und Methoden, die im Standardzugriffsmodifikator für eine Klasse innerhalb desselben sichtbaren Pakets deklariert sind. Eine Schnittstelle, bei der die Variablen implizit als öffentliches statisches Finale deklariert werden, und eine Schnittstelle, bei der der Standardzugriffsmechanismus für die Öffentlichkeit bestimmt ist.
Im folgenden Beispiel können Variablen und Methoden keine Modifikatoren verwenden.
String-Version = „1.5.1“; boolescher ProzessOrder() ( true zurückgeben; )
Der private Zugriffsmodifikator ist die restriktivste Zugriffsebene. Er wird als private Methode und Variable deklariert und gehört zur Konstruktorklasse, auf die nur zugegriffen werden kann. Klassen und Schnittstellen können nicht als privat deklariert werden.
Auf Variablen, die als privater Zugriffstyp deklariert sind, kann außerhalb der Klasse nur über die öffentliche Getter-Methode der Klasse zugegriffen werden.
Der Modifikator „Privater Zugriff“ wird hauptsächlich zum Schutz von Implementierungsdetails und -daten für jede Klasse verwendet.
Die folgenden Klassen verwenden den privaten Zugriffsmodifikator:
Öffentliche Klasse Logger ( privates String-Format; öffentlicher String getFormat() ( return this.format; ) public void setFormat(String format) ( this.format = format; ) )
Beispielsweise ist das Variablenformat der Logger-Klasse eine private Variable, sodass andere Klassen den Wert der Variablen nicht direkt abrufen und festlegen können. Um mit einer anderen Klassenvariablen arbeiten zu können, definiert sie zwei öffentliche Methoden: GetFormat () (Rückgabewertformat) und SetFormat (String) (Formateinstellung).
Es wird als öffentliche Klasse deklariert, Methoden, Konstruktoren und Schnittstellen können jeden anderen Zugriffstyp haben.
Bei mehreren gegenseitigen Besuchen öffentlicher Klassen in unterschiedlichen Paketen müssen Sie das entsprechende Paket der dauerhaft lokalisierten öffentlichen Klasse importieren. Seit der Klassenvererbung können alle öffentlichen Methoden und Variablen einer Klasse von ihren Unterklassen geerbt werden.
Die folgenden Funktionen nutzen die öffentliche Zugriffskontrolle:
Public static void main(String-Argumente) ( // ... )
Hauptmethode Java-Programme() muss auf public gesetzt sein, sonst kann der Java-Interpreter die Klasse nicht ausführen.
Als geschützte Variablen deklariert, können Methoden und Konstruktoren im selben Paket jeden anderen Zugriffstyp haben und in verschiedenen Unterklassenpaketen darauf zugegriffen werden.
Geschützte Zugriffsmodifikatorklassen und Schnittstellen können nicht geändert werden; Methoden und Mitgliedsvariablen können als geschützt deklariert werden, Schnittstellenvariablen und Mitgliedsmethoden können jedoch nicht als geschützt deklariert werden.
Modifikator-Unterklassen können auf deklarierte geschützte Methoden und Variablen zugreifen, sodass wir nicht verwandte Klassen mithilfe dieser Methoden und Variablen schützen können.
Die folgende übergeordnete Klasse verwendet einen geschützten Zugriffsmodifikator. Unterklassen überschreiben die openSpeaker()-Methode der übergeordneten Klasse.
Klasse AudioPlayer ( protected boolean openSpeaker(Speaker sp) ( // Sprachausgabe ) ) class StreamingAudioPlayer ( boolean openSpeaker(Speaker sp) ( // Sprachausgabe ) )
Wenn die openSpeaker()-Methode als privat deklariert ist, kann zusätzlich zur AudioPlayer-Klasse nicht auf die Methode zugegriffen werden. Wenn openSpeaker() als öffentlich deklariert ist, können alle Klassen auf die Methode zugreifen. Wenn wir den Prozess für Unterklassen der Klasse sichtbar machen wollen, dann wird die Methode als geschützt deklariert.
Bitte beachten Sie, dass die folgenden Methoden die Regeln erben:
Die übergeordnete Klasse wird als öffentliche Methode deklariert, in der Unterklasse muss sie ebenfalls öffentlich sein.
Die übergeordnete Klasse wird als geschützte Methode in einer Unterklasse deklariert, entweder als geschützt oder öffentlich deklariert. Sie können nicht als privat deklariert werden.
Eine als private Methode deklarierte übergeordnete Klasse kann nicht vererbt werden.
Um eine Reihe weiterer Funktionen zu erreichen, stellt Java auch eine Reihe von Nichtzugriffsmodifikatoren bereit.
Der statische Modifikator wird zum Erstellen von Klassenmethoden und Klassenvariablen verwendet.
Der endgültige Modifikator wird zum Dekorieren von Klassen, Methoden und Variablen verwendet. Die endgültige geänderte Klasse kann nicht vererbt werden, die geänderte Klassenmethode kann nicht vererbt werden, überschrieben werden und geänderte konstante Variablen können nicht geändert werden.
Der abstrakte Modifikator wird zum Erstellen abstrakter Klassen und abstrakter Methoden verwendet.
Synchrone und flüchtige Modifikatoren, hauptsächlich für Programmierthreads.
Statische Variablen:
Statisch verwendet Stichwort Um statische Variablen unabhängig von einem Objekt zu deklarieren, ist es unabhängig von der Anzahl der Objekte einer Klasseninstanz nur eine Kopie der statischen Variablen. Statische Variablen werden auch als Klassenvariablen bezeichnet. Lokale Variablen können nicht als statische Variablen deklariert werden.
Statische Methoden:
Das Schlüsselwort static wird verwendet, um ein Objekt unabhängig von einer statischen Methode zu deklarieren. Statische Methoden können keine nicht statische Variablenklasse verwenden. Statische Methode, um Daten aus einer Liste von Parametern abzurufen und die Daten dann zu berechnen.
Der Zugriff auf Klassenvariablen und Methoden kann direkt durch Zugriff auf Klassenname.variablenname und Klassenname.methodenname verwendet werden.
Im folgenden Beispiel wird ein statischer Modifikator verwendet, um Klassenmethoden und Klassenvariablen zu erstellen.
Öffentliche Klasse InstanceCounter ( private static int numInstances = 0; protected static int getCount() ( return numInstances; ) private static void addInstance() ( numInstances++; ) InstanceCounter() ( InstanceCounter.addInstance(); ) public static void main(String-Argumente ) ( System.out.println("Beginnend mit " + InstanceCounter.getCount() + " Instanzen"); for (int i = 0; i< 500; ++i){ new InstanceCounter(); } System.out.println("Created " + InstanceCounter.getCount() + " instances"); } }
Beispiele für die oben genannten Ergebnisse des Bearbeitungsvorgangs sind wie folgt:
Begonnen mit 0 Instanzen. Erstellt 500 Instanzen
Endgültige Variablen:
Endgültige Variablen können explizit initialisiert werden und werden nur einmal initialisiert. Ein Verzeichnis wird deklariert, da Endobjekte nicht auf ein anderes Objekt verweisen können. Aber das Endziel ist, wo die Daten geändert werden können. Dies ist ein endgültiger Verweis auf ein Objekt, das nicht geändert werden kann, dessen Wert jedoch geändert werden kann.
Der letzte Modifikator wird normalerweise zusammen verwendet, um eine statische Modifikatorklassenkonstante zu erstellen.
Öffentliche Klasse Test( final int value = 10; // public static final int BOXWIDTH = 6; static final String TITLE = "Manager"; public void changeValue(){ value = 12; //将输出一个错误 } } !}
Methoden einer endgültigen Klasse werden von Unterklassen geerbt, aber Unterklassen können sie nicht ändern.
Der Hauptzweck einer Methode besteht darin, zu verhindern, dass die endgültige Anweisung dieser Methode geändert wird.
Wie unten gezeigt wird, werden die endgültigen Methoden zur Deklaration von Modifikatoren verwendet.
Öffentlicher Klassentest( public final void changeName())( // 方法体 ) )
Endgültige Klassen können nicht vererbt werden; keine Klasse kann Merkmale einer endgültigen Klasse erben.
Öffentlicher Abschlusstest ( // 类体 )
Abstrakte Klasse:
Eine abstrakte Klasse kann nicht zum Instanziieren eines Objekts verwendet werden; der einzige Zweck der Anweisung besteht darin, eine abstrakte Klasse für die zukünftige Erweiterung dieser Klasse zu erstellen.
Eine Klasse kann nicht abstrakt und endgültig geändert werden. Wenn eine Klasse abstrakte Methoden enthält, muss die Klasse als abstrakte Klasse deklariert werden, andernfalls tritt ein Compilerfehler auf.
Eine abstrakte Klasse kann abstrakte Methoden und nicht abstrakte Methoden enthalten.
Abstrakte Klasse Caravan( privater doppelter Preis; privates String-Modell; privates String-Jahr; öffentliche Zusammenfassung void goFast(); //抽象方法 öffentliche Zusammenfassung void changeColor(); )
Keine Methode ist eine abstrakte Methodenimplementierung, eine konkrete Methodenimplementierung wird durch Unterklassen bereitgestellt. Abstrakte Methoden können nicht als endgültig und streng deklariert werden.
Jede Unterklasse, die eine abstrakte Klasse erbt, muss alle abstrakten Methoden der übergeordneten Klasse implementieren, es sei denn, die Unterklasse ist eine abstrakte Klasse.
Enthält eine Klasse mehrere abstrakte Methoden, muss die Klasse als abstrakte Klasse deklariert werden. Eine abstrakte Klasse kann keine abstrakten Methoden enthalten.
Eine abstrakte Methodendeklaration endet mit einem Semikolon, zum Beispiel: public abstract sample();
Öffentliche abstrakte Klasse SuperClass( abstract void m(); //抽象方法 ) class SubClass erweitert SuperClass( //实现抽象方法 void m())( ......... ) )
Methode Synchrones Schlüsselwort, um zu deklarieren, dass nur ein Thread gleichzeitig zugreift. Der Synchronmodifikator kann auf vier Zugriffsmodifikatoren angewendet werden.
Öffentliche synchronisierte void showDetails() ( ....... )
Das serialisierte Objekt enthält vorübergehende Variablen, die von der Java Virtual Machine (JVM)-Instanz geändert wurden, um diese bestimmte Variable zu überspringen.
Der Modifikator ist in der Definition von Anweisungsvariablen enthalten, um Datentypklassen und -variablen vorzuverarbeiten.
Öffentliches transientes Int-Limit = 55; // bleibt nicht bestehen public int b; // wird bestehen bleiben
Eine flüchtig geänderte Mitgliedsvariable zwingt Threads dazu, den Wert der Mitgliedsvariablen bei jedem Zugriff erneut aus dem gemeinsam genutzten Speicher zu lesen. Wenn sich Mitgliedsvariablen ändern, ist der Thread außerdem gezwungen, den in den gemeinsam genutzten Speicher zurückgeschriebenen Wert zu ändern. Also jederzeit zwei andere Themen immer sehen gleichen Wert Mitgliedsvariable.
Die öffentliche Klasse MyRunnable implementiert Runnable ( private volatile boolean active; public void run() ( active = true; while (active) // Funktion ( // Funktion ) ) public void stop() ( active = false; // Funktion行 ) )
Unter normalen Umständen ruft ein Thread die Run()-Methode (im Runnable eines offenen Threads) auf, während ein anderer Thread die Stop()-Methode aufruft. Wenn der aktive Wert in erste Linie Puffer wird verwendet zweite Reihe Wenn die aktive Schleife falsch ist, stoppt sie nicht.
Im obigen Code verwenden wir jedoch ein modifiziertes flüchtiges Aktiv, sodass die Schleife stoppt.
Letzte Aktualisierung: 03.10.2019
Alle Mitglieder einer Klasse – Felder, Methoden, Eigenschaften – haben sie alle Zugriffsmodifikatoren. Mit Zugriffsmodifikatoren können Sie den zulässigen Bereich für Klassenmitglieder angeben. Das heißt, Zugriffsmodifikatoren bestimmen den Kontext, in dem eine bestimmte Variable oder Methode verwendet werden kann. In früheren Themen sind wir bereits darauf gestoßen, als wir die Felder einer Klasse als öffentlich deklariert haben (also mit dem Modifikator public).
Die folgenden Zugriffsmodifikatoren werden in C# verwendet:
public: Eine öffentliche, öffentliche Klasse oder ein Mitglied einer Klasse. Auf ein solches Klassenmitglied kann von überall im Code sowie von anderen Programmen und Assemblys aus zugegriffen werden.
privat: Eine private Klasse oder ein Klassenmitglied. Stellt das genaue Gegenteil des öffentlichen Modifikators dar. Auf eine solche private Klasse oder ein solches Klassenmitglied kann nur über Code in derselben Klasse oder demselben Kontext zugegriffen werden.
protected: Auf dieses Klassenmitglied kann von überall in der aktuellen Klasse oder in abgeleiteten Klassen zugegriffen werden. In diesem Fall können abgeleitete Klassen in anderen Assemblys liegen.
intern: Auf eine Klasse und Klassenmitglieder mit einem ähnlichen Modifikator kann von überall im Code in derselben Assembly zugegriffen werden, andere Programme oder Assemblys können jedoch nicht darauf zugreifen (wie es beim öffentlichen Modifikator der Fall ist).
protected internal: kombiniert die Funktionalität zweier Modifikatoren. Auf Klassen und Klassenmitglieder mit diesem Modifikator kann von der aktuellen Assembly und von abgeleiteten Klassen aus zugegriffen werden.
privat geschützt: Auf dieses Klassenmitglied kann von überall in der aktuellen Klasse oder in abgeleiteten Klassen zugegriffen werden, die in derselben Assembly definiert sind.
Wir können den Zugriffsmodifikator explizit festlegen, zum Beispiel:
Private geschützte Klasse State ( internal int a; protected void Print() ( Console.WriteLine($"a = (a)"); ) )
Oder wir geben möglicherweise nicht an:
Klassenstatus ( int a; void Print() ( Console.WriteLine($"a = (a)"); ) )
Wenn für Felder und Methoden kein Zugriffsmodifikator definiert ist, ist der Standardmodifikator private .
Ohne Modifikator deklarierte Klassen und Strukturen verfügen standardmäßig über internen Zugriff.
Alle Klassen und Strukturen, die direkt in Namespaces definiert und nicht in anderen Klassen verschachtelt sind, können nur die öffentlichen oder internen Modifikatoren haben.
Schauen wir uns ein Beispiel an und erstellen wir die folgende State-Klasse:
Public class State ( // das Gleiche wie private int defaultVar; int defaultVar; // das Feld ist nur von der aktuellen Klasse aus zugänglich private int privateVar; // zugänglich von der aktuellen Klasse und abgeleiteten Klassen, die im selben Projekt definiert sind protected privat int protectedPrivateVar; // verfügbar von der aktuellen Klasse und abgeleiteten Klassen protected int protectedVar; // überall im aktuellen Projekt verfügbar internal int internalVar; // überall im aktuellen Projekt und von abgeleiteten Klassen in anderen Projekten verfügbar protected internal int protectedInternalVar; / / überall im Programm sowie für andere Programme und Assemblys verfügbar public int publicVar; // hat standardmäßig einen Modifikator private void defaultMethod() => Console.WriteLine($"defaultVar = (defaultVar)"); // Auf die Methode kann nur von der aktuellen Klasse aus zugegriffen werden private void privateMethod() => Console.WriteLine($"privateVar = (privateVar)"); // Zugriff von der aktuellen Klasse und abgeleiteten Klassen, die im selben Projekt definiert sind protected private void protectedPrivateMethod() => Console.WriteLine($ "protectedPrivateVar = (protectedPrivateVar)"); // Zugriff von der aktuellen Klasse und abgeleiteten Klassen protected void protectedMethod()=> Console.WriteLine($"protectedVar = (protectedVar)"); // überall im aktuellen Projekt verfügbar internal void internalMethod() => Console.WriteLine($"internalVar = (internalVar)"); // überall im aktuellen Projekt und von abgeleiteten Klassen in anderen Projekten zugänglich protected internal void protectedInternalMethod() => Console.WriteLine($"protectedInternalVar = (protectedInternalVar)"); // überall im Programm sowie für andere Programme und Assemblys verfügbar public void publicMethod() => Console.WriteLine($"publicVar = (publicVar)"); )
Da die State-Klasse mit dem öffentlichen Modifikator deklariert wird, ist sie von überall im Programm sowie von anderen Programmen und Assemblys aus zugänglich. Die State-Klasse verfügt über fünf Felder für jede Zugriffsebene. Plus eine Variable ohne Modifikator, die standardmäßig privat ist.
Es gibt außerdem sechs Methoden, mit denen die Klassenfeldwerte auf dem Bildschirm angezeigt werden. Bitte beachten Sie, dass, da alle Modifikatoren die Verwendung von Klassenmitgliedern innerhalb einer bestimmten Klasse ermöglichen, alle Klassenvariablen, einschließlich privater, für alle Methoden verfügbar sind, da alle im Kontext der State-Klasse stehen.
Sehen wir uns nun an, wie wir unsere Klassenvariablen in einem Programm (d. h. in der Main-Methode der Program-Klasse) verwenden können, wenn sich die State- und Program-Klassen im selben Projekt befinden:
Klassenprogramm ( static void Main(string args) ( State state1 = new State(); // Wir können der Variablen defaultVar keinen Wert zuweisen, // da sie einen privaten Modifikator hat und die Programmklasse ihn nicht sieht it // Und wenn diese Zeichenfolge für die Umgebung nicht sichtbar ist, wird sie als falsch hervorgehoben. state1.defaultVar = 5; //Fehler, Zugriff kann nicht erhalten werden // Gleiches gilt für die Variable privateVar state1.privateVar = 5; // Fehler, Zugriff kann nicht abgerufen werden // das Zuweisen eines Werts zur Variable protectedPrivateVar funktioniert nicht, // da die Program-Klasse keine abgeleitete Klasse der State-Klasse ist state1.protectedPrivateVar =5; // Fehler, Zugriff kann nicht abgerufen werden // beim Zuweisen eines Werts auf die Variable protectedVar funktioniert auch nicht, // da die Program-Klasse keine abgeleitete Klasse der State-Klasse ist state1.protectedVar = 5; // Fehler, Zugriff kann nicht erhalten werden // Auf die Variable internalVar mit dem internen Modifikator kann zugegriffen werden irgendwo im aktuellen Projekt // also ruhig den Wert zuweisen state1.internalVar = 5; // Auf die Variable protectedInternalVar kann auch von überall im aktuellen Projekt zugegriffen werden state1.protectedInternalVar = 5; // publicVar-Variable ist öffentlich state1.publicVar = 5; ) )
Daher konnten wir nur die Variablen internalVar, protectedInternalVar und publicVar setzen, da deren Modifikatoren die Verwendung in diesem Kontext zulassen.
Ähnlich verhält es sich mit den Methoden:
Klassenprogramm ( static void Main(string args) ( State state1 = new State(); state1.defaultMethod(); // Fehler, auf den Zugriff kann nicht zugegriffen werden state1.privateMethod(); // Fehler, auf den Zugriff kann nicht zugegriffen werden state1.protectedPrivateMethod () ; // Fehler, Zugriff kann nicht erhalten werden state1.protectedMethod(); // Fehler, Zugriff kann nicht erhalten werden state1.internalMethod(); // ok state1.protectedInternalMethod(); // ok state1.publicMethod(); / / OK ) )
Hier standen uns nur drei Methoden zur Verfügung: internalMethod, protectedInternalMethod, publicMethod, die jeweils die Modifikatoren internal, protected internal und public haben.
Dank dieses Systems von Zugriffsmodifikatoren ist es möglich, einige Aspekte der Klassenimplementierung vor anderen Teilen des Programms zu verbergen.
Obwohl die öffentlichen und internen Modifikatoren in ihrer Wirkung ähnlich sind, gibt es einen großen Unterschied. Klassen und Klassenmitglieder mit dem öffentlichen Modifikator stehen auch anderen Programmen zur Verfügung, wenn diese Klasse in einer dynamischen Bibliotheks-DLL abgelegt und dann in diesen Programmen verwendet wird.
Was Sie während der Initialisierung hinzufügen, um Werte zu ändern. Die Java-Sprache verfügt über eine Vielzahl von Modifikatoren. Die wichtigsten sind:
Um einen Modifikator in Java zu verwenden, müssen Sie sein Schlüsselwort in die Definition einer Klasse, Methode oder Variable aufnehmen. Der Modifikator muss vor dem Rest der Anweisung stehen, wie in den folgenden Beispielen gezeigt:
Öffentliche Klasse className ( // ... ) private boolean myFlag; statische letzte Doppelwochen = 9,5; protected static final int BOXWIDTH = 42; public static void main(String-Argumente) ( // Methodenkörper)
Java bietet eine Reihe von Zugriffsmodifikatoren, um Zugriffsebenen für Klassen, Variablen, Methoden und Konstruktoren festzulegen. Es gibt vier Zugänge:
Standardzugriffsmodifikator- bedeutet, dass wir in Java keinen Zugriffsmodifikator für eine Klasse, ein Feld, eine Methode usw. explizit deklarieren.
Auf eine ohne Zugriffskontrollmodifikator deklarierte Variable oder Methode kann jede andere Klasse im selben Paket zugreifen. Felder in einer Schnittstelle sind implizit öffentlich, statisch und endgültig, und Methoden in einer Schnittstelle sind standardmäßig öffentlich.
Variablen und Methoden können in Java ohne Modifikatoren deklariert werden, wie im folgenden Beispiel gezeigt:
String-Version = „1.5.1“; boolescher ProzessOrder() ( true zurückgeben; )
Modifikator privat- Auf Methoden, Variablen und Konstruktoren, die in Java als privat deklariert sind, kann nur innerhalb der deklarierten Klasse selbst zugegriffen werden.
Der private Zugriffsmodifikator ist die restriktivste Zugriffsebene. Klasse und Schnittstellen können nicht privat sein.
Auf als privat deklarierte Variablen kann außerhalb der Klasse zugegriffen werden, wenn die öffentlichen Methoden, die sie empfangen, in der Klasse vorhanden sind (siehe Beispiel und Erklärung unten).
Die Verwendung des privaten Modifikators in Java ist die wichtigste Möglichkeit, Daten auszublenden.
Die folgende Klasse verwendet private Zugriffskontrolle:
Öffentliche Klasse Logger ( privates String-Format; öffentlicher String getFormat() ( return this.format; ) public void setFormat(String format) ( this.format = format; ) )
Hier die Variable Format Klasse Logger ist privat, daher gibt es für andere Klassen keine Möglichkeit, seinen Wert direkt abzurufen und festzulegen.
Um diese Variable allen zugänglich zu machen, haben wir zwei öffentliche Methoden definiert: getFormat() was einen Wert zurückgibt Format, Und setFormat(String), wodurch der Wert festgelegt wird.
öffentlicher Modifikator- Klasse, Methode, Konstruktor, Schnittstelle usw. Auf die als öffentlich deklarierte Klasse kann von jeder anderen Klasse aus zugegriffen werden. Daher kann auf innerhalb einer öffentlichen Klasse deklarierte Felder, Methoden und Blöcke von jeder Klasse aus zugegriffen werden, die zum Java-„Universum“ gehört.
Wenn wir jedoch versuchen, auf eine öffentliche Klasse in einem anderen Paket zuzugreifen, muss die öffentliche Klasse importiert werden.
Dank der Klassenvererbung werden in Java alle öffentlichen Methoden und Variablen einer Klasse von ihren Unterklassen geerbt.
Die folgende Funktion verwendet die öffentliche Zugriffskontrolle:
Public static void main(String-Argumente) ( // ... )
Methode hauptsächlich() muss öffentlich sein. Andernfalls kann es nicht mit dem Java-Interpreter aufgerufen werden, um die Klasse auszuführen.
Modifikator geschützt- Auf Variablen, Methoden und Konstruktoren, die in einer Oberklasse als geschützt deklariert sind, können nur Unterklassen in einem anderen Paket oder eine beliebige Klasse in einem Paket der geschützten Klasse zugreifen.
Der geschützte Zugriffsmodifikator in Java kann nicht auf Klassen und Schnittstellen angewendet werden. Methoden und Felder können als geschützt deklariert werden, Methoden und Felder in einer Schnittstelle können jedoch nicht als geschützt deklariert werden.
Der geschützte Zugriff gibt einer Unterklasse die Möglichkeit, eine Hilfsmethode oder -variable zu verwenden, wodurch verhindert wird, dass eine nicht verwandte Klasse versucht, sie zu verwenden.
Die folgende übergeordnete Klasse verwendet die geschützte Zugriffskontrolle, sodass ihre untergeordnete Klasse die Methode überschreibt openSpeaker():
Klasse AudioPlayer ( protected boolean openSpeaker(Speaker sp) ( // Implementierungsdetails ) ) class StreamingAudioPlayer ( boolean openSpeaker(Speaker sp) ( // Implementierungsdetails ) )
Darüber hinaus, wenn wir eine Methode definieren openSpeaker() als geschützt festgelegt ist, kann von keiner anderen Klasse außer AudioPlayer darauf zugegriffen werden. Wenn wir es als öffentlich definieren, wird es für alle verfügbar. Aber unsere Absicht ist, diese Methode nur der Unterklasse zugänglich zu machen, deshalb haben wir den geschützten Modifikator verwendet.
Für geerbte Methoden gelten in Java die folgenden Regeln:
Java bietet eine Reihe von Modifikatoren nicht für den Zugriff, sondern für die Implementierung vieler anderer Funktionalitäten:
Modifikator statisch– wird zum Erstellen von Klassenmethoden und -variablen verwendet.
Das Schlüsselwort static wird zum Erstellen von Variablen verwendet, die unabhängig von für die Klasse erstellten Instanzen existieren. Unabhängig von der Anzahl der Instanzen der Klasse existiert in Java nur eine Kopie einer statischen Variablen.
Statische Variablen werden auch als Klassenvariablen bezeichnet. In Java können lokale Variablen nicht als statisch deklariert werden.
Das Schlüsselwort static wird zum Erstellen von Methoden verwendet, die unabhängig von den für die Klasse erstellten Instanzen existieren.
In Java verwenden statische Methoden oder statische Methoden keine Instanzvariablen eines Klassenobjekts, sie sind definiert. Die statischen Methoden akzeptieren alle Daten der Parameter und einige dieser Parameter werden ohne Bezug auf die Variablen berechnet.
Auf Klassenvariablen und -methoden kann zugegriffen werden, indem der Klassenname gefolgt von einem Punkt und dem Namen der Variablen oder Methode verwendet wird.
Der statische Modifikator in Java wird zum Erstellen von Methoden von Klassen und Variablen verwendet, wie im folgenden Beispiel gezeigt:
Öffentliche Klasse InstanceCounter ( private static int numInstances = 0; protected static int getCount() ( return numInstances; ) private static void addInstance() ( numInstances++; ) InstanceCounter() ( InstanceCounter.addInstance(); ) public static void main(String-Argumente ) ( System.out.println("Beginnend mit " + InstanceCounter.getCount() + " Instanz"); for (int i = 0; i
Es ergibt sich folgendes Ergebnis:
Ab 0 Instanz werden 500 Instanzen erstellt
letzter Modifikator- Wird verwendet, um die Implementierung von Klassen, Methoden und Variablen abzuschließen.
Eine letzte Variable kann nur einmal initialisiert werden. Einer als final deklarierten Referenzvariablen kann niemals zugewiesen werden, auf ein anderes Objekt zu verweisen.
Die Daten innerhalb des Objekts können jedoch geändert werden. Somit kann der Zustand eines Objekts geändert werden, nicht jedoch die Referenz.
Bei Variablen in Java wird der letzte Modifikator oft zusammen mit static verwendet, um eine Klassenvariable konstant zu machen.
Die letzte Methode kann von keiner Unterklasse überschrieben werden. Wie bereits erwähnt, verhindert der letzte Modifikator in Java, dass eine Methode von einer Unterklasse geändert wird.
Der Hauptzweck einer endgültigen Methode besteht darin, dass die Inhalte der Methode nicht gleichzeitig geändert werden.
Eine Methodendeklaration, die den finalen Modifikator in einer Klassendeklaration verwendet, wird im folgenden Beispiel gezeigt:
Öffentliche Klasse Test( public final void changeName())( // Methodenkörper ) )
Der Hauptzweck der Verwendung einer als final deklarierten Klasse in Java besteht darin, zu verhindern, dass die Klasse eine Unterklasse ist. Wenn eine Klasse als final markiert ist, kann keine Klasse eine Funktion von der finalen Klasse erben.
abstrakter Modifikator- Wird zum Erstellen abstrakter Klassen und Methoden verwendet.
Eine abstrakte Klasse kann nicht instanziiert werden. Wenn eine Klasse als abstrakt deklariert ist, besteht ihr einziger Zweck darin, sie zu erweitern.
Eine Klasse kann nicht sowohl abstrakt als auch final sein, da eine finale Klasse nicht erweitert werden kann. Wenn eine Klasse abstrakte Methoden enthält, muss sie als abstrakt deklariert werden. Andernfalls wird ein Kompilierungsfehler generiert.
Die abstrakte Klasse kann sowohl abstrakte als auch reguläre Methoden enthalten.
Eine abstrakte Methode ist eine Methode, die mit einer beliebigen Implementierung deklariert wird. Der Methodenkörper (Implementierung) wird von der Unterklasse bereitgestellt. Abstrakte Methoden können niemals endgültig oder streng sein.
Jede Klasse, die eine abstrakte Klasse erweitert, muss alle abstrakten Methoden der Oberklasse implementieren, es sei denn, die Unterklasse ist eine abstrakte Klasse.
Wenn eine Klasse in Java eine oder mehrere abstrakte Methoden enthält, muss die Klasse als abstrakt deklariert werden. Eine abstrakte Klasse muss keine abstrakten Methoden enthalten.
Eine abstrakte Methode endet mit einem Semikolon. Beispiel: öffentliches abstraktes Beispiel ();
synchronisierter Modifikator
Das synchronisierte Schlüsselwort wird verwendet, um anzugeben, dass jeweils nur ein Thread auf eine Methode zugreifen kann. In Java kann der synchronisierte Modifikator mit jedem der vier Zugriffsebenenmodifikatoren angewendet werden.
Eine als transient gekennzeichnete Instanzvariable weist auf virtuell hin Java-Maschine(JVM), um eine bestimmte Variable zu überspringen, wenn das Objekt, das sie enthält, serialisiert wird.
Dieser Modifikator ist in einer Anweisung enthalten, die eine Variable der vorhergehenden Klasse oder des Datentyps der Variablen erstellt.
flüchtiger Modifikator– wird in Java für Threads verwendet.
In Java wird der Modifikator volatile verwendet, um der JVM mitzuteilen, dass ein Thread, der auf eine Variable zugreift, immer seine eigene Kopie der Variablen mit der Masterkopie im Speicher zusammenführen soll.
Durch den Zugriff auf eine flüchtige Variable werden alle zwischengespeicherten kopierten Variablen synchronisiert Arbeitsspeicher. Volatile kann nur auf Instanzvariablen angewendet werden, die vom Typ Objekt oder Privat sind. Eine flüchtige Objektreferenz kann null sein.
Normalerweise wird run() in einem Thread aufgerufen (wenn Sie Runnable zum ersten Mal in Java verwenden) und stop() in einem anderen Thread. Wenn Zeile 1 den zwischengespeicherten Wert „Aktiv“ verwendet, kann die Schleife erst angehalten werden, wenn Sie „Aktiv“ in Zeile 2 auf „Falsch“ setzen.
In der nächsten Lektion besprechen wir die grundlegenden Operatoren, die in der Java-Sprache verwendet werden. In diesem Abschnitt erhalten Sie einen Überblick darüber, wie Sie sie während der Anwendungsentwicklung verwenden können.
In Verbindung stehende Artikel: | |
ELF- und PE-EXE-Formate So öffnen Sie eine Elf-Datei in Windows
Wenn auf Ihrem Computer ein Antivirenprogramm installiert ist ... plt-Erweiterung. Wie öffne ich plt? Warum PLT und was sind seine Vorteile?
Auf dieser Seite wird erklärt, wie Sie ganz einfach ein ... konvertieren können. Radmin – Fernverwaltung und -verwaltung von Windows-PCs Was Radmin kann
Es gibt viele Beispiele für die Fernbedienung... |