java变量作用域遵循“声明处可见”原则:局部变量限于声明的{}内,成员变量在整个类中可见,静态变量属整个类且可外部访问;变量查找按就近原则逐层向外。

Java 变量作用域的可见性,核心就一条:变量在哪声明,就只能在哪及更内层的地方用。超出范围就“看不见”,编译直接报错,不是运行时异常,是写完就拦住你。
局部变量:出了花括号就失效
在方法里、for循环中、if块里、甚至一对{}里声明的变量,都属于局部变量。它的生命严格绑定在那对大括号之间。
- for (int i = 0; i
- if (flag) { String msg = "ok"; } else { String msg = "fail"; } —— 两个 msg 是独立的,各自只活在自己的分支里,外面无法访问
- 必须显式初始化才能使用,int a; System.out.println(a); 编译不通过
- 不能加 public、private、static 等修饰符
成员变量(实例变量):整个类里都认得
写在类里面、所有方法外面的变量,比如 private String name;,就是成员变量。它属于对象,每个 new 出来的实例都有一份自己的副本。
- 所有非静态方法、构造器、代码块都能直接用,不用加 this 也能访问
- 如果方法里声明了同名的局部变量,比如 void setName(String name) { name = name; },那就“遮蔽”了成员变量,此时左边的 name 指参数,右边也是参数;想给成员变量赋值得写 this.name = name
- 系统自动给默认值:int 是 0,boolean 是 false,引用类型是 null
静态变量:类一加载就在,大家共用一份
用 static 修饰的成员变量,比如 public static final int MAX_RETRY = 3;,它不属于某个对象,而是属于整个类。
- 作用域覆盖整个类,还能在类外部通过 类名.变量名 访问(权限允许的前提下)
- 生命周期最长:随类加载而生,程序结束才销毁
- 所有实例共享同一份数据,适合计数器、全局配置、工具类常量
- 静态方法里不能直接用实例变量,因为没对象上下文;要用就得先 new 一个对象再点出来
变量查找:就近原则,一层层往外找
当你写下某个变量名,比如 count,Java 不是随机猜,而是按固定顺序找:
- 先看当前最内层 {} 里有没有声明
- 没有就往外一层 {} 找(比如方法体)
- 再没有就到类体找(成员变量)
- 找到第一个就停,不会继续往更外找
所以局部变量能轻易“盖住”同名的成员变量,这不是 bug,是设计好的行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











