java中变量能否使用取决于声明位置和当前代码位置:局部变量限于代码块内、须显式初始化、存于栈内存、方法结束即销毁;成员变量属类或对象、有默认值、存于堆内存、生命周期与对象一致。

Java里变量能不能用,不看名字,只看“在哪声明”和“当前代码在哪儿”。局部变量和成员变量表面都是变量,但生命周期、内存位置、初始化规则、访问方式全都不一样。搞混了,轻则编译失败,重则值被意外覆盖、空指针频发。
作用域范围:一个限于括号内,一个管整个类
局部变量只能在它出现的那对大括号 { } 里用——方法体、for循环、if块、try块里声明的都算。一旦出了这个块,变量就“消失”了,连编译都过不去。
成员变量写在类里、所有方法外面,只要是非静态方法,就能直接用。哪怕在第10个方法里,也能访问第1个方法上方定义的成员变量。
- for(int i = 0; i
- if(true) { String flag = "done"; } → flag 在 if 外面访问会报错
- private String id; public void login() { System.out.println(id); } → 合法,id 是成员变量,login 方法可直接访问
初始化要求:一个必须赋值,一个自带默认值
局部变量不会自动给值。int x; 声明完不能直接打印,必须 int x = 0; 或其他初始值,否则编译报错。
成员变量不同:系统兜底。int 类型默认是 0,boolean 是 false,String 等引用类型是 null。你没写,Java 已悄悄帮你填好了。
- void calc() { int count; System.out.println(count); } → 编译失败
- class User { int level; boolean active; String name; } → new User() 后,level=0、active=false、name=null
内存与生命周期:一个随方法进出栈,一个随对象驻堆
局部变量存在栈内存里,方法一调用,它就压栈;方法执行完,它就弹栈销毁,不留下痕迹。
成员变量属于对象,对象创建时分配在堆内存,只要对象还被引用着,成员变量就一直存在。GC 回收对象时,它们才一起释放。
- 方法参数、循环计数器、临时计算结果 → 适合用局部变量
- 用户姓名、订单状态、配置开关 → 属于对象固有属性,该用成员变量
同名时谁说了算:就近原则 + this 显式区分
如果方法里写了 String name = "张三";,而类里也有 private String name;,那么方法中直接写 name 就指局部变量,“盖住”了成员变量。
想访问被遮蔽的成员变量?加 this.name 就行。this 不是可选,是明确指向当前对象的成员变量的唯一方式。
- public void setName(String name) { this.name = name; } → 正确:左边是成员变量,右边是参数
- public void setName(String name) { name = name; } → 错误:只是把参数赋给自己,成员变量没变
- static 方法里不能用 this → 所以 static 方法不能直接访问非 static 成员变量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











