以下Java代码无法编译。
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
b = 1;
}
为什么呢?没有代码路径可以导致程序将{1}分配给b
而不先声明它。
我想到b
的变量范围可能仅限于第一个if
语句,但后来我不明白为什么。如果我真的不想不必要地声明b
,以提高性能怎么办?声明后,我不喜欢让变量闲置。
(你可能想争辩,但我可以在第二个if
语句中简单地声明b,在这种情况下,想象它可能在其他地方的循环中。)
答案 0 :(得分:29)
变量可以在条件语句中声明。但是,您尝试在不同的范围内访问b
。
当你在这里声明b时:
if(a == 1) {
int b = 0;
}
只有在结束}
之前的范围内。
因此,当你走到这一行时:
b = 1;
b
不存在。
答案 1 :(得分:11)
为什么呢?没有代码路径可以导致程序在没有首先声明的情况下将1分配给b。
你是对的,但编译器不知道。编译器不执行代码。编译器只转换为字节码而不评估表达式。
答案 2 :(得分:6)
此{ }
定义块范围。在{}
之间声明的任何内容都是该块的本地内容。这意味着您不能在块之外使用它们。但是,Java不允许在内部块中使用内部名称隐藏名称。这就是JLS所说的:
块(第14.2节)中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始化器(第14.4节)开始,并包括局部变量右侧的任何其他声明器声明声明。
本地变量v的名称不能重新声明为v范围内直接封闭方法,构造函数或初始化程序块的局部变量,否则会发生编译时错误。
答案 3 :(得分:3)
关于java变量范围的所有内容。
您需要在if variable
之外定义statement
才能在外面使用它。
int a = 0;
int b = 0;
if(a == 1) {
b = 1;
}
if(a == 1) {
b = 2;
}
答案 4 :(得分:2)
它是一个局部变量,仅限于{}范围。
试试这个here。
答案 5 :(得分:2)
如果在if块旁边无法访问的块,你已经声明了b变量,如果你想访问那么就把它放在if块
答案 6 :(得分:2)
b的范围是它声明的块,即第一个if。为什么会这样?因为这个范围规则(词法范围)易于理解,易于实现,并且遵循最少惊喜的原则。
如果在第二个中显示b,则:
没有理智的语言有这么复杂的范围规则。
w.r.t。性能 - 声明一个额外的变量对性能的影响可以忽略不计。相信编译器!它将有效地分配寄存器。
答案 7 :(得分:1)
因为当b超出第一个if(a == 1)中的范围时,它将被删除并且不再存在于堆栈中,因此不能在下一个if语句中使用。
答案 8 :(得分:1)
{ }
用于定义变量的范围。在此声明:
if(a == 1)
{
int b = 0;
}
所以这里b的范围只在{ }
。所以你在{ }
之外使用变量b,它给出了编译错误。
您也可以参考:
http://docs.oracle.com/javase/tutorial/java/javaOO/variables.html
答案 9 :(得分:1)
如果在块中声明变量,则变量的限制将限制为声明它的特定块。
注意:只有静态变量才能从程序中的任何位置访问。
在你的代码中:
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
b = 1;
}
变量'a'可以在任何if语句中访问,因为它在块外声明但是,变量'b'在内部声明,因此限制了它在块外的使用。
如果你想在if语句之外使用'b',你必须在声明变量'a'的地方声明它。
答案 10 :(得分:1)
int a = 0;
if(a == 1) {
int b = 0; // this int b is only visible within this if statement only(Scope)
}
if(a == 1) {
b = 1; // here b can't be identify
}
你必须按照以下方式纠正错误
int a = 0;
int b = 0;
if(a == 1) {
b=0;
}
if(a == 1) {
b = 1;
}
答案 11 :(得分:1)
为了完整起见:这个也适用(解释是范围界定,见其他答案)
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
int b = 1;
}
由于范围界定,b只能在if语句中访问。我们这里有的实际上是两个变量,每个变量都可以在其范围内访问。
答案 12 :(得分:0)
变量b的范围仅在if块完成之前,因为这是您声明变量的地方。这就是为什么它不能在下面的块中访问。这是用于内存分配,否则它们将在内存中浮动很多变量。
int a = 0;
if(a == 1) {
int b = 0;
} //b scope ends here
if(a == 1) {
b = 1; //compiler error
}