2016-03-31 9 views
0

Warum können wir eine statische Variable in einem anonymen Block in Java nicht initialisieren? Für zB: Warum kompiliert dieser Code nicht?Statische Variable in einem anonymen Block in Java

public class A{ 
    { 
     static int a=1; 
    } 
} 

Ich erhalte diesen Compiler-Fehler zu sagen „Illegal Modifikator für die Variable ein, nur endgültig ist erlaubt“

Warum nur endgültig? Kann mir bitte jemand helfen? Vielen Dank im Voraus

+0

so versuchen Sie nicht nur * zu initialisieren *, sondern auch zu * deklarieren *, was dort für statische Mitglieder nicht erlaubt ist. –

+1

Was würden Sie davon erwarten? Innerhalb von Instanzinitialisierungen deklarierte Variablen sind lokale Variablen, und Sie können keine lokale Variable statisch machen ... –

Antwort

0

Direkt in class, ist ein Block ein instance initializer block. Sie können statische Variablen in einem Instanzinitialisierungsblock nicht deklarieren. Entfernen Sie es einfach aus dem Block:

public class A { 
    static int a=1; 
} 

Instanz initializer Blöcke aufgerufen werden, wenn Instanzen erstellt werden, vor dem Code in irgendwelchen Instanzkonstruktoren. Es macht also Sinn, dass man dort keine Mitglieder (statisch oder anders) deklarieren kann. Sie sind Code, wie in einem Konstruktor. Beispiel:

import java.util.Random; 

public class Example { 
    private String name; 
    private int x; 
    private int y; 

    {          // This is the 
     this.x = new Random().nextInt(); // instance 
     this.y = this.x * 2;    // initializer 
    }          // block 

    public Example() { 
     this.name = null; 
    } 

    public Example(String name) { 
     this.name = name; 
    } 
} 

In den oben genannten, unabhängig von der Konstruktor verwendet wird, das erste, das in den Konstruktor durch den Code in der Instanz Initialisierer Block, gefolgt ist der Code geschieht, der verwendet wurde.

Es gibt auch static Initialisierungsblöcke, die das Gleiche für statische Sachen tun, wenn die Klasse geladen wird. Sie beginnen mit dem Stichwort static, mehr im obigen Link.

1

Aus der Dokumentation von

Initialization blocks

der Java-Compiler Kopien initializer Blöcke in jedem Konstruktor. Daher kann dieser Ansatz verwendet werden, um einen Codeblock zwischen mehreren Konstruktoren zu teilen.

Der von Ihnen geschriebene Code wird in den Konstruktor verschoben. Ein statisches Element lokal an den Konstruktor wird nicht viel Sinn machen sie auf Klassenebene deklariert werden müssen und nicht lokal an den Konstruktor

Und Sie in der Fehlermeldung sehen nur letzte erlaubt ist, weil Sie Ändern Sie die endgültigen Variablen im Konstruktor, wenn Sie sie zum Zeitpunkt der Deklaration noch nicht initialisiert haben.

1
{ 
     static int a=1; 
} 

Sie nicht static Modifikator in einem Codeblock haben, a hier ist nur eine lokale Variable

0

Sie können statische Feldinitialisierung in einem statischen Block durchführen. Aber nicht die Erklärung.

Verwandte Themen