Ich bin immer verwirrt zwischen static
und final
Schlüsselwörtern in Java .
Wie unterscheiden sie sich?
Betrachten wir zunächst statische Variablen und statische Methoden.
Class.variable
Class.methodName()
this
oder super
Schlüsselwörter verweisen .Java hat auch "statisch verschachtelte Klassen". Eine statisch verschachtelte Klasse ist nur eine Klasse, die nicht implizit auf eine Instanz der äußeren Klasse verweist.
Statisch verschachtelte Klassen können Instanzmethoden und statische Methoden haben.
In Java gibt es keine statische Klasse der obersten Ebene.
Die Hauptmethode besteht
static
darin, dass auf sie zugegriffen werden muss, damit eine Anwendung ausgeführt werden kann, bevor eine Instanziierung stattfindet.
final
Das Schlüsselwort wird in verschiedenen Kontexten verwendet, um eine Entität zu definieren, die später nicht mehr geändert werden kann.Eine final
Klasse kann nicht untergeordnet werden. Dies geschieht aus Sicherheits- und Effizienzgründen. Dementsprechend sind viele der Java - Standardbibliothek Klassen final
, zum Beispiel java.lang.System
und java.lang.String
. Alle Methoden in einer final
Klasse sind implizit final
.
Eine final
Methode kann nicht von Unterklassen überschrieben werden. Dies wird verwendet, um unerwartetes Verhalten einer Unterklasse zu verhindern, die eine Methode ändert, die für die Funktion oder Konsistenz der Klasse von entscheidender Bedeutung sein kann.
Eine final
Variable kann nur einmal initialisiert werden, entweder über einen Initialisierer oder eine Zuweisungsanweisung. Es muss zum Zeitpunkt der Deklaration nicht initialisiert werden: Dies wird als blank final
Variable bezeichnet. Eine leere endgültige Instanzvariable einer Klasse muss definitiv am Ende jedes Konstruktors der Klasse zugewiesen werden, in der sie deklariert ist. In ähnlicher Weise muss eine leere endgültige statische Variable in einem statischen Initialisierer der Klasse, in der sie deklariert ist, definitiv zugewiesen werden. Andernfalls tritt in beiden Fällen ein Fehler bei der Kompilierung auf.
Wenn eine anonyme innere Klasse im Hauptteil einer Methode definiert ist, kann auf alle final
im Bereich dieser Methode deklarierten Variablen innerhalb der inneren Klasse zugegriffen werden. Nach der Zuweisung kann sich der Wert der endgültigen Variablen nicht mehr ändern.
Class.methodName()
statisch bedeutet, dass es zur Klasse und nicht zu einer Instanz gehört. Dies bedeutet, dass nur eine Kopie dieser Variablen / Methode von allen Instanzen einer bestimmten Klasse gemeinsam genutzt wird .
final ist völlig unabhängig, es ist eine Möglichkeit, eine einmalige Initialisierung zu definieren. Sie können entweder beim Definieren der Variablen oder innerhalb des Konstruktors nirgendwo anders initialisieren.
note Ein Hinweis zu endgültigen Methoden und endgültigen Klassen. Auf diese Weise kann explizit angegeben werden, dass die Methode oder Klasse nicht überschrieben bzw. erweitert werden kann.
Zusätzliche Lektüre Beim Thema Statik haben wir also über die anderen Verwendungszwecke gesprochen, die es möglicherweise in statischen Blöcken verwendet. Bei der Verwendung statischer Variablen ist es manchmal erforderlich, diese Variablen vor der Verwendung der Klasse einzurichten. Leider erhalten Sie keinen Konstruktor. Hier kommt das statische Schlüsselwort ins Spiel.
Sie dürfen dies nicht mit Instanzinitialisierungsblöcken verwechseln, die pro Instanz vor dem Konstruktor aufgerufen werden .
quelle
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
Die beiden sind sich wirklich nicht ähnlich.
static
Felder sind Felder, die keiner bestimmten Instanz einer Klasse angehören .Hier ist das
static
Feldn
keiner bestimmten Instanz von zugeordnet,C
sondern der gesamten Klasse im Allgemeinen (weshalbC.n
für den Zugriff darauf verwendet werden kann). Können Sie weiterhin eine Instanz von verwenden,C
um darauf zuzugreifenn
? Ja - aber es wird nicht als besonders gute Praxis angesehen.final
zeigt andererseits an, dass sich eine bestimmte Variable nach ihrer Initialisierung nicht ändern kann.Hier
n
kann nicht neu zugewiesen werden, weil es istfinal
. Ein weiterer Unterschied besteht darin, dass jede Variable deklariert werden kannfinal
, während nicht jede Variable als statisch deklariert werden kann.Außerdem können Klassen deklariert werden,
final
die angeben, dass sie nicht erweitert werden können:Ebenso können Methoden als endgültig deklariert werden, um anzuzeigen, dass sie nicht von einer erweiterten Klasse überschrieben werden können:
quelle
public
Klasse, die die Datei definiert) oderstatic
innere Klassen könnenstatic
Variablen definieren . Andere innere Klassen sind Instanzen der äußeren Klasse und können keine statischen Variablen haben.Finale -
1) Wenn wir das Schlüsselwort " final " auf eine Variable anwenden , bleibt der Wert dieser Variablen konstant. (oder) Sobald wir eine Variable als endgültig deklariert haben , kann der Wert dieser Variablen nicht mehr geändert werden.
2) Es ist nützlich, wenn sich ein variabler Wert während der Lebensdauer eines Programms nicht ändert
statisch -
1) Wenn wir eine Variable mit dem Schlüsselwort " static " versehen , bedeutet dies, dass sie zur Klasse gehört. 2) Wenn wir ein " statisches " Schlüsselwort auf eine Methode anwenden , bedeutet dies, dass auf die Methode zugegriffen werden kann, ohne eine Instanz der Klasse zu erstellen
quelle
static
bedeutet, dass sich nur eine Kopie der Variablen im Speicher befindet, die von allen Instanzen der Klasse gemeinsam genutzt wird.Das
final
Schlüsselwort bedeutet nur, dass der Wert nicht geändert werden kann. Ohnefinal
kann jedes Objekt den Wert der Variablen ändern.quelle
Statisch und endgültig weisen einige große Unterschiede auf:
Statische Variablen oder Klassen sind immer von (so ziemlich) überall verfügbar. Final ist nur ein Schlüsselwort, das bedeutet, dass eine Variable nicht geändert werden kann. Also wenn hätte:
Das Programm würde ausgeführt, bis es versuchte, die "erste" Ganzzahl zu ändern, was einen Fehler verursachen würde. Außerhalb dieser Klasse hätten Sie nur dann Zugriff auf die "erste" Variable, wenn Sie die Klasse instanziiert hätten. Dies steht im Gegensatz zu "Sekunde", die jederzeit verfügbar ist.
quelle
Stellen Sie sich ein Objekt wie einen Lautsprecher vor. Wenn Speaker eine Klasse ist, hat sie verschiedene Variablen wie Lautstärke, Höhen, Bässe, Farben usw. Sie definieren alle diese Felder, während Sie die Speaker-Klasse definieren. Sie haben beispielsweise das Farbfeld mit einem statischen Modifikator deklariert. Dies bedeutet, dass Sie dem Compiler mitteilen, dass genau eine Kopie dieser Variablen vorhanden ist, unabhängig davon, wie oft die Klasse instanziiert wurde.
Erklären
stellt sicher, dass der Wert des Farbfelds bei jeder Instanziierung dieser Klasse "Schwarz" ist, sofern er nicht geändert wird.
Hinweis: Sobald Sie die Farbe des Lautsprechers als endgültig ändern, wird dieser Code nicht ausgeführt, da das Schlüsselwort final sicherstellt, dass sich der Wert des Felds niemals ändert.
Sie können diesen Code direkt in Ihren Emulator kopieren / einfügen und versuchen.
quelle
Einfacher Unterschied,
Final : bedeutet, dass der Wert der Variablen Final ist und sich nirgendwo ändert. Wenn Sie sagen, dass final x = 5 ist, bedeutet dies, dass x nicht geändert werden kann. Sein Wert ist für alle endgültig.
Statisch: bedeutet, dass es nur ein Objekt hat. Nehmen wir an, Sie haben x = 5, im Speicher befindet sich x = 5 und seine Gegenwart innerhalb einer Klasse. Wenn Sie ein Objekt oder eine Instanz der Klasse erstellen, bedeutet dies, dass dort ein bestimmtes Feld vorhanden ist, das diese Klasse und ihre Variablen und Methoden darstellt. Wenn Sie ein anderes Objekt oder eine andere Instanz dieser Klasse erstellen, bedeutet dies, dass zwei Felder derselben Klasse mit unterschiedlichem x im Speicher vorhanden sind. und wenn Sie beide x an unterschiedlichen Positionen aufrufen und ihren Wert ändern, ist ihr Wert unterschiedlich. Feld 1 hat x mit x = 5 und Feld 2 hat x = 6. Wenn Sie das x jedoch statisch machen, bedeutet dies, dass es nicht erneut erstellt werden kann. Sie können ein Objekt der Klasse erstellen, aber dieses Objekt enthält kein anderes x. Wenn x statisch ist, haben Box 1 und Box 2 dasselbe x, das den Wert 5 hat. Ja, ich kann den Wert von static überall ändern, da er nicht endgültig ist. Wenn ich also sage, Box 1 hat x und ich ändere seinen Wert auf x = 5 und danach mache ich eine andere Box, die Box2 ist, und ich ändere den Wert von Box2 x auf x = 6. dann, da X statisch ist, haben beide Felder das gleiche x. und beide Felder geben den Wert von Feld als 6 an, da Feld2 den Wert von 5 bis 6 überschreibt.
Sowohl endgültig als auch statisch sind völlig unterschiedlich. Final, das final ist, kann nicht geändert werden. statisch, bleibt eins, kann aber geändert werden.
"Dies ist ein Beispiel. Denken Sie daran, dass statische Variablen immer mit ihrem Klassennamen aufgerufen werden. Da sie nur eine für alle Objekte dieser Klasse sind. Klasse A hat also x = 5, ich kann sie aufrufen und durch Ax = 6 ändern. ""
quelle
Statisch ist etwas, das jedes Objekt in einer Klasse aufrufen kann und das von Natur aus zu einem Objekttyp gehört.
Eine Variable kann für eine ganze Klasse endgültig sein, und das bedeutet einfach, dass sie nicht mehr geändert werden kann. Es kann nur einmal eingestellt werden. Wenn Sie versuchen, es erneut einzustellen, wird ein Fehler ausgegeben. Es ist aus mehreren Gründen nützlich. Vielleicht möchten Sie eine Konstante deklarieren, die nicht geändert werden kann.
Ein Beispielcode:
Wikipedia enthält die vollständige Liste der Java-Schlüsselwörter .
quelle
Ich werde hier nicht versuchen, eine vollständige Antwort zu geben. Meine Empfehlung wäre, sich darauf zu konzentrieren, zu verstehen, was jeder von ihnen tut, und dann sollte klar sein, dass ihre Wirkungen völlig unterschiedlich sind und warum sie manchmal zusammen verwendet werden.
static
ist für Mitglieder einer Klasse (Attribute und Methoden) und muss im Gegensatz zu (nicht statischen) Instanzmitgliedern verstanden werden. Ich würde empfehlen, "Instanz- und Klassenmitglieder verstehen" in den Java-Tutorials zu lesen . Ich kann auch instatic
Blöcken verwendet werden, aber ich würde mir zunächst keine Sorgen machen.final
hat unterschiedliche Bedeutungen, je nachdem, ob es auf Variablen, Methoden, Klassen oder andere Fälle angewendet wird. Hier gefallen mir Wikipedia-Erklärungen besser.quelle
Statische Variablenwerte können geändert werden, obwohl eine Kopie der Variablen die Anwendung durchläuft, während endgültige Variablenwerte einmal initialisiert werden können und nicht in der gesamten Anwendung geändert werden können.
quelle