成员变量定义在类内方法外,用于跨方法共享对象状态;局部变量定义在方法、代码块或形参中,仅用于临时计算。二者在默认值、内存位置和访问权限上存在关键差异。

看定义位置和用途,就能自然区分成员变量和局部变量。
先看定义位置:类里还是方法里
这是最直观的判断依据:
- 写在类的大括号内、所有方法外部的变量 → 成员变量(包括实例变量和静态变量)
- 写在方法内部、构造器内部、代码块(如 if / for)内、或作为形参的变量 → 局部变量
例如:String name; 在类体里是成员变量;int count = 0; 在 public void print() { ... } 里面就是局部变量。
再看用途需求:要不要跨方法共享
用途决定选哪种变量:
- 需要描述对象状态、多个方法都要读写(比如学生的name、score)→ 用成员变量
- 只是临时计算、中间结果、循环控制(比如 for 中的 i、方法里的 temp)→ 用局部变量
- 想让所有对象共用一份数据(比如系统配置、计数器)→ 用 static 修饰的成员变量(类变量)
注意三个关键差异点
避免踩坑,记住这三点实际影响:
- 默认值:成员变量自动初始化(int 是 0,Object 是 null);局部变量不初始化就用会编译报错
- 内存位置:成员变量随对象存在堆中;局部变量在方法调用时压栈,执行完立刻释放
- 访问权限:成员变量可加 private/public 等修饰符;局部变量不能加任何访问修饰符
一个典型对照示例
下面这段代码同时用了两种变量:
public class Student {
// 成员变量:每个学生对象都有一份
private String name;
private int age;
public void study(String subject) { // subject 是形参 → 局部变量
int hours = 3; // hours 是方法内变量 → 局部变量
if (age >= 18) {
String level = "adult"; // level 是 if 块内变量 → 局部变量
System.out.println(level);
}
// 下面这行合法:name 和 age 是成员变量,整个类都可用
System.out.println(name + " 学习 " + subject + " " + hours + " 小时");
}
}
只要抓住“位置决定归属,用途决定选择”,就不会混淆。不复杂但容易忽略细节。


















