Unterschied zwischen statisch und endgültig?

174

Ich bin immer verwirrt zwischen staticund finalSchlüsselwörtern in Java .

Wie unterscheiden sie sich?

TechnoCorner
quelle

Antworten:

238

Das statische Schlüsselwort kann in 4 Szenarien verwendet werden

  • statische Variablen
  • statische Methoden
  • statische Codeblöcke
  • statisch verschachtelte Klasse

Betrachten wir zunächst statische Variablen und statische Methoden.

Statische Variable

  • Es ist eine Variable, die zur Klasse und nicht zum Objekt (Instanz) gehört.
  • Statische Variablen werden zu Beginn der Ausführung nur einmal initialisiert. Diese Variablen werden zuerst initialisiert, bevor Instanzvariablen initialisiert werden.
  • Eine einzelne Kopie, die von allen Instanzen der Klasse gemeinsam genutzt werden soll.
  • Auf eine statische Variable kann direkt über den Klassennamen zugegriffen werden und benötigt kein Objekt.
  • Syntax: Class.variable

Statische Methode

  • Es ist eine Methode, die zur Klasse und nicht zum Objekt (Instanz) gehört.
  • Eine statische Methode kann nur auf statische Daten zugreifen. Es kann nicht auf nicht statische Daten (Instanzvariablen) zugreifen, es sei denn, es verfügt über eine Instanz der Klasse.
  • Eine statische Methode kann nur andere statische Methoden aufrufen und keine nicht statische Methode daraus aufrufen, es sei denn, sie verfügt über eine Instanz der Klasse.
  • Auf eine statische Methode kann direkt über den Klassennamen zugegriffen werden und benötigt kein Objekt.
  • Syntax: Class.methodName()
  • Eine statische Methode kann ohnehin nicht auf thisoder superSchlüsselwörter verweisen .

Statische Klasse

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.

Randnotiz:

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.

Hinweis: Wenn die Variable eine Referenz ist, bedeutet dies, dass die Variable nicht erneut gebunden werden kann, um auf ein anderes Objekt zu verweisen. Das Objekt, auf das es verweist, ist jedoch immer noch veränderbar, wenn es ursprünglich veränderbar war.

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.

Ashish
quelle
5
(Ich habe Sie nicht abgelehnt.) Einige weitere Erläuterungen: "Eine statische Methode kann nur auf statische Daten zugreifen. Sie kann nicht auf nicht statische Daten (Instanzvariablen) zugreifen." - AUSSER sie hat / erstellt eine Instanz der Klasse. "Eine statische Methode kann nur andere statische Methoden aufrufen und keine nicht statische Methode daraus aufrufen." - AUSSER es hat / erstellt eine Instanz der Klasse.
Xagyg
1
in statischer Methode Syntax Erklärung, die Sie falsch erwähnt haben, denke ich. es könnte seinClass.methodName()
Mdhar9e
Wir können auch statische Klassen haben. Nehmen Sie eine Korrektur in Ihrer Antwort vor. Danke :)
Madhusudan
Ab Java 8 kann eine anonyme Klasse (und Lambda) effektiv auf endgültige Variablen zugreifen und das endgültige Schlüsselwort nicht einschränken.
akhil_mittal
38

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 .

Jon Taylor
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.
Wenn Sie
2
Einfach und klar wie es sein sollte. Akzeptierte Antwort ist nur ... ausführlich.
22

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!
}
arshajii
quelle
Danke für die Eingaben. Der Code gibt einen Fehler aus: Klasse C {public static int n = 42; } Es heißt, dass das Feld im nicht statischen Typ nicht statisch deklarieren kann. Warum kann ich Cn nicht deklarieren oder tun?
TechnoCorner
@TechnoCorner Nur Klassen der obersten Ebene (die potenzielle 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.
Zapl
17

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

Rohit
quelle
12

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.

Emmanuel Osimosu
quelle
3

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.

Alistair
quelle
3

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.

vishnulphb
quelle
2

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. ""

Malick Usman
quelle
1

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 .

PearsonArtPhoto
quelle
Was meinst du mit einem bestimmten Objekt? Können Sie bitte veranschaulichen.
TechnoCorner
0

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.

madth3
quelle
-1

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.

Paul entwerten
quelle