成员变量定义在类内方法外,随对象或类存在;局部变量定义在方法内,仅作用域有效。成员变量有默认值,局部变量必须显式初始化。成员变量在堆,局部变量在栈,影响线程安全与GC。
成员变量定义在类内部、方法外部,属于类或实例的一部分;局部变量定义在方法、构造器或代码块内部,只在对应作用域内有效。成员变量随对象创建而存在(实例变量)或随类加载而存在(静态变量),而局部变量在方法调用时入栈,方法结束即销毁。

this 或对象引用访问ClassName.variableName 或类实例访问(不推荐后者)if 块中声明却未覆盖所有分支,直接读取会报错 variable might not have been initialized
Java 会为成员变量赋予默认值(如 int 为 0,Object 为 null),但局部变量完全不会。这是最常踩的坑:写了个 String s; 在方法里,紧接着就 s.length(),编译直接失败。
0/0.0,布尔型为 false,引用类型为 null
try 块外、if-else 共同作用域中,也必须确保每条执行路径都赋过值成员变量可以使用 public、protected、private、static、final、transient、volatile 等修饰符;局部变量只能用 final(且 Java 8+ 后可省略该关键字,只要没被二次赋值)。
static 不能修饰局部变量——编译报错 modifier static not allowed here
private/protected 等访问控制符对局部变量无意义,语法禁止final 修饰局部变量时,主要影响的是匿名内部类或 Lambda 对它的引用能力,而非生命周期成员变量分配在堆(heap)上,受垃圾回收管理;局部变量分配在虚拟机栈(stack)上,随栈帧弹出自动释放。这点直接影响线程安全判断:局部变量天然线程私有,无需同步;而成员变量(尤其非 final 实例变量)可能被多线程并发访问,需额外考虑可见性与原子性。
ArrayList,仍需同步操作