成员变量归对象管、局部变量归方法管:前者定义在类中、存于堆内存、有默认值、可加访问修饰符;后者定义在方法内、存于栈内存、须显式初始化、仅限代码块作用域且只能用final修饰。

局部变量和成员变量最核心的区别在于“谁管它”:成员变量归对象管,局部变量归方法管。生命周期、作用域、内存位置、初始化规则全由此衍生。
定义位置和归属关系不同
成员变量写在类里、所有方法外面,属于类或类的实例;局部变量写在方法内部、构造器里或代码块中(比如 if 或 for 的大括号内),只属于当前执行的方法栈帧。
- 成员变量可以是实例变量(无 static)或类变量(有 static),都随类或对象存在
- 局部变量没有“静态/非静态”之分,也不属于任何对象,方法一结束它就没了
- 方法参数也属于局部变量,比如 public void print(String msg) 中的 msg
生命周期和内存位置直接挂钩
成员变量随对象诞生于堆内存,对象被回收时才释放;局部变量随方法调用压栈而分配在栈内存,方法返回即出栈销毁。
- 堆内存空间大、管理由GC负责,适合长期存对象及成员变量
- 栈内存小、速度快、自动管理,适合临时计算用的局部变量
- 即使局部变量是个引用(如 String s = "hello"),s 本身在栈上,它指向的字符串对象仍在堆上
初始化规则和默认值差异明显
成员变量有系统默认值:数值型为0,布尔型为 false,引用类型为 null;局部变量必须显式赋值后才能使用,否则编译报错。
立即学习“Java免费学习笔记(深入)”;
- 常见错误:int count; System.out.println(count); 在方法里会编译失败,但在类里写就合法
- 哪怕只是声明没用到,局部变量也得初始化——JVM 不允许“可能未赋值”的风险
- final 成员变量若非 static,必须在声明、构造器或初始化块中赋值
作用域和访问修饰符限制严格
成员变量在整个类内可见,可加 public/private/protected/static/final 等修饰;局部变量仅限定义它的代码块,且只能用 final 修饰。










