Ich bin immer verwirrt zwischen staticund finalSchlüsselwörtern in Java .
Wie unterscheiden sie sich?
Ich bin immer verwirrt zwischen staticund finalSchlüsselwörtern in Java .
Wie unterscheiden sie sich?
Antworten:
Betrachten wir zunächst statische Variablen und statische Methoden.
Class.variableClass.methodName() thisoder superSchlü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
staticdarin, 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 finalKlasse kann nicht untergeordnet werden. Dies geschieht aus Sicherheits- und Effizienzgründen. Dementsprechend sind viele der Java - Standardbibliothek Klassen final, zum Beispiel java.lang.Systemund java.lang.String. Alle Methoden in einer finalKlasse sind implizit final.
Eine finalMethode 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 finalVariable 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 finalVariable 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 finalim 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 .
public class MyClass {
public static int myVariable = 0;
}
//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
MyClass.myVariable = 5; //This change is reflected in both instances
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.
public class MyClass {
public static List<String> cars = new ArrayList<String>();
static {
cars.add("Ferrari");
cars.add("Scoda");
}
}
public class TestClass {
public static void main(String args[]) {
System.out.println(MyClass.cars.get(0)); //This will print Ferrari
}
}
Sie dürfen dies nicht mit Instanzinitialisierungsblöcken verwechseln, die pro Instanz vor dem Konstruktor aufgerufen werden .
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. staticFelder sind Felder, die keiner bestimmten Instanz einer Klasse angehören .
class C {
public static int n = 42;
}
Hier ist das staticFeld nkeiner bestimmten Instanz von zugeordnet, Csondern der gesamten Klasse im Allgemeinen (weshalb C.nfür den Zugriff darauf verwendet werden kann). Können Sie weiterhin eine Instanz von verwenden, Cum darauf zuzugreifen n? 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.
class C {
public final int n = 42;
}
Hier nkann nicht neu zugewiesen werden, weil es ist final. Ein weiterer Unterschied besteht darin, dass jede Variable deklariert werden kann final, während nicht jede Variable als statisch deklariert werden kann.
Außerdem können Klassen deklariert werden, finaldie angeben, dass sie nicht erweitert werden können:
final class C {}
class B extends C {} // error!
Ebenso können Methoden als endgültig deklariert werden, um anzuzeigen, dass sie nicht von einer erweiterten Klasse überschrieben werden können:
class C {
public final void foo() {}
}
class B extends C {
public void foo() {} // error!
}
publicKlasse, die die Datei definiert) oder staticinnere Klassen können staticVariablen 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
static bedeutet, dass sich nur eine Kopie der Variablen im Speicher befindet, die von allen Instanzen der Klasse gemeinsam genutzt wird.
Das finalSchlüsselwort bedeutet nur, dass der Wert nicht geändert werden kann. Ohne finalkann jedes Objekt den Wert der Variablen ändern.
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:
public class Test{
public final int first = 10;
public static int second = 20;
public Test(){
second = second + 1
first = first + 1;
}
}
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.
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
static final String color = "Black";
stellt sicher, dass der Wert des Farbfelds bei jeder Instanziierung dieser Klasse "Schwarz" ist, sofern er nicht geändert wird.
public class Speaker {
static String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //will provide output as "Black"
Speaker.color = "white";
System.out.println(Speaker.color); //will provide output as "White"
}}
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.
public class Speaker {
static final String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //should provide output as "Black"
Speaker.color = "white"; //Error because the value of color is fixed.
System.out.println(Speaker.color); //Code won't execute.
}}
Sie können diesen Code direkt in Ihren Emulator kopieren / einfügen und versuchen.
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. ""
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:
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
Wikipedia enthält die vollständige Liste der Java-Schlüsselwörter .
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.
staticist 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 in staticBlöcken verwendet werden, aber ich würde mir zunächst keine Sorgen machen.
finalhat unterschiedliche Bedeutungen, je nachdem, ob es auf Variablen, Methoden, Klassen oder andere Fälle angewendet wird. Hier gefallen mir Wikipedia-Erklärungen besser.
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.