我希望有人可以在这两个例子的上下文中向我解释范围的java规则:
示例1(非法) -
int r = 10;
if (x >= 0){
double r = Math.sqrt(x);
}
示例2(合法) -
if (x >= 0){
double r = Math.sqrt(x);
}
else {
float r = 0;
}
r = 0;
如上所述,实施例1是非法的,而实施例2则不是。我希望有人可以解释原因。
答案 0 :(得分:0)
需要更多背景信息。您的第二个示例也无效,因为行r = 0;
未定义r。
通常,块范围变量不能与方法范围的变量冲突。块范围的变量在代码块中被分解,例如while或for循环以及if / else块。
在第一个示例中,int r
是方法范围的变量,double r
是块范围。它们发生冲突,因为它们具有相同的名称,因此编译器拒绝它。
在您的第二个示例中,double r
和float r
位于不同的块范围内,因此它们不会发生冲突。 r=0
是暧昧的,并且您提供的代码应该会因“找不到符号”编译器错误而失败。如果它没有失败,你必须在不同的范围内宣布它,而不是给我们这些信息。
这与类变量分开。允许方法变量与类变量冲突。在类和方法共享变量名的方法内部,除非您使用this
指定类范围变量,否则将假定方法范围变量。例如:
public class MyClass{
int r = 10;
public void printR(int x) {
double r = 20.0;
System.out.println(r); // Prints 20.0
System.out.println(this.r); // Prints 10
}
}