Java变量作用域分四类:局部变量在代码块内声明且须显式初始化;成员变量属对象实例,有默认值,类内非静态上下文可访问;静态变量属类本身,所有实例共享;常量用final修饰,赋值后不可变,引用类型仅保证引用不可变。

Java 中变量不是随便声明就能用的,关键在“在哪声明”和“能被谁看到”。作用域不是语法装饰,而是内存管理、线程安全和代码可维护性的底层约束。搞不清作用域,轻则编译报错,重则逻辑错乱、空指针频发。
局部变量:方法/块内自给自足
在方法、构造器或任意一对花括号 {} 内声明的变量,就是局部变量。
- 必须显式初始化才能使用,不给默认值——int x; 声明后直接 System.out.println(x); 会编译失败
- 作用域严格受限:从声明位置开始,到所在代码块结束为止
- for 循环里的 int i = 0;,循环外无法访问;代码块内声明的 String msg;,块外也拿不到
- 同名时,局部变量会覆盖(遮蔽)外部的成员变量,要用 this.name 显式访问成员变量
成员变量(实例变量):对象级别的共享数据
定义在类中、所有方法之外,但没加 static 的变量,属于每个对象实例。
- 随对象创建而存在,对象被 GC 回收时才销毁
- 有系统默认初始值:数值类型为 0 或 0.0,boolean 为 false,引用类型为 null
- 整个类内部(包括所有非静态方法、构造器、初始化块)都可直接访问
- 不能在 static 方法中直接调用,必须通过对象引用,比如 person.age
静态变量(类变量):全类共用一份
用 static 修饰、声明在类中方法外的变量,属于类本身,不依赖任何对象。
立即学习“Java免费学习笔记(深入)”;
- 随类加载而初始化,生命周期贯穿整个应用运行期
- 所有实例共享同一份数据,修改一个对象的静态变量,其他对象立刻可见
- 可通过类名直接访问:Counter.count,无需创建对象
- 同样有默认初始值,规则与成员变量一致
常量:用 final 锁死的不可变值
用 final 修饰的变量,一旦赋值就不能再改,是 Java 实现“不变性”的基本手段。
- 命名习惯全大写加下划线,如 MAX_RETRY、DEFAULT_TIMEOUT_MS
- 必须在声明时或构造器中完成初始化;静态常量通常搭配 public static final 使用
- 注意:final 修饰引用类型(如 final List<String> list)只保证引用不可变,list 内部元素仍可增删
- 配合 static 使用时,等效于全局常量,编译期可能被内联优化

















