class Foo{
public static void main(String args[]){
final int x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
Java-компилятор понимает, что условие оператора if всегда истинно, и поэтому y всегда будет инициализироваться. Ошибка компиляции, как и ожидалось.
class Bar{
public static void main(String args[]){
final int x;
x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
Но когда я нарушаю объявление и инициализацию x на две строки, компилятор не кажется, что условие всегда истинно, и y всегда будет инициализироваться.
final int x;
x=101;
byte b;
b=x;
System.out.println(b);
То же самое происходит здесь, и компилятор дает потерю точности ошибок.
final int x=101;
byte b;
b=x;
System.out.println(b);
Опять же, компилятор может понять, что x находится внутри диапазона b.