Eine Anleitung zum statischen Schlüsselwort in Java

Eine Anleitung zum statischen Schlüsselwort in Java

1. Einführung

In diesem Artikel werden wir das Schlüsselwortstaticder Java-Sprache im Detail untersuchen. Wir werden herausfinden, wie wir das Schlüsselwortstatic auf Variablen, Methoden, Blöcke, verschachtelte Klassen anwenden können und welchen Unterschied es macht.

2. Die Anatomie des Schlüsselwortsstatic

In der Java-Programmiersprachethe keyword static indicates that the particular member belongs to a type itself, rather than to an instance of that type.

Dies bedeutet, dass nur eine Instanz dieses statischen Members erstellt wird, die von allen Instanzen der Klasse gemeinsam genutzt wird.

image

Das Schlüsselwort kann auf Variablen, Methoden, Blöcke und verschachtelte Klassen angewendet werden.

3. Diestatic Felder (oder Klassenvariablen)

In Javaif a field is declared static, then exactly a single copy of that field is created and shared among all instances of that class. Es spielt keine Rolle, wie oft wir eine Klasse initialisieren. Es wird immer nur eine Kopie des Feldes vonstaticgeben, das dazu gehört. Der Wert diesesstatic-Felds wird für alle Objekte derselben Klasse geteilt.

Aus Speichersichtstatic variables go in a particular pool in JVM memory called Metaspace (vor Java 8 hieß dieser Pool Permanent Generation oder PermGen, das vollständig entfernt und durch Metaspace ersetzt wurde).

3.1. Beispiel für das Feldstatic

Angenommen, wir haben eineCar-Klasse mit mehreren Attributen (Instanzvariablen). Immer wenn neue Objekte aus diesemCar-Entwurf initialisiert werden, hat jedes neue Objekt eine eigene Kopie dieser Instanzvariablen.

Angenommen, wir suchen nach einer Variablen, die die Anzahl derCar-Objekte enthält, die initialisiert werden, und die von allen Instanzen gemeinsam genutzt wird, sodass sie bei ihrer Initialisierung darauf zugreifen und sie erhöhen können.

Hier kommen die Variablen vonstaticins Spiel:

public class Car {
    private String name;
    private String engine;

    public static int numberOfCars;

    public Car(String name, String engine) {
        this.name = name;
        this.engine = engine;
        numberOfCars++;
    }

    // getters and setters
}

Jetzt wird für jedes Objekt dieser Klasse, das initialisiert wird, dieselbe Kopie der VariablennumberOfCars inkrementiert. Für diesen Fall gelten also die folgenden Aussagen:

@Test
public void whenNumberOfCarObjectsInitialized_thenStaticCounterIncreases() {
    new Car("Jaguar", "V8");
    new Car("Bugatti", "W16");

    assertEquals(2, Car.numberOfCars);
}

3.2. Überzeugende Gründe für die Verwendung vonstatic Feldern

  • Wenn der Wert der Variablen von Objekten unabhängig ist

  • Wenn der Wert für alle Objekte freigegeben werden soll

3.3. Wichtige Punkte, an die Sie sich erinnern sollten

  • Da die Variablen vonstaticzu einer Klasse gehören, kann direkt über den Klassennamen auf sie zugegriffen werden und es wird keine Objektreferenz benötigt

  • static Variablen können nur auf Klassenebene deklariert werden

  • Auf die Felder vonstatickann ohne Objektinitialisierung zugegriffen werden

  • Obwohl wir mit einer Objektreferenz aufstatic Felder zugreifen können (wieford.numberOfCars_) , we should refrain from using it as in this case it becomes difficult to figure whether it’s an instance variable or a class variable; instead, we should always refer to _static_ variables using class name (for example, in this case, _Car.numberOfCars)

4. Diestatic Methoden (oder Klassenmethoden)

Ähnlich wie die Felder vonstaticgehören auch die Methoden vonstaticzu einer Klasse anstelle des Objekts. Sie können daher aufgerufen werden, ohne das Objekt der Klasse zu erstellen, in der sie sich befinden. Sie sollen verwendet werden, ohne Objekte der Klasse zu erstellen.

4.1. Beispiel für die Methodestatic

Die Methoden vonstaticwerden im Allgemeinen verwendet, um eine Operation auszuführen, die nicht von der Instanzerstellung abhängig ist.

Wenn es einen Code gibt, der für alle Instanzen dieser Klasse freigegeben werden soll, schreiben Sie diesen Code in einerstatic-Methode:

public static void setNumberOfCars(int numberOfCars) {
    Car.numberOfCars = numberOfCars;
}

static Methoden werden auch häufig zum Erstellen von Dienstprogramm- oder Hilfsklassen verwendet, damit sie abgerufen werden können, ohne ein neues Objekt dieser Klassen zu erstellen.

Schauen Sie sich einfach die DienstprogrammklassenCollections oderMathvon JDK,StringUtils von Apache oderCollectionUtils von Spring Framework an und beachten Sie, dass alle Methodenstatic sind.

4.2. Überzeugende Gründe für die Verwendung vonstatic Methoden

  • Zugriff auf / Bearbeitung von statischen Variablen und anderen statischen Methoden, die nicht von Objekten abhängen

  • static Methoden werden häufig in Dienstprogramm- und Hilfsklassen verwendet

4.3. Wichtige Punkte, an die Sie sich erinnern sollten

  • static Methoden in Java werden zur Kompilierungszeit aufgelöst. Da das Überschreiben von Methoden Teil des Laufzeitpolymorphismus ist,so static methods can’t be overridden

  • abstrakte Methoden können nicht statisch sein

  • Die Methoden vonstatickönnen keine Schlüsselwörter vonthis odersuperverwenden

  • Die folgenden Kombinationen der Instanz, Klassenmethoden und Variablen sind gültig:

    1. Instanzmethoden können direkt auf Instanzmethoden und Instanzvariablen zugreifen

    2. Instanzmethoden können auch direkt aufstatic Variablen undstatic Methoden zugreifen

    3. Die Methoden vonstatickönnen auf alle Variablen vonstaticund andere Methoden vonstaticzugreifen

    4. static methods cannot access instance variables and instance methods directly; Dazu benötigen sie eine Objektreferenz

5. Astatic Block

Einstatic-Block wird zum Initialisieren vonstatic-Variablen verwendet. Obwohl die Variablen vonstaticdirekt während der Deklaration initialisiert werden können, gibt es Situationen, in denen wir die mehrzeilige Verarbeitung durchführen müssen.

In solchen Fällen sindstatic Blöcke nützlich.

Wenn die Variablen vonstaticwährend der Initialisierung zusätzliche Logik mit mehreren Anweisungen erfordern, kann ein Block vonstaticverwendet werden.

5.1. Das Blockbeispielstatic

Angenommen, wir möchten ein Listenobjekt mit einigen vordefinierten Werten initialisieren.

Dies wird mitstatic Blöcken einfach:

public class StaticBlockDemo {
    public static List ranks = new LinkedList<>();

    static {
        ranks.add("Lieutenant");
        ranks.add("Captain");
        ranks.add("Major");
    }

    static {
        ranks.add("Colonel");
        ranks.add("General");
    }
}

In diesem Beispiel ist es nicht möglich, das Objekt vonListmit allen Anfangswerten zusammen mit der Deklaration zu initialisieren. Deshalb haben wir hier denstatic-Block verwendet.

5.2. Überzeugende Gründe für die Verwendung vonstatic-Blöcken

  • Wenn die Initialisierung vonstatic Variablen eine zusätzliche Logik außer der Zuweisung erfordert

  • Wenn die Initialisierung statischer Variablen fehleranfällig ist und eine Ausnahmebehandlung erfordert

5.3. Wichtige Punkte, an die Sie sich erinnern sollten

  • Eine Klasse kann mehrerestatic-Blöcke haben

  • static Felder undstatic Blöcke werden in derselben Reihenfolge aufgelöst und ausgeführt, in der sie in der Klasse vorhanden sind

6. Astatic Klasse

Mit der Programmiersprache Java können wir eine Klasse innerhalb einer Klasse erstellen. Es bietet eine überzeugende Möglichkeit, Elemente, die nur an einer Stelle verwendet werden, zu gruppieren. Auf diese Weise wird unser Code übersichtlicher und lesbarer.

Die Architektur der verschachtelten Klassen ist in zwei Bereiche unterteilt:

  • verschachtelte Klassen, die alsstatic deklariert sind, heißenstatic nested classes, während

  • verschachtelte Klassen, die nicht -static sind, werden alsinner classes bezeichnet

Der Hauptunterschied zwischen diesen beiden besteht darin, dass die inneren Klassen Zugriff auf alle Mitglieder der einschließenden Klasse (einschließlich privater) haben, während die verschachtelten Klassen vonstaticnur Zugriff auf statische Mitglieder der äußeren Klasse haben.

Tatsächlich iststatic nested classes behaved exactly like any other top-level class but enclosed in the only class which will access it, to provide better packaging convenience.

6.1. Beispiel für die Klassestatic

Der am weitesten verbreitete Ansatz zum Erstellen von Singleton-Objekten ist die verschachtelte Klasse vonstatic. Sie erfordert keine Synchronisierung und ist leicht zu erlernen und zu implementieren:

public class Singleton  {
    private Singleton() {}

    private static class SingletonHolder {
        public static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

6.2. Überzeugende Gründe für die Verwendung der inneren Klasse vonstatic

  • Durch Gruppieren von Klassen, die nur an einer Stelle verwendet werden, wird die Kapselung erhöht

  • Der Code wird näher an den Ort gebracht, an dem er nur von einem Benutzer verwendet wird. Dies erhöht die Lesbarkeit und der Code ist leichter zu warten

  • Wenn für verschachtelte Klassen kein Zugriff auf die eingeschlossenen Klasseninstanzmitglieder erforderlich ist, ist es besser, sie alsstatic zu deklarieren, da sie auf diese Weise nicht an die äußere Klasse gekoppelt wird und daher optimaler ist benötigt keinen Heap- oder Stack-Speicher

6.3. Wichtige Punkte, an die Sie sich erinnern sollten

  • static nested classes do not have access to any instance members of the enclosing outer class; Es kann nur über die Referenz eines Objekts auf sie zugreifen

  • Statisch verschachtelte Klassen können auf alle statischen Mitglieder der einschließenden Klasse zugreifen, einschließlich der privaten

  • Die Java-Programmierspezifikation erlaubt es uns nicht, die Klasse der obersten Ebene alsstatic zu deklarieren. Nur Klassen innerhalb der Klassen (verschachtelte Klassen) können alsstatic erstellt werden

7. Fazit

In diesem Artikel haben wir das Schlüsselwortstaticin Aktion gesehen. Wir lesen auch die Gründe und Vorteile für die Verwendung von statischen Feldern, statischen Methoden, statischen Blöcken und statischen inneren Klassen.

Wie immer finden wir den vollständigen Codeover on GitHub.