Подтвердить что ты не робот

Почему мы не можем установить значение статической конечной переменной в статическом блоке через имя класса

Например, рассмотрите привязку кода ниже:

public static final int a;
public static final int b;

static {
    a = 8;       // it working
    Test.b = 10; // compilation error Test.b cannot be assigned. 
}

Почему мы не можем использовать Test.b = 10; внутри статического блока самого класса Test? Без имени класса он отлично работает.

Есть ли причина в этом?

4b9b3361

Ответ 1

Статическая конечная переменная должна быть инициализирована перед использованием. Он может быть инициализирован либо непосредственно во время объявления, либо в статическом блоке.

Но когда вы используете class.var = x, он не рассматривается как инициализация, а как назначение.

При использовании JDK 7 ошибка не может назначить значение конечной переменной.

Это объясняет, почему он работает, если вы удалите ключевое слово final

class Test {

    static final int a = 2; // initialization at declaration time
    static final int b;
    static final int c;

    static {
        b = 4;  // initialization in static block
        Test.c = 6; // error : cannot assign a value to final variable c
    }
    ...

}

ИЗМЕНИТЬ

В JLS правильное слово для инициализации - это определенное назначение

Извлечь из JLS:

Для каждого доступа локальной переменной или пустого конечного поля x, x должно быть определенно назначается перед доступом или возникает ошибка времени компиляции.

Аналогично, каждая пустая конечная переменная должна назначаться не более одного раза; Это должно быть определенно неназначенный, когда происходит присвоение ему.

Такое назначение определено, если и только если либо простое имя переменная (или, для поля, ее простое имя, присвоенное этим) происходит слева стороне оператора присваивания.

Для каждого присваивания пустой конечной переменной переменная должна быть определенно не назначается перед назначением или возникает ошибка времени компиляции.

подчеркнуть мое, но я думаю, что это настоящая причина ошибки.