В нашей команде мы обнаружили странное поведение, в котором использовались как квалификаторы static
, так и final
. Это наш тестовый класс:Странное поведение Java со статическими и финальными квалификаторами
public class Test {
public static final Test me = new Test();
public static final Integer I = 4;
public static final String S = "abc";
public Test() {
System.out.println(I);
System.out.println(S);
}
public static Test getInstance() { return me; }
public static void main(String[] args) {
Test.getInstance();
}
}
Когда мы запускаем метод main
, мы получаем результат:
null
abc
Я бы понял, если он писал null
значение как раз, так как код статического класса элементы выполняются сверху вниз.
Может ли кто-нибудь объяснить, почему это происходит?
Связанный http://stackoverflow.com/questions/4446088/java-in-what-order-are-static-final-fields-initialized (и http://stackoverflow.com/questions/2423376/java-initialization -order-issue-static-vs-instance-fields) – Tunaki
Вы можете посмотреть ответы на [этот вопрос] (http://stackoverflow.com/questions/13431388/final-string-vs-final-integer). надеюсь, что это поможет. –
Хех. Еще одна путаница, связанная с привилегированными типами Java. – imallett