2016-04-06 9 views
3

Ich habe mit der Initialisierung von verschiedenen Arten von Variablen in Java experimentiert. Ich kann die letzte Variable (z. B. final int b) und die statische Variable (z. B. static int c) im Konstruktor initialisieren, aber ich kann statische statische Variable (z. B. static final int d) im Konstruktor nicht initialisieren. Die IDE zeigt auch eine Fehlermeldung an.Warum Java die Initialisierung statischer endgültiger Variablen (z. B. statischer final int d) im Konstruktor nicht zulassen würde?

Warum kann Java die Initialisierung der statischen Variablen im Konstruktor nicht zulassen?

public class InitialisingFields { 
    int a; 
    final int b; 
    static int c; 
    static final int d; 

    InitialisingFields(){ 
     a = 1; 
     b = 2; 
     c = 3; 
     d = 4; 
    } 

    public static void main(String[] args) { 
     InitialisingFields i = new InitialisingFields(); 
    } 

} 

Fehlermeldung:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot assign a value to final variable d 
    at JTO.InitialisingFields.<init>(InitialisingFields.java:22) 
    at JTO.InitialisingFields.main(InitialisingFields.java:26) 
Java Result: 1 

Antwort

5

Eine statische Variable wird von allen Instanzen der Klasse gemeinsam verwendet. Daher wird jedes Mal, wenn Sie eine Instanz Ihrer Klasse erstellen, dieselbe Variable erneut zugewiesen. Da es endgültig ist, kann es nur einmal vergeben werden. Daher ist es nicht erlaubt.

static final Variablen sollten garantiert nur einmal zugewiesen werden. Daher können sie entweder in demselben Ausdruck, in dem sie deklariert sind, oder in einem statischen Initialisierungsblock, der nur einmal ausgeführt wird, zugewiesen werden.

+0

vielen Dank! jetzt macht alles Sinn! – Thor

0

Sie können nicht final Feld zuweisen. Final bedeutet, dass die Variable nicht geändert werden kann. Entfernen Sie das Finale und Sie sind in Ordnung.

+0

Nein. Das ist nicht die Antwort. – TheLostMind

+0

@TheLostMind Eigentlich ... ist es genau das, was die Fehlermeldung verursacht. – Biffen

+0

@Biffen - 'statische final' Felder können in einem' statischen' Block initialisiert werden und Instanz-Endfelder können in einem Instanz Level Block oder Konstruktor initialisiert werden. Dies bezieht sich nicht nur auf die 'final' Eigenschaft eines Feldes. Die Antwort sollte die Tatsache beinhalten, dass das Feld "statisch" ist. – TheLostMind

3

Da

  1. die statische Variable werden müssen festlegen, ob Sie eine Instanz der Klasse erstellen, also muss es außerhalb eines Konstruktor passieren;
  2. Es kann nur einmal festgelegt werden, sodass Sie den Wert beim zweiten Erstellen einer Instanz nicht ändern konnten.

Sie können eine statische endgültige Variable lesen, bevor es initialisiert wird, und sein Wert würde der Standardwert für die Art sein, beispielsweise

class Nasty { 
    static final int foo = yuk(); 
    static final int bar = 1; 

    static int yuk() { 
    System.out.println(bar); // prints 0. 
    return 99; 
    } 
} 

Dies ist jedoch ein bizarrer Fall, und fast sicher nicht das, was gewünscht wird.

+0

Wird diese Variable als static int nicht auf 0 initialisiert, noch bevor eine Instanz erstellt wurde? – Berger

+1

Sie können es lesen, bevor es zugewiesen wird, und sein Wert wäre Null, ja. Dies ist jedoch ein bizarrer Fall und fast sicher unerwünscht. –

Verwandte Themen