变量能否使用取决于其作用域;局部变量在方法、循环或if块内声明,从声明行生效至对应}结束,必须显式初始化,不可加访问修饰符。

变量能不能用,不取决于你写没写,而取决于它“在哪儿写”以及“当前代码在不在它的地盘里”。搞清作用域,编译错误少一半,逻辑bug少大半。
局部变量:声明即生效,出块就失效
写在方法内、循环里、if 或 {} 块中的变量,都是局部变量。它们的生命只属于那一小片代码。
- 必须显式初始化才能使用,int count; 后直接 System.out.println(count); 会编译失败
- 作用域从声明行开始,到最近的 } 结束——for 里的 i 循环外就不可见,if 块里定义的变量,哪怕条件恒真,也不能在 if 外访问
- 不能加 public、private、static 等修饰符
- 推荐在首次使用时声明,比如 for (int i = 0; i ,而不是先写 int i; 再循环
成员变量(实例变量):对象一出生,它就跟着
定义在类里、所有方法外面,但没加 static 的变量,每个对象都有自己的副本。
- 作用域覆盖整个类:所有非静态方法、构造器、初始化块都能直接访问
- 系统自动赋予默认值:int → 0,boolean → false,引用类型 → null
- 如果方法里有同名局部变量,它会“盖住”成员变量;想明确调用成员变量,加 this.name
- 访问权限由 private/protected/public 控制,但作用域本身仍是全类范围
静态变量(类变量):全类共用一份,类加载就存在
用 static 修饰的成员变量,不属于某个对象,而是属于整个类。
- 所有实例共享同一份数据,适合做计数器、全局配置、工具类常量(常配合 final 使用)
- 可通过 类名.变量名 在类外部直接访问(权限允许时),比如 Math.PI
- 生命周期最长:随类加载而存在,程序结束才销毁
- 同样有默认初始值,规则与成员变量一致
同名变量与遮蔽:就近原则是铁律
当局部变量、成员变量、静态变量重名时,Java 不靠猜,靠位置——谁离得近,就用谁。
- 方法内写了 String name = "Alice";,那接下来的 name 就指这个局部变量
- 没声明局部变量,但写了 name,就去找当前类的成员变量
- 写成 ClassName.name,就明确指定用静态变量
- 写成 this.name,就强制指向当前对象的成员变量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











