java中范围的规则是什么?

时间:2017-11-06 18:57:32

标签: java scope conditional-statements

我希望有人可以在这两个例子的上下文中向我解释范围的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则不是。我希望有人可以解释原因。

1 个答案:

答案 0 :(得分:0)

需要更多背景信息。您的第二个示例也无效,因为行r = 0;未定义r。

通常,块范围变量不能与方法范围的变量冲突。块范围的变量在代码块中被分解,例如while或for循环以及if / else块。

在第一个示例中,int r是方法范围的变量,double r是块范围。它们发生冲突,因为它们具有相同的名称,因此编译器拒绝它。

在您的第二个示例中,double rfloat 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
    }
}