所以我最近来了这个。我创建了一个if-else语句,因为它的条件是最终的布尔变量。 Eclipse立刻告诉我,代码的else部分是无法访问的,因此死代码。这是我的代码(压缩)。
public static void main(String[] args){
final boolean state = true;
if(state == true){
System.out.println("A");
}else{
System.out.println("B");
}
}
然后我会发现,如果代码保持不变但变量不再是最终会发生什么?所以我试过了,这就是发生的事情,没有任何警告或错误。代码:
public static void main(String[] args){
boolean state = true;
if(state == true){
System.out.println("A");
}else{
System.out.println("B");
}
}
现在我想知道,为什么第一个案件被检测到并被标记,第二个案件没有?
提前谢谢。
答案 0 :(得分:2)
尝试此选择。
public class Test061 {
public static void main(String[] args){
int a = 0;
if(1 == (a+1)){
System.out.println("A");
}else{
System.out.println("B");
}
}
}
仍然没有警告。为什么呢?
因为编译器不执行您的代码。它只能在看到一些"常数"时发出警告。或"常数表达式"。显然,当您放置final
编译器时,就知道该值不能改变。如果你使用"真实变量"或者"变量表达式",它不知道,因为它没有执行你的代码(看看state
或(a+1)
在这一行的价值是什么)。所以在后一种情况下,你没有得到任何警告。希望现在更有意义。
以这种方式思考:编译器进行一些代码分析。第一个基本模式是通过此分析检测到的,而第二个模式则不是(可能因为它不是那个基本模式)。
答案 1 :(得分:1)
final
表示某些内容无法更改,因此可能会被标记,因为它永远不会且永远不会达到else
语句。
另一方面,您永远不必if(Boolean == true)
if(Boolean)
答案 2 :(得分:1)
编译器对final
变量进行了一些优化,如下所示,在这种情况下,编译器知道其他部分永远不会到达,因为final
变量以后不能更改。
if (true) {
System.out.println("A");
} else {
System.out.println("B");
}
的更多可能性
答案 3 :(得分:1)
第一个例子:
当我们对变量使用final关键字并为变量赋值时,该值不能再次更改。 final boolean state = true;
它的值不能为" false"。
第二个例子:
此处变量state
不是最终的。它有可能获得" false"。
所以不同的行为是因为 final
关键字。