局部变量从声明语句执行开始生效,到所在代码块的右大括号结束为止;其可见性由控制流路径决定,而非代码书写位置,嵌套块中同名变量会遮蔽外层变量。

局部变量的可见性,取决于它在方法中声明的位置和所在代码块的边界,不是“写在哪一行”就立刻全局可用,而是从声明语句执行开始、到对应大括号结束为止——也就是“从定义处起,向下有效,到块尾止”。
可见性起点:声明行才真正“出生”
局部变量不是一进方法就存在,而是在程序执行流到达其声明语句时,才被创建并进入作用域:
- 像 int x = 5; 这样的语句,只有执行到这一行,x 才能被后续代码访问;
- 写在它前面的代码(哪怕同在一个方法里)不能使用 x,编译直接报错;
- 方法参数虽未显式写出“赋值语句”,但调用时传入值即视为声明完成,所以整个方法体都可访问。
可见性终点:紧贴大括号的“物理边界”
变量只活在它被声明的那个代码块内,这个块可以是方法体、if、for、while 或任意一对 {}:
- if (true) { int y = 10; System.out.println(y); } —— y 在花括号外不可见;
- 嵌套块中同名变量会遮蔽外层变量,例如内层 int y = 20; 会覆盖外层的 y;
- 即使两个 if 块并列,各自声明的同名变量也互不影响,因为它们属于不同作用域。
执行顺序影响可见性范围
Java 是顺序执行的,变量是否“已声明”完全由控制流路径决定:
- 分支语句(如 if/else)中,只有实际执行的分支里的变量才生效;
- 循环体内声明的变量,每次迭代都会重新创建(栈上新分配),上一轮的变量已销毁;
- 声明在 try 块内的变量,在 catch 或 finally 中不可见,除非声明在 try 外。
常见误区提醒
容易混淆的是“语法位置”和“运行时可见性”:
- 变量写在方法开头 ≠ 整个方法都能用(若它被包在某个 {} 里);
- 变量名重复不等于复用——每进一次块,local x = ... 都新建一个独立变量;
- 没有默认值不是“看不见”,而是“未初始化就用”会编译失败,这是可见性之后的第二道检查。


















