Java核心技术速学版(第3版)
上QQ阅读APP看书,第一时间看更新

1.7.5 局部变量的作用域

现在,你已经看到了使用了嵌套形式的语句块的示例。这是一个很好的开始,下面我们即将开始学习变量作用域的一些基本规则。局部变量(local variable)就是在方法中声明的任何变量,甚至包括方法的参数变量。变量的作用域(scope)就是可以在程序中访问该变量的范围。局部变量的作用域是从变量声明处开始,一直延伸到当前的封闭块的末尾:

while (...) {
     System.out.println(...);
String input = in.next(); // Scope of input starts here
     ...
     // Scope of input ends here
}

换言之,每个循环在迭代时,都会创建一个新的input变量的副本,并且该变量在循环之外并不存在。

参数变量的作用域是整个方法:

public static void main(String[] args) { // Scope of args starts here
     ...
     // Scope of args ends here
}

这里还有一种需要理解作用域规则的情况。以下的循环计算了获取特定随机数字需要尝试的次数:

int count = 0;
int next;
do {
     next = generator.nextInt(10);
     count++;
} while (next != target);

这里的next变量必须在循环外部声明,以便在循环中实现条件判断。如果在循环内部声明,那么它的作用域将只延伸到循环体的结尾。

当你在for循环中声明变量时,它的作用域将延伸到循环的结尾,包括测试和更新语句:

for (int i = 0; i < n; i++) { // i is in scope for the test and update
     ...
}
// i not defined here

如果需要循环后的i值,就请在外部声明变量:

int i;
for (i = 0; !found && i < n; i++) {
     ...
}
// i still available

在Java中,不能在重叠的作用域内有名称相同的局部变量:

int i = 0;
while (...) {
     String i = in.next(); // Error to declare another variable i
     ...
}

但是,如果作用域不重叠,则变量名可以相同:

for (int i = 0; i < n / 2; i++) { ... }
for (int i = n / 2; i < n; i++) { ... } // OK to redefine i