java中变量类型由声明位置决定:成员变量在类内方法外,属对象/类,有默认值,存于堆;局部变量在方法或代码块内,作用域限于对应花括号,须显式初始化,存于栈。

Java 中定义变量的关键在于“声明位置”和“作用范围”,局部变量和成员变量不是靠关键字区分,而是由它们在代码中写在哪里决定的。
声明位置直接决定变量类型
成员变量写在类里面、所有方法外面;局部变量写在方法里、构造器里或任意一对花括号 { } 内部。
- 成员变量属于类或对象,比如:
private String name;出现在class Student { ... }大括号内、但不在任何方法里 - 局部变量出现在方法内部,比如:
int count = 0;写在public void run() { ... }的大括号里 - 形参也是局部变量,例如
void print(String msg)中的msg,它只在print方法内有效
作用范围完全不同
成员变量在整个类中都可访问(受权限修饰符限制);局部变量只能在它被声明的那个代码块里用,出了那个 { } 就失效。
- 同一个类的多个方法可以共用一个成员变量,比如
age可以在setAge()和getAge()里都使用 - 在
if块里声明的局部变量,if外不能访问;不同for循环里可以重复用同名变量,互不干扰 - 方法 A 里的
temp和方法 B 里的temp完全是两个变量,内存地址、生命周期都无关
初始化与默认值规则相反
这是编译器强制要求的区别:成员变量有系统默认值,局部变量必须自己赋初值才能用。
- 成员变量如
int level;默认是0,String desc;默认是null - 局部变量如
int result;若没写= 0就直接System.out.println(result);,编译直接报错 - 哪怕只是声明后立刻使用,也必须显式初始化,例如
double price = 99.9;
内存分配与生命周期差异明显
成员变量随对象诞生而存在,随对象回收而消失,存在堆内存;局部变量随方法调用而压栈,方法结束就弹栈释放,存在栈内存。
- 新建一个
Student s = new Student();,它的成员变量就分配在堆上,整个对象存活期间一直可用 - 每次调用
s.study(),里面的局部变量(如循环变量i、临时结果score)都会重新分配、使用、销毁 - 所以局部变量不能用于保存跨方法的状态,要存状态就得用成员变量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











