成员变量声明在类内方法外,局部变量声明在方法、代码块、参数列表或循环中;前者有默认值、可加访问修饰符、存于堆内存,后者须显式初始化、不可加修饰符、存于栈内存。

看声明位置最直接:写在类里、所有方法外面的是成员变量;写在方法里、代码块里或参数列表中的是局部变量。
一眼认出声明位置
成员变量一定在 class 大括号内,但不在任何方法、构造器或代码块内部。比如:
class Person {
String name; // ✅ 成员变量(类中、方法外)
int age;
public void say() {
String msg = "hello"; // ✅ 局部变量(方法体内)
if (true) {
int flag = 1; // ✅ 局部变量(代码块内)
}
System.out.println(flag); // ❌ 编译错误:flag 不可见
}
}
- 方法参数也是局部变量,如 void print(String input) 中的 input
- for 循环中 for (int i = 0; ...) 的 i 是局部变量,作用域覆盖整个 for 语句
- try-with-resources 中的资源变量(如 FileInputStream fis)也属于局部变量
作用范围和使用规则不同
成员变量在整个类里都可用,所有非静态方法、构造器、实例代码块都能直接访问;局部变量只在它声明的那个 { } 块里有效,出了括号就失效。
- 成员变量有默认值:int 是 0,boolean 是 false,引用类型是 null
- 局部变量必须显式赋值后才能使用,否则编译报错
- 同名时按就近原则:方法内出现 name,优先用局部变量;想用成员变量得加 this.name
- 局部变量不能加 public、private、static 等修饰符
生命周期和内存位置也分开
成员变量随对象存在——对象在堆里,它就在堆里;对象被回收,它就消失。局部变量随方法调用而生,在栈帧里分配,方法执行完栈帧弹出,变量立刻不可访问。
- 成员变量生命周期 = 对象生命周期
- 局部变量生命周期 = 所在代码块执行期
- 哪怕方法执行完,只要对象还活着,它的成员变量就一直存在
- if 或 for 块里声明的变量,不会因为条件不满足就不创建——只要进入该块,变量就诞生;块结束,变量即销毁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











