2012-07-29 10 views
9

Dlaczego nie ten program java kompilacji:Błąd kompilacji w języku Java zależy od tego, czy nazwa zmiennej statycznej jest kwalifikowana?

public class xx { 
    public static final Object obj; 
    static { 
//  obj = null;  // this compiles 
     xx.obj = null;  // this doesn't 
    } 
} 

z tego błędu:

$ javac xx.java 
xx.java:5: cannot assign a value to final variable obj 
     xx.obj = null;  // this doesn't 
     ^
1 error 
$ javac -version 
javac 1.6.0_33 

kiedy, czy mogę wymienić xx.obj = null z obj = null (jak wspomniałem w komentarzu) to nie skompilować.

Myślałem, że prefiks nazwy klasy był mniej więcej tylko składnią ... czy jest to błąd w kompilatorze lub specyfikacji językowej? :)

+0

Prawdopodobnie błąd kompilatora (który nie ukąsił wystarczającej liczby osób, aby przyciągnąć dostatecznie dużo uwagi). Czy każdy może próbować starszej i nowszej wersji JDK? A także kompilator Eclipse? – Thilo

+2

JDK 7 ten sam błąd tutaj. –

Odpowiedz

7

Po wykonaniu xx.obj oznacza to, że klasa została już zainicjowana. Tak więc final obj nie można zainicjować ponownie. To jest błąd czasu kompilacji. Kompilator mógł sprawdzić, czy obj nie został jeszcze zainicjowany. Trudno to sprawdzić, ale teoretycznie jest to możliwe. Ale to nie działa jak kompilator Java.

+1

+1 To ma więcej sensu niż moja odpowiedź, zauważyłem, że można uzyskać dostęp do odwołania do klasy wewnątrz statycznego inicjalizatora, na przykład dla metod statycznych lub nieostatnich zmiennych statycznych. –

+2

To nie ma dla mnie sensu. Ten kod jest częścią statycznego inicjalizatora, więc inicjowanie klasy jest w toku, gdy kod jest uruchamiany; Java jest zaprojektowany, aby właściwie obsłużyć (co byłoby inaczej) rekursywną inicjalizację klasy. – Archie

+0

@Archie - sprawdź moją edycję. – fastcodejava

Powiązane problemy