1. 先明确核心定义
成员变量:定义在类中、方法外的变量,属于整个对象(或类),也叫 “字段 / 属性”;
局部变量:定义在方法内、方法参数、代码块(如 if/for)内的变量,只在当前代码块有效。
2. 核心区别对比
关键补充
成员变量的默认值:和基本数据类型的默认值一致(int=0、double=0.0、boolean=false、引用类型 = null);
局部变量无默认值:如果声明后不赋值就使用,编译直接报错(这是新手最常踩的坑);
局部变量只能用
final修饰(表示常量),不能用public/private/static等修饰符。
3. 代码示例:直观区分两者
public class VariableDemo {
// 1. 成员变量(类中、方法外)
// 实例成员变量(属于对象,存在堆中)
private String name; // 引用类型,默认值null
public int age = 18; // 基本类型,手动赋值18
// 静态成员变量(属于类,存在方法区)
public static String gender = "男";
// 方法
public void test(int param) { // param是局部变量(方法参数)
// 2. 局部变量(方法内)
int score; // 声明局部变量(无默认值)
// System.out.println(score); // 编译报错:局部变量未赋值
score = 90; // 手动赋值后才能使用
String temp = "临时变量"; // 局部变量
if (score > 60) {
String result = "及格"; // 局部变量(代码块内)
System.out.println(result); // 仅在if块内有效
}
// System.out.println(result); // 编译报错:超出作用域
// 使用成员变量(整个类都能访问)
System.out.println(name); // 成员变量,默认值null
System.out.println(age); // 成员变量,值为18
System.out.println(gender); // 静态成员变量,值为"男"
// 使用局部变量
System.out.println(param); // 方法参数(局部变量)
System.out.println(score); // 方法内局部变量
System.out.println(temp); // 方法内局部变量
}
public static void main(String[] args) {
VariableDemo demo = new VariableDemo();
demo.test(100); // 调用方法,传入参数100(局部变量)
}
}输出结果:
null
18
男
100
90
临时变量
及格代码内存分析
创建
demo对象时,name、age作为成员变量存在堆内存中(name默认 null,age=18);调用
test(100)时,栈中创建test方法的栈帧:param=100、score=90、temp="临时变量"作为局部变量存在栈内存;if块内的result="及格"也存在栈中,if块执行完后立即销毁;
test方法执行完,栈帧销毁,所有局部变量释放;demo对象仍在堆中,直到 GC 回收。
总结
定义位置是核心区分点:成员变量在类中方法外,局部变量在方法 / 代码块内;
内存和生命周期:成员变量在堆、随对象生命周期;局部变量在栈、随方法执行销毁;
默认值和修饰符:成员变量有默认值、可加访问修饰符;局部变量无默认值、仅能加 final。