作用域是变量可见与可用的边界,由代码结构和声明位置决定;局部变量限于{}块内,成员变量属类体,访问修饰符控制跨类可见性而非作用域本身。

作用域就是变量“能被看见、能被用到”的边界。它不是凭空设定的规则,而是由代码结构(尤其是花括号 {})和声明位置直接决定的硬性限制——超出这个范围,编译器会报错“找不到符号”,不是运行时问题,是写不下去的语法铁律。
局部作用域:只在当前{}块里有效
在方法内部、if、for、while等语句块中用 int x = 10; 声明的变量,作用域严格限定在它所在的最内层 {} 内。
- 变量必须先声明后使用,且不能跨块访问:比如在
if块里定义的String s = "ok";,出了}就不可见 for (int i = 0; i 中的i,作用域覆盖整个for结构(包括小括号和花括号),循环结束后就不能再用- 同一方法中,不同
{}里的同名变量互不干扰,例如外层int count;和内层if里的int count = 3;是两个独立变量
成员作用域:属于类或对象,贯穿整个类体
写在类里、所有方法外面的变量叫成员变量,又分两种:
-
实例变量(没加
static):每个对象一份,可在本类任意非静态方法中直接使用,无需加this.(但加了更清晰) -
静态变量(加了
static):整个类共享一份,可在本类所有地方访问,包括静态方法;可通过类名.变量名在类外调用 - 注意:静态方法中不能直接访问实例变量,因为此时可能还没有创建任何对象;想用就得传入对象引用,再通过
obj.field访问
访问修饰符:不是作用域,而是“门禁系统”
修饰符(private、default、protected、public)不改变变量“存在”的范围,只控制“谁有权限看到它”:
立即学习“Java免费学习笔记(深入)”;
-
private int x;在本类所有方法里都能用,但在其他类里完全不可见,哪怕在同一文件也不行 -
default(不写修饰符):同包内所有类都可访问,跨包就失效 - 修饰符影响的是跨类可见性,和变量在本类内的作用域无关——只要在类体内,成员变量就天然“存在”且可被本类代码访问
查找顺序:就近原则 + 层级覆盖
当代码中出现一个变量名(如 data),Java 按以下固定顺序找它的定义:
- 先查当前语句块(最内层
{}) - 没找到就往外一层找(比如从
if块找向方法体) - 再往外是类体(找到成员变量为止)
- 这意味着局部变量会自动“遮蔽”同名的成员变量:方法里写了
String data = "local";,那所有未加this.data的data都指这个局部变量









