В чем разница между конечными переменными и константами времени компиляции?
Рассмотрим следующий код
final int a = 5;
final int b;
b=6;
int x=0;
switch(x)
{
case a: //no error
case b: //compiler error
}
Что это значит? Когда и как конечные переменные присваивают значение? Что происходит во время выполнения и что происходит во время компиляции? Почему мы должны предоставлять переменную времени компиляции? Какие еще структуры Java требуют постоянной времени компиляции?