модификатор final у поля блокирует вызов static блока

имеем код

class Test{
    public static int x = 1;  

    static {
        System.out.println("static");
    }

}

public class Solution {

    public static void main(String[] args) {

        System.out.println(Test.x);
    }
}

как и ожидается вывод

static  
1

но если добавить к полю final

public static final int x = 1;   

статик блок не отработает, и выведет 1 .
с чем это связано?


Ответы (1 шт):

Автор решения: Roman Konoval

static final int - это константное выражение времени компиляции (англ. compile time constant expression).

Это означает, что во время компиляции вашего класса Solution компилятор берет константу из класса Test и прямо использует ее в Solution (и в скомпилированном классе Solution нет ссылки на класс Test). То есть при запуске класса Solution загрузка класса Test не происходит, а значит не происходит выполнение статических блоков.

→ Ссылка