【发布时间】:2012-10-25 11:49:19
【问题描述】:
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 的范围内。
【问题讨论】:
-
好问题。我不知道答案,但在尝试编译时查看您遇到的错误可能会有所帮助。
-
编译器就是这么聪明。它也不会接收
if(i <= Integer.MAX_VALUE)。我建议您不要编写这样的代码,因为它会造成混淆,并且编译器最好谨慎恕我直言 -
你在两个类的末尾都缺少一个 }...你有没有尝试编译这个?
-
当然我编译了它,当我将它从 IDE 复制到浏览器时,似乎已经删除了结束两个类的 }。
-
不过,我想知道,有没有一个实用的设置,你不能先给 i 分配一个默认值?让你的整个程序的可编译性取决于 x 具有特定值,这听起来像是糟糕的编码风格,毕竟,最终变量的全部意义在于你多次使用某个常量时,所以你以后可以更轻松地更改它。跨度>
标签: java initialization conditional final