




作用域决定访问权限,生命周期决定存在时间;局部变量作用域窄、生命周期短且须显式初始化;实例变量作用域为整个类、生命周期随对象、有默认值;静态变量属类级别、作用域最广、生命周期最长、被所有实例共享。
作用域 和 生命周期 是两个紧密关联但本质不同的概念:作用域决定“能不能访问”,生命周期决定“存不存在”。变量可能还在内存里(没被销毁),但你已经不能访问它了;也可能作用域还有效,但变量早已因对象被回收而消失——这在 Java 中很常见。
你在 if、for、while 或方法体里声明的变量,比如 int i = 0 或 String msg,都属于局部变量。
} 结束(哪怕只是代码块的闭合)必须显式初始化,否则编译直接失败(不像成员变量有默认值)隐藏 成员变量,要用 this.xxx 显式指代public class ScopeExample {
private String name = "default";
public void test() {
String name = "local"; // 隐藏了成员变量 name
System.out.println(name); // 输出 "local"
System.out.println(this.name); // 输出 "default"
if (true) {
int x = 100;
System.out.println(x); // ✅ OK
}
// System.out.println(x); // ❌ 编译错误:x cannot be resolved
}}
实例变量(成员变量):作用域宽、生命周期随对象,不赋值也有默认值
定义在类里、方法外、且没加 static 的变量,比如 private int age,就是实例变量。
new Person() 开始,到 GC 回收该对象为止int → 0,Object → null,boolean → false)static 方法里写 age++ 会报错)public class Person {
private String name; // 默认为 null
private int age; // 默认为 0
public void printInfo() {
System.out.println("name=" + name + ", age=" + age); // 不报错
}
public static void main(String[] args) {
Person p = new Person();
p.printInfo(); // 输出:name=null, age=0
// System.out.println(age); // ❌ 错误:无法从静态上下文中引用非静态变量
}}
静态变量:类级共享,作用域最广,生命周期最长
用 static 修饰的变量(如 public static final String VERSION),属于类本身,不是某个对象。
ClassName.field 或 obj.field 访问final 静态变量需同步public class Counter {
public static int count = 0;
public Counter() {
count++; // 每创建一个实例,count +1
}
public static void main(String[] args) {
new Counter();
new Counter();

System.out.println(Counter.count); // 输出 2
}}
最容易混淆的坑:循环里声明变量 vs 循环外声明
很多人以为 for (int i = 0; i 中的 i 在循环结束后还能用——其实不能。而把 i 提到循环外,又容易误以为它“属于循环”,其实它只是个普通局部变量。
for (int i = ...):i 是块级局部变量,只活在 for 大括号内int i = 0; for (...):i 是方法级局部变量,活到方法结束i)会导致编译错误,因为外层 i 的作用域还没结束这种细节不靠记忆,靠 IDE 报错提示和编译器反馈来确认——别猜,让 JVM 告诉你边界在哪。