Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Unterschiede zwischen den Java-Modifikatoren abstract, static und final

Detaillierte Erläuterung der Unterschiede zwischen den Java-Modifikatoren abstract, static und final

高洛峰
高洛峰Original
2017-01-24 15:42:101461Durchsuche

Statisch bedeutet statisch, wodurch Eigenschaften, Methoden und Codeblöcke geändert werden können.

1.static ändert das Attribut (Klassenvariable), dann kann auf dieses Attribut über den Klassennamen zugegriffen werden.Attributname, was bedeutet, dass dieses Attribut eine Klassenvariable dieser Klasse wird und von Objekten dieser Klasse gemeinsam genutzt wird Klasse. Dieses Attribut ist für alle Klassen öffentlich. (Variablen gemeinsam genutzter Klassen haben nichts mit Objekten zu tun, sondern nur mit Klassen).

Während des Klassenladevorgangs wird die Klasse selbst auch in der Datei gespeichert (Bytecode-Datei speichert die Klasseninformationen). Java liest die Klassendatei (Bytecode-Datei) über den E/A-Stream virtuelle Maschine), wird dieser Prozess zum Klassenladen. JVM (Java Virtual Machine) findet Bytecode-Dateien über den Klassenpfad (CLASSPATH).

Klassenvariablen werden beim Laden automatisch initialisiert. Die Initialisierungsregeln sind die gleichen wie bei Instanzvariablen.

Hinweis: Instanzvariablen in einer Klasse werden beim Erstellen des Objekts initialisiert. Durch statische Eigenschaften geänderte Eigenschaften, dh Klassenvariablen, werden beim Laden der Klasse erstellt und initialisiert. Das heißt, Klassenvariablen werden nur einmal erstellt.

2. Die statisch geänderte Methode (statische Methode) macht diese Methode für die gesamte Klasse öffentlich und kann über den Klassennamen. Methodennamen aufgerufen werden.

Hinweis: Statisch geänderte Methoden können nicht direkt auf nicht statische (statische) Mitglieder (einschließlich Methoden und Eigenschaften) dieser Klasse zugreifen. einschließlich Methoden und Eigenschaften), können statische Methoden aufgerufen werden. Statische Methoden sollten mit Vorsicht angewendet werden. Dieses Schlüsselwort darf nicht in statischen Methoden vorkommen.

Hinweis: Die übergeordnete Klasse ist eine statische Methode und kann nicht als nicht statische Methode in der Unterklasse überschrieben werden. Unter der Voraussetzung, dass die Abdeckungsregeln eingehalten werden, gilt in der übergeordneten Klasse die statische Methode Die Klasse kann in der Unterklasse eine statische Methode sein, aber keinen Polymorphismus. (Wenn Sie ein Objekt zum Aufrufen einer statischen Methode verwenden, rufen Sie tatsächlich eine statische Methode vom Typ zur Kompilierzeit auf.)

Hinweis: In übergeordneten und untergeordneten Klassen können statische Methoden nur durch statische Methoden überschrieben werden Übergeordnete und untergeordnete Klassen, nicht statische Methoden können nur durch nicht statische Methoden überschrieben werden.

Die Hauptmethode in Java muss als statisch geschrieben werden, da das Objekt beim Laden der Klasse nicht erstellt werden kann. Da statische Methoden nicht über Objekte aufgerufen werden können, befinden sie sich in der Hauptmethode der Klasse. Wenn die Klasse geladen ist, kann das Programm über den Hauptmethodeneintrag ausgeführt werden.

3.static ändert den anfänglichen Codeblock. Zu diesem Zeitpunkt wird dieser anfängliche Codeblock als statischer anfänglicher Codeblock bezeichnet. Dieser Codeblock wird nur einmal ausgeführt, wenn die Klasse geladen wird. Sie können eine Klasse mit einem statischen Initialisierungsblock initialisieren.

Dynamischer Initialisierungscodeblock, geschrieben in „{}“ im Klassenkörper. Dieser Codeblock wird ausgeführt, wenn die Initialisierungseigenschaften des generierten Objekts generiert werden. Diese Art von Codeblock wird als dynamischer Initialisierungscodeblock bezeichnet.

Wann wird die Klasse geladen? Beim Erstellen eines Objekts wird die Klasse geladen. Beim Aufruf statischer Methoden in der Klasse oder beim Zugriff auf statische Eigenschaften wird die Klasse ebenfalls geladen. Beim Laden einer Unterklasse muss zuerst die übergeordnete Klasse geladen werden. Das Laden der Klasse erfolgt nach dem Prinzip des verzögerten Ladens und wird nur dann geladen, wenn sie geladen werden muss.

Der letzte Modifikator kann Variablen, Methoden und Klassen ändern.

1.Endgültige geänderte Variablen
Variablen, die durch fianl geändert wurden, werden zu Konstanten (Konstanten sollten großgeschrieben werden, sobald sie zugewiesen wurden). (Sie können einen Wert direkt während der Initialisierung zuweisen oder einen Wert im Konstruktor zuweisen. Sie können nur eine dieser beiden Methoden auswählen und müssen der Konstante einen Wert zuweisen. Die Konstanten von fianl haben keinen Standardwert.) Anfangswert Für Der endgültige Modifikator wird häufig zusammen mit dem statischen Modifikator verwendet, wenn Werte direkt während der Initialisierung zugewiesen werden.

2. Die durch final geänderte Methode wird nicht von ihren Unterklassen überschrieben, und die Stabilität der Methode kann nicht überschrieben werden.
3. Von final geänderte Klassen werden nicht vererbt. Die Methoden in den Abschlussklassen sind ebenfalls endgültig.

Hinweis: Final kann nicht zum Ändern des Konstruktors verwendet werden. Wenn in der übergeordneten Klasse konstante Attribute vorhanden sind, wird das Laden der übergeordneten Klasse nicht durchgeführt, wenn konstante Attribute in der Unterklasse verwendet werden.

Invarianter Modus, die Eigenschaften des Objekts ändern sich nach der Erstellung nicht. Verwenden Sie final, um Attribute zu ändern, verwenden Sie final auch, um Klassen zu ändern (starker Invarianzmodus) und verwenden Sie final, um Eigenschaften zu ändern (schwacher Invarianzmodus).

Typische Ausführungsform des unveränderlichen Modus: java.lang.String-Klasse, der unveränderliche Modus kann die gemeinsame Nutzung von Objekten realisieren (eine Objektinstanz kann mehreren Objektvariablen zugewiesen werden)

Gepoolt Die Idee besteht darin, das zu setzen Daten, die im Pool gemeinsam genutzt werden müssen (Platz sparen, Daten teilen)
Nur die String-Klasse kann Objekte mit Literalwerten in „“ erstellen. Wenn die String-Klasse mit einem Literalwert erstellt wird, wird sie im String-Pool-Bereich des Java-Methodenraums durchsucht. Wenn einer vorhanden ist, wird die Adresse der Zeichenfolge im String-Pool zurückgegeben wird an die Objektvariable ausgezahlt. Wenn nicht, wird im String-Pool ein String-Objekt erstellt und seine Adresse an die Kaufobjektvariable zurückgegeben. Wenn ein anderes Objekt mit einem Literalwert erstellt wird, wird der obige Vorgang wiederholt.
Wenn new ein Objekt der String-Klasse im Heap-Bereich erstellt, wird der obige Vorgang nicht ausgeführt.

Die intern()-Methode in der String-Klasse vergleicht die Zeichenfolge im String-Klassenobjekt, die im Heap-Bereich erstellt wurde, mit dem String-Pool. Wenn es denselben String gibt, wird der String an die String-Pool-Adresse zurückgegeben .

Der invariante Modus ist beim Ändern und Hinzufügen von Operationen zu Objekten ziemlich problematisch und erzeugt viele Zwischenmüllobjekte. Der Aufwand für die Schaffung und Zerstörung von Ressourcen ist beträchtlich.

Die String-Klasse ist beim Verbinden von Strings sehr ineffizient, da die Eigenschaften der von ihr generierten Objekte nicht geändert werden können. Beim Verbinden von Strings können nur neue Objekte erstellt werden.

Für viele String-Verbindungen sollte die StringBuffer-Klasse verwendet werden. Bei der Verwendung von Objekten dieser Klasse zur Durchführung von String-Verbindungen werden keine redundanten Zwischenobjekte generiert, wodurch die Effizienz optimiert wird.

Abstrakter (abstrakter) Modifikator kann Klassen und Methoden ändern
1.Abstrakter Modifikator macht diese Klasse zu einer abstrakten Klasse. Diese Klasse kann keine Objektinstanzen generieren, kann aber als Objektvariablen verwendet werden Der deklarierte Typ, also der Typ zur Kompilierungszeit, die abstrakte Klasse ist wie ein halbfertiges Produkt einer Klasse, und Unterklassen müssen die darin enthaltenen abstrakten Methoden erben und überschreiben.

2. Die abstrakte Änderungsmethode macht diese Methode zu einer abstrakten Methode, das heißt, sie hat nur eine Deklaration (Definition), aber keine Implementierung. Der Implementierungsteil wird durch „;“ ersetzt. Erfordert, dass Unterklassen die Implementierung erben (überschreiben).

Hinweis: Klassen mit abstrakten Methoden müssen abstrakte Klassen sein. Abstrakte Methoden sind jedoch nicht unbedingt alle abstrakten Methoden, sie können auch konkrete Methoden sein.
Der abstrakte Modifikator muss beim Ändern einer Klasse vor dem Klassennamen platziert werden.

Die abstrakte Änderungsmethode erfordert, dass ihre Unterklassen diese Methode überschreiben (implementieren). Beim Aufruf können Sie die von der Unterklasse abgedeckte (implementierte) Methode polymorph aufrufen, was bedeutet, dass die abstrakte Methode in ihrer Unterklasse implementiert werden muss, es sei denn, die Unterklasse selbst ist ebenfalls eine abstrakte Klasse.

Hinweis: Die übergeordnete Klasse ist eine abstrakte Klasse mit abstrakten Methoden und implementiert (überschreibt) alle abstrakten Methoden in der übergeordneten Klasse. Nur dann kann die Unterklasse Instanzen von Objekten erstellen. Fähigkeiten, andernfalls muss die Unterklasse auch eine abstrakte Klasse sein. Abstrakte Klassen können Konstruktoren haben, bei denen es sich um die Konstruktoren der übergeordneten Klasse (abstrakten Klasse) handelt, die die Unterklasse beim Erstellen des Unterklassenobjekts aufrufen muss.

Final und abstrakt, privat und abstrakt, statisch und abstrakt, das sind Modifikatoren, die nicht zusammengesetzt werden können, da die durch abstract modifizierte Methode in ihrer Unterklasse implementiert (überschrieben) werden muss, um polymorph zu sein Die oben genannten Modifikatoren können beim Ändern der Methode nicht überschrieben werden, sodass sie nicht überschrieben werden können. Bei Methoden vom Typ „Static“ kann sie jedoch nicht überschrieben werden. Da die Methoden der übergeordneten Klasse aufgerufen werden und die Methoden der übergeordneten Klasse abstrakte Methoden sind und nicht aufgerufen werden können, können die Modifikatoren für sie nicht zusammengesetzt werden.

Abstrakte Methode stellt einen bestimmten Standard dar, definiert den Standard, definiert die Funktion und implementiert die Funktion in der Unterklasse (die Unterklasse erbt die übergeordnete Klasse und muss die Implementierung der von der übergeordneten Klasse geerbten abstrakten Methode bereitstellen). ).
Die Methode kann für eine Weile nicht implementiert werden oder ist für die Implementierung durch Unterklassen vorgesehen und definiert einen bestimmten Standard. Diese Methode kann als abstrakt definiert werden. (Zusammenfassung)

Vorlagenmethodenmuster
Verwenden Sie Zusammenfassung, um die Formulierung von Standards und die Implementierung von Standards zu trennen. Die Formulierung von Standards ist die Vorlage, und die Implementierung wird gemäß dem Vorlagenstandard implementiert , die Vorlage erben und die entsprechenden Funktionen in der Vorlagenmethode realisieren. Methoden, die in der Vorlage nicht geändert werden dürfen, können mit fianl geändert werden. Diese Methode kann keine abstrakten Methoden erstellen. Um Sicherheit und Kapselung zu gewährleisten, sollten die nicht öffentlichen Teile der Vorlage mit protected geändert werden.

Ausführlichere Erläuterungen zu den Unterschieden zwischen den Java-Modifikatoren abstract, static und final finden Sie auf der chinesischen PHP-Website für verwandte Artikel!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn