上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