Initialisieren Sie ein statisches Endfeld im Konstruktor

Lesezeit: 5 Minuten

Benutzer-Avatar
Yaron Levi

public class A 
{    
    private static final int x;

    public A() 
    {
        x = 5;
    }
}
  • final bedeutet, dass die Variable nur einmal (im Konstruktor) zugewiesen werden kann.
  • static bedeutet, dass es sich um eine Klasseninstanz handelt.

Ich verstehe nicht, warum das verboten ist. Wo stören sich diese Keywords?

Benutzer-Avatar
adarshr

Ein Konstruktor wird jedes Mal aufgerufen, wenn eine Instanz der Klasse erstellt wird. Der obige Code bedeutet also, dass der Wert von x jedes Mal neu initialisiert wird, wenn eine Instanz erstellt wird. Aber da die Variable final (und statisch) deklariert ist, können Sie nur dies tun

class A {    
    private static final int x;

    static {
        x = 5;
    }
}

Aber wenn Sie Statik entfernen, dürfen Sie Folgendes tun:

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}

Oder dieses:

class A {    
    private final int x;

    {
        x = 5;
    }
}

  • Anscheinend hat sich niemand die Mühe gemacht zu erklären, dass statische Variablen Variablen sind, die in allen Instanzen einer Klasse existieren. Als solche können sie nur einmal instanziiert werden, wenn die Klasse geladen wird – nicht, wenn möglicherweise viele Instanzen der Klasse erstellt werden.

    – iheanyi

    26. August 2014 um 14:59 Uhr

  • Außerdem würde ich empfehlen, nur in der Deklaration statt in einem statischen Block zuzuweisen. Es ist einfach sauberer und ist wahrscheinlich das, was das OP tun wollte: private static final int x = 5;

    – qwertzguy

    13. Juli 2016 um 21:52 Uhr

  • Was ist, wenn Sie den Wert “5” von einer anderen Komponente/Klasse übergeben möchten, anstatt ihn fest codiert zu haben?

    – Benutzer1156544

    4. April 2019 um 14:50 Uhr

Benutzer-Avatar
Sean Patrick Floyd

statische final-Variablen werden initialisiert, wenn die Klasse geladen wird. Der Konstruktor kann viel später oder gar nicht aufgerufen werden. Außerdem wird der Konstruktor mehrmals aufgerufen (mit jedem neuen Objekt ), sodass das Feld nicht mehr endgültig sein kann.

Wenn Sie benutzerdefinierte Logik benötigen, um Ihr statisches Endfeld zu initialisieren, fügen Sie diese in einen statischen Block ein

  • Ok, aber du hast gerade erklärt, was passiert. Ich frage warum? Ich meine, ohne das Finale funktioniert es, ohne die Statik funktioniert es. die Kombination der beiden schafft also eine neue Logik?

    – Jaron Levi

    23. Februar 2011 um 16:33 Uhr


  • @YaronLevi er hat es gerade gesagt … das statische Feld ist ein Mitglied der Klasse selbst. In Ihrem Konstruktor weisen Sie der Variablen einen Wert zu. Das Wort final bedeutet, dass Sie der Variablen nur EINMAL einen Wert zuweisen können, in Ihrem Code weisen Sie der Variablen jedes Mal einen Wert zu, wenn die Klasse instanziiert wird – weil die Variable statisch ist (ein Mitglied der Klasse). Wenn Sie static loswerden, können Sie ihm im Konstruktor einen Wert zuweisen, da es jedes Mal eine neue Variable ist. Wenn Sie final loswerden, ist es nur eine statische Variable, der Sie jederzeit einen neuen Wert zuweisen können.

    – Benutzer12345613

    22. Februar 2012 um 23:45 Uhr


  • @ user12345613 hat eine ziemlich gute Erklärung abgegeben. Alleine, entweder endgültige oder statische Arbeit; Aber einmal zusammengesetzt, erzwingt “statisches Finale”, dass es für diese Klasse in allen Instanzen nur ein solches Feld gibt und nur einmal initialisiert werden kann, unabhängig von der Anzahl der Instanzen.

    – Benutzer908645

    30. März 2016 um 22:35 Uhr

Denken Sie darüber nach, was passiert, wenn Sie ein Objekt das zweite Mal instanziieren. Es wird versucht, es NOCHMAL zu setzen, was ausdrücklich verboten ist, da es ein statisches Finale ist. Es kann nur einmal für die gesamte Klasse festgelegt werden, nicht für die Instanz.

Sie sollten den Wert festlegen, wenn Sie ihn deklarieren

private static final x=5;

Wenn Sie zusätzliche Logik oder eine komplexere Instanziierung benötigen, kann dies in einem statischen Initialisierungsblock erfolgen.

static bedeutet, dass die Variable in der Anwendung eindeutig ist.
final bedeutet, dass es nur einmal eingestellt werden sollte.

Wenn Sie es in Ihrem Konstruktor festlegen, können Sie die Variable mehr als einmal festlegen.

Daher sollten Sie es direkt initialisieren oder eine statische Methode zur Initialisierung vorschlagen.

Denk darüber nach. Sie könnten dies mit Ihrem Code tun:

A a = new A();
A b = new A(); // Wrong... x is already initialised

Die richtigen Möglichkeiten zum Initialisieren von x sind:

public class A 
{    
    private static final int x = 5;
}

oder

public class A 
{    
    private static final int x;

    static
    {
        x = 5;
    }
}

Benutzer-Avatar
Gemeinschaft

Finale bedeutet nicht, dass es im Konstruktor initialisiert werden muss. Generell wird so vorgegangen:

 private static final int x = 5;

statisch bedeutet stattdessen, dass die Variable von mehreren Instanzen der Klasse gemeinsam genutzt wird. Zum Beispiel :

public class Car {
   static String name;
   public Car(String name) {
      this.name = name;
   }
}

...

Car a = new Car("Volkswagen");
System.out.println(a.name); // Produces Volkswagen

Car b = new Car("Mercedes");
System.out.println(b.name); // Produces Mercedes
System.out.println(a.name); // Produces Mercedes

Benutzer-Avatar
SQB

Statisch

Das Schlüsselwort static bedeutet, dass ein Element eines Objekts, in diesem Fall ein Feld, nicht an eine Instanz einer Klasse gebunden ist, sondern stattdessen ein Element der Klasse ist. Wenn das statische Element ein Feld ist, wird es beim Laden einer Klasse initialisiert.

Es ist über die Klasse und nicht über eine Instanz zugänglich (obwohl letzteres nicht unmöglich ist, sondern als schlechte Form angesehen wird), sodass darauf zugegriffen werden kann, ohne dass der Konstruktor überhaupt ausgeführt wurde – jemals.

Finale

Das Schlüsselwort finalwenn es auf ein Feld eines Objekts angewendet wird, bedeutet, dass es nur einmal zugewiesen werden kann und dass es hat während der Initialisierung zuzuweisen.

Statisches Finale

Zusammengenommen definieren diese beiden Schlüsselwörter effektiv eine Konstante: Sie kann nur einmal zugewiesen werden, hat zuzuweisen und ist für alle Instanzen dieser Klasse gleich.

Da das statische Feld während des Klassenladens initialisiert wird, muss es dann entweder bei der Deklaration oder in einem statischen Initialisierungsblock initialisiert werden.

Das bedeutet, wenn Sie den Konstruktor erreichen, ist dieser bereits initialisiert, da er erforderlich bereits initialisiert sein.

Einzelling

Wenn Sie nach einem Klassenmitglied suchen, dem Sie nur einmal zuweisen, aber viele Male lesen, haben Sie es mit ihm zu tun a Einzelling. Das Singleton-Muster wird häufig für den Zugriff auf eine gemeinsam genutzte Ressource verwendet.

Das Feld ist statisch, aber nicht endgültig; Stattdessen prüft der Code beim Zugriff auf das Feld, ob es bereits initialisiert wurde, wenn nicht, wird es an Ort und Stelle erledigt. Beachten Sie, dass Sie in Umgebungen mit mehreren Threads den Zugriff auf das Feld synchronisieren müssen, um einen Zugriff während der Initialisierung zu vermeiden.

1257810cookie-checkInitialisieren Sie ein statisches Endfeld im Konstruktor

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy