В нашей команде мы обнаружили какое-то странное поведение, в котором мы использовали квалификаторы static и final. Это наш тестовый класс:
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 оба раза, так как код статических членов класса выполняется сверху вниз.
Может ли кто-нибудь объяснить, почему это поведение происходит?