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语句的条件始终为true,因此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的声明和初始化分为两行时,编译器似乎没有得到条件始终为true且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的范围内。

最佳答案

它与编译器如何确定是否执行语句有关。它在JLS #16中定义:



在您的情况下,编译器无法确定y已明确分配,并给您带来错误。这是因为它将需要确定条件始终为真,并且仅当if中的条件为常量表达式时才有可能。

JLS #15.28定义常量表达式:



JLS #4.12.4将常量变量定义为:



在您的情况下,final int x = 101;是一个常量变量,而final int x; x = 101;不是。

07-24 09:47
查看更多