通过前面的学习,咱们发现变量有时候定义在main函数里,有时候写在循环里,有的时候又写在自定义函数里,那么什么的变量的做用域呢函数
首先做用域是由花括号的位置决定的。学习
函数内定义的变量被称为局部变量。code
局部变量的做用范围从声明开始,直到包含它的块结束(块就是{}内的代码)。对象
函数的参数范围涵盖整个方法。参数其实是一个局部变量。作用域
public class SixthScopeLesson { /** * a在整个函数内都是可见的 * b在定义以后,直到 } 号以前都是可见的 * @param a */ public static void foo(int a) { System.out.println(a); int b = 10; System.out.println(b); } public static void main(String[] args) { foo(10); /** * 在main函数里,就访问不到foo(int a)里的a * 以及foo函数里定义的b */ } }
for循环的初始化部分声明的变量,其做用范围在整个循环。for循环
但循环体内声明的变量其适用范围是从它声明到循环体结束。它包含以下所示的变量声明:class
for(int i = 0; i < 10; i++ /*这里也能访问i,可是不能访问j*/) { int j = i + 1; /* 从这里到 } 都能访问到j */ System.out.println(i); System.out.println(j); } /** * 出了 } 以后,i和j都不能再访问 */
int i = 3; if (i >= 3) { /* 进入代码块 */ int j = 10; /* j从这里到 } 都能访问 */ System.out.println(i); /* 能够访问到i,由于i在上一级代码块 */ System.out.println(j); } System.out.println(i); /* 能够访问到i,处于同一个代码块 */ /* 访问不到j */
这说明什么,说明子代码块能够访问上层代码块的变量。变量
上层代码块却不能访问子代码块的变量。循环
这是为何,由于程序运行到}符号时,表示离开做用域,
{}内分配的变量将被JVM回收sso
讲到下一节“程序运行基石,栈”时,你们会有更好的理解。
类的全局变量在类内都能访问到
public class SixthScopeLesson2 { /** * 定义全局静态变量 * 变量名叫val * 把10赋值给val */ public static int val = 10; public static void foo() { /** * 因为val是全局变量 * 因此foo函数能访问到 */ System.out.println(val); } public static void main(String[] args) { /** * 因为val是全局变量 * 因此main函数能访问到 */ System.out.println(val); } }