Java变量分为局部变量、实例变量和静态变量三类:局部变量定义在方法或代码块内,作用域限于{},须显式初始化,存于栈;实例变量定义在类中非静态区域,作用域为整个类,有默认值,生命周期随对象;静态变量用static修饰,属类级别,所有实例共享,类加载时初始化。

Java 变量不是“写出来就能用”的简单符号,而是有明确位置、生命周期、初始化规则和访问边界的内存实体。掌握变量,本质是理解 JVM 如何组织数据、编译器如何校验使用、以及程序员如何避免常见陷阱。
局部变量:方法内的临时工
定义在方法、构造器、for/if/while 代码块或任意 {} 内的变量,比如 int i = 0; 或 String msg;。它只活在当前花括号里,出了范围就“消失”——不是值清空,而是名字不可见、编译直接报错。
- 必须显式初始化才能读取:声明 int count; 后不赋值就 System.out.println(count);,编译失败
- 存储在栈内存,随方法调用而分配,随方法返回而释放
- 循环变量(如 for (int j = 0; j < 5; j++))的作用域仅限 for 小括号和大括号内,外面无法访问
- 方法参数也属于局部变量,作用域就是整个方法体
实例变量:对象的专属属性
写在类里、方法外,且没有 static 修饰的变量,例如 private String name; 或 public int age;。每个对象一份,彼此隔离。
- 无需手动初始化,JVM 自动赋予默认值:数值类型为 0,boolean 为 false,引用类型为 null
- 生命周期绑定对象:new 出来时诞生,GC 回收对象时一同销毁
- 存储在堆内存,通过对象引用访问,如 person.name
- 可在类中所有方法、构造器、初始化块中直接使用
静态变量:全类共享的配置项
用 static 修饰、同样定义在类中方法外的变量,例如 public static final int MAX_RETRY = 3; 或 private static int counter;。它不属于某个对象,而属于整个类。
立即学习“Java免费学习笔记(深入)”;
- 类加载时就初始化,早于任何对象创建;程序结束时才销毁
- 所有实例共享同一份数据,适合计数器、全局开关、常量池等场景
- 可通过类名直接访问(推荐),如 MyClass.counter;也可通过对象访问,但语义不清
- 有默认值,规则同实例变量;若加 final,则必须在声明时或静态初始化块中赋值
final 变量与作用域边界
final 不是作用域规则,但深刻影响变量使用方式。它要求“一次赋值,终身不变”,但要注意:final 管的是引用地址不变,不是内容不可变。
- final String s = "hello"; → s 不能再指向其他字符串
- final List<String> list = new ArrayList<>(); → list 不能指向新 List,但 list.add("a") 完全合法
- 作用域由 {} 精确界定:变量从声明行开始可见,到最近的右花括号结束;嵌套块中不能重名,否则编译报错
- 同名变量禁止嵌套声明:外部已定义 int x;,内部 { int x = 5; } 是非法的


















