JavaRush /Java-Blog /Random-DE /10 Hinweise zum statischen Modifikator in Java

10 Hinweise zum statischen Modifikator in Java

Veröffentlicht in der Gruppe Random-DE
Der statische Modifikator in Java ist direkt mit der Klasse verknüpft. Wenn das Feld statisch ist, gehört es zur Klasse. Wenn die Methode statisch ist, ist es dasselbe: Es gehört zur Klasse. Auf dieser Grundlage können Sie über den Klassennamen auf eine statische Methode oder ein statisches Feld zugreifen. Wenn beispielsweise das Zählfeld in der Counter-Klasse statisch ist, können Sie mit einer Abfrage wie Counter.count auf die Variable zugreifen. 10 Hinweise zum statischen Modifikator in Java - 1Bevor wir mit den Notizen beginnen, wollen wir uns daran erinnern (und vielleicht herausfinden), was statisch in Java ist und was statisch sein kann. Statisch ist ein Modifikator, der auf ein Feld, einen Block, eine Methode oder eine innere Klasse angewendet wird. Dieser Modifikator gibt an, dass das Subjekt an die aktuelle Klasse gebunden ist.

Statische Felder

Wenn wir eine Variable auf Klassenebene bezeichnen, geben wir an, dass der Wert zu einer Klasse gehört. Wenn Sie dies nicht tun, wird der Wert der Variablen an ein mit dieser Klasse erstelltes Objekt gebunden. Was bedeutet das? 10 Hinweise zum statischen Modifikator in Java - 2Und Tatsache ist, dass, wenn die Variable nicht statisch ist, jedes neue Objekt dieser Klasse seinen eigenen Wert dieser Variablen hat, durch dessen Änderung wir ihn ausschließlich in einem Objekt ändern: Zum Beispiel haben wir eine Autoklasse mit einem Nicht -statische Variable:
public class Car {
  int km;
}
Dann im Wesentlichen:
Car orangeCar = new Car();
orangeCar.km = 100;

Car blueCar = new Car();
blueCar.km = 85;

System.out.println("Orange car - " + orangeCar.km);
System.out.println("Blue car - " + blueCar.km);
Die Ausgabe, die wir erhalten, ist:

Orange car - 100
Blue car - 85
Wie Sie sehen, verfügt jedes Objekt über eine eigene Variable, deren Änderung nur für dieses Objekt erfolgt. Nun, wenn wir eine statische Variable haben, dann ist dieser globale Wert für alle gleich: Jetzt haben wir ein Auto mit einer statischen Variablen:
public class Car {
  static int km;
}
Dann wird derselbe Code in main an die Konsole ausgegeben:

Orange car - 85
Blue car - 85
Schließlich haben wir alle eine Variable und jedes Mal, wenn wir sie ändern. Auf statische Variablen wird normalerweise nicht über eine Objektreferenz – orangeCar.km – zugegriffen, sondern über den Klassennamen – Car.km

Statischer Block

Es gibt zwei Initialisierungsblöcke – regulär und statisch. Der Baustein dient der Initialisierung interner Variablen. Wenn der Block normal ist, werden die internen Variablen des Objekts damit initialisiert. Wenn er jedoch statisch ist, werden ihm statische Variablen (d. h. Klassenvariablen) zugewiesen. Beispiel einer Klasse mit einem statischen Initialisierungsblock:
public class Car {
  static int km;

  static {
     km = 150;
  }
}

Statische Methode

Statische Methoden unterscheiden sich von regulären Methoden dadurch, dass sie auch an eine Klasse und nicht an ein Objekt gebunden sind. Eine wichtige Eigenschaft einer statischen Methode ist, dass sie nur auf statische Variablen/Methoden zugreifen kann. Schauen wir uns als Beispiel eine Klasse an, die eine Art Zähler ist, der Methodenaufrufe verfolgt:
public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println(„Aktueller Zählerwert –“ + count);
  }
}
Nennen wir es im Wesentlichen:
Counter.invokeCounter();
Counter.invokeCounter();
Counter.invokeCounter();
Und wir bekommen die Ausgabe auf die Konsole:

Текущее Bedeutung счётчика - 1
Текущее Bedeutung счётчика - 2
Текущее Bedeutung счётчика - 3

Statische Klasse in Java

Nur eine innere Klasse kann eine statische Klasse sein. Auch hier ist diese Klasse an die äußere Klasse gebunden, und wenn die äußere Klasse von einer anderen Klasse geerbt wird, wird diese Klasse nicht geerbt. Darüber hinaus kann diese Klasse geerbt werden, genau wie sie von jeder anderen Klasse geerbt werden kann und eine Schnittstelle implementiert. Im Wesentlichen unterscheidet sich eine statisch verschachtelte Klasse nicht von anderen inneren Klassen, außer dass ihr Objekt keinen Verweis auf das äußere Klassenobjekt enthält, das sie erstellt hat. Dadurch ist eine statische Klasse jedoch einer regulären, nicht verschachtelten Klasse am ähnlichsten, da der einzige Unterschied darin besteht, dass sie in eine andere Klasse eingeschlossen ist. In manchen Fällen ist dies für uns von Vorteil, da wir von dort aus Zugriff auf die privaten statischen Variablen der äußeren Klasse haben. Beispiel einer verschachtelten statischen Klasse:
public class Vehicle {

  public static class Car {
     public int km;
  }
}
Erstellen einer Instanz dieser Klasse und Festlegen des Werts der internen Variablen:
Vehicle.Car car = new Vehicle.Car();
car.km = 90;
Um statische Methoden/Variablen/Klassen zu verwenden, müssen wir kein Objekt dieser Klasse erstellen. Natürlich sollten Zugriffsmodifikatoren berücksichtigt werden. Auf Felder kann beispielsweise privatenur innerhalb der Klasse zugegriffen werden, in der sie deklariert sind. Felder protectedstehen allen Klassen innerhalb eines Pakets ( package ) sowie allen untergeordneten Klassen außerhalb des Pakets zur Verfügung. Weitere Einzelheiten finden Sie im Artikel „ privat vs. geschützt vs. öffentlich “. Angenommen, es gibt eine statische Methode increment()in der Klasse Counter, deren Aufgabe darin besteht, den Zähler zu erhöhen count. Um diese Methode aufzurufen, können Sie einen Aufruf des Formulars verwenden Counter.increment(). Es ist nicht erforderlich, eine Klasse zu instanziieren, Counterum auf ein statisches Feld oder eine statische Methode zuzugreifen. Dies ist der grundlegende Unterschied zwischen statischen und NICHT-statischen Objekten (Klassenmitgliedern). Ich möchte Sie noch einmal daran erinnern, dass statische Klassenmitglieder direkt zur Klasse und nicht zu ihrer Instanz gehören. Das heißt, der Wert einer statischen Variablen countist für alle Objekte vom Typ gleich Counter. Später in diesem Artikel werden wir uns mit den grundlegenden Aspekten der Verwendung des statischen Modifikators in Java sowie einigen Funktionen befassen, die Ihnen helfen, wichtige Programmierkonzepte zu verstehen.

Was jeder Programmierer über den Static-Modifikator in Java wissen sollte

In diesem Abschnitt befassen wir uns mit den Grundlagen der Verwendung statischer Methoden, Felder und Klassen. Beginnen wir mit den Variablen.
  1. Sie können NICHT auf nicht-statische Mitglieder einer Klasse innerhalb eines statischen Kontexts wie einer Methode oder eines Blocks zugreifen. Das Kompilieren des folgenden Codes führt zu einem Fehler:

    public class Counter{
    private int count;
    public static void main(String args[]){
       System.out.println(count); //compile time error
    }}

    Dies ist einer der häufigsten Fehler von Java-Programmierern, insbesondere von Anfängern. Da die Methode mainstatisch ist, die Variable jedoch countnicht, wird in diesem Fall die Methode printlninnerhalb der Methode main„Fehler bei der Kompilierung“ auslösen.

  2. Im Gegensatz zu lokalen Variablen sind statische Felder und Methoden in Java NICHT threadsicher. In der Praxis ist dies eine der häufigsten Ursachen für Probleme im Zusammenhang mit der Sicherheit der Multithread-Programmierung. Da jede Instanz einer Klasse über dieselbe Kopie einer statischen Variablen verfügt, muss eine solche Variable geschützt – von der Klasse „gesperrt“ werden. Stellen Sie daher bei der Verwendung statischer Variablen sicher, dass diese ordnungsgemäß synchronisiert sind, um Probleme wie Race Conditions zu vermeiden.

  3. Статические методы имеют преимущество в применении, т.к. отсутствует необходимость каждый раз создавать новый ein Objekt для доступа к таким методам. Статический метод можно вызвать, используя тип класса, в котором эти методы описаны. Именно поэтому, подобные методы Wie нельзя лучше подходят в качестве методов-фабрик (factory), и методов-утoderт (utility). Класс java.lang.Math — замечательный пример, в котором почти все методы статичны, по этой же причине классы-утoderты в Java финализированы (final).

  4. Другим важным моментом является то, что вы НЕ можете переопределять (Override) статические методы. Если вы объявите такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, вы лишь «спрячете» метод суперкласса (superclass) anstatt переопределения. Это явление известно Wie сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен Wie в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы. Рассмотрим пример:

    class Vehicle{
         public static void  kmToMiles(int km){
              System.out.println(„Innerhalb der übergeordneten Klasse/statischen Methode“);
         } }
    
    class Car extends Vehicle{
         public static void  kmToMiles(int km){
              System.out.println(„Innerhalb der untergeordneten Klasse/statischen Methode“);
         } }
    
    public class Demo{
       public static void main(String args[]){
          Vehicle v = new Car();
           v.kmToMiles(10);
      }}

    Вывод в консоль:

    Внутри родительского класса/статического метода

    Код наглядно демонстрирует: несмотря на то, что ein Objekt имеет тип Car, вызван статический метод из класса Vehicle, т.к. произошло обращение к методу во время компиляции. И заметьте, ошибки во время компиляции не возникло!

  5. Объявить статическим также можно и класс, за исключением классов верхнего уровня. Такие классы известны Wie «вложенные статические классы» (nested static class). Они бывают полезными для представления улучшенных связей. Яркий пример вложенного статического класса — HashMap.Entry, который предоставляет структуру данных внутри HashMap. Стоит заметить, также Wie и любой другой внутренний класс, вложенные классы находятся в отдельном файле .class. Таким образом, если вы объявoder пять вложенных классов в вашем главном классе, у вас будет 6 файлов с расширением .class. Ещё одним примером использования является объявление собственного компаратора (Comparator), например компаратор по возрасту (AgeComparator) в классе сотрудники (Employee).

  6. Модификатор static также может быть объявлен в статичном блоке, более известным Wie «Статический блок инициализации» (Static initializer block), который будет выполнен во время загрузки класса. Если вы не объявите такой блок, то Java соберёт все статические поля в один список и выполнит его во время загрузки класса. Однако, статичный блок НЕ может пробросить перехваченные исключения, но может выбросить не перехваченные. В таком случае возникнет «Exception Initializer Error». На практике, любое исключение возникшее во время выполнения и инициализации статических полей, будет завёрнуто Java в эту ошибку. Это также самая частая причина ошибки «No Class Def Found Error», т.к. класс не находился в памяти во время обращения к нему.

  7. Es ist nützlich zu wissen, dass statische Methoden zur Kompilierzeit gebunden werden, im Gegensatz zur Bindung virtueller oder nicht statischer Methoden, die zur Laufzeit an das reale Objekt gebunden werden. Daher können statische Methoden in Java nicht überschrieben werden, weil Laufzeitpolymorphismus gilt nicht für sie. Dies ist eine wichtige Einschränkung, die bei der Deklaration einer statischen Methode berücksichtigt werden muss. Dies ist nur dann sinnvoll, wenn keine Möglichkeit oder Notwendigkeit besteht, eine solche Methode durch Erbklassen zu überschreiben. Factory-Methoden und Utility-Methoden sind gute Beispiele für die Verwendung des statischen Modifikators. Joshua Bloch hat in seinem Buch Effective Java , das für jeden Programmierer der Sprache Pflichtlektüre ist, mehrere Vorteile der Verwendung einer statischen Factory-Methode gegenüber einem Konstruktor dargelegt.

  8. Eine wichtige Eigenschaft eines statischen Blocks ist die Initialisierung. Statische Felder oder Variablen werden initialisiert, nachdem die Klasse in den Speicher geladen wurde. Die Initialisierungsreihenfolge erfolgt von oben nach unten, in derselben Reihenfolge, wie sie in der Quelldatei der Java-Klasse beschrieben ist. Da statische Felder threadsicher initialisiert werden, wird diese Eigenschaft auch zur Implementierung von verwendet Singleton. Wenn Sie aus irgendeinem Grund keine Liste Enumwie verwenden, gibt es eine gute Alternative für Sie. SingletonIn diesem Fall muss jedoch berücksichtigt werden, dass es sich nicht um eine „verzögerte“ Initialisierung handelt. Das bedeutet, dass das statische Feld initialisiert wird, BEVOR jemand danach „fragt“. Wenn das Objekt ressourcenintensiv ist oder selten verwendet wird, ist die Initialisierung in einem statischen Block nicht von Vorteil.

  9. Bei der Serialisierung werden statische Felder ebenso wie transientVariablen nicht serialisiert. Wenn Sie tatsächlich Daten in einem statischen Feld speichern, enthält das neue Objekt nach der Deserialisierung seinen primären (Standard-)Wert. Wenn das statische Feld beispielsweise eine Variable vom Typ war, ist intsein Wert nach der Deserialisierung Null, wenn Der Typ floatist 0,0, wenn Typ Objectnull. Ehrlich gesagt ist dies eine der am häufigsten gestellten Fragen zur Serialisierung in Java-Interviews. Speichern Sie die wichtigsten Daten zu einem Objekt nicht in einem statischen Feld!

  10. Und schließlich reden wir darüber static import. Dieser Modifikator hat viele Gemeinsamkeiten mit dem Standardoperator import, ermöglicht Ihnen jedoch im Gegensatz zu diesem den Import eines oder aller statischen Mitglieder einer Klasse. Beim Import statischer Methoden kann auf sie zugegriffen werden, als ob sie in derselben Klasse definiert wären. Ebenso können wir beim Importieren von Feldern auf sie zugreifen, ohne den Klassennamen anzugeben. Diese Funktion wurde in Java Version 1.5 eingeführt und verbessert bei richtiger Verwendung die Lesbarkeit des Codes. Diese Konstruktion wird am häufigsten in JUnit- Tests verwendet , weil Fast alle Testentwickler verwenden static importbeispielsweise Assert-Methoden assertEquals()und deren überladene Duplikate. Wenn nichts klar ist, freuen wir uns über weitere Informationen .

Das ist alles. Jeder Programmierer muss alle oben genannten Punkte zum statischen Modifikator in Java kennen . In diesem Artikel wurden grundlegende Informationen zu statischen Variablen, Feldern, Methoden, Initialisierungsblöcken und Importen behandelt. Einschließlich einiger wichtiger Eigenschaften, deren Kenntnis beim Schreiben und Verstehen von Programmen in Java von entscheidender Bedeutung ist. Ich hoffe, dass jeder Entwickler seine Fähigkeiten im Umgang mit statischen Konzepten perfektioniert, weil ... Das ist für seriöses Programmieren sehr wichtig.“
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION