定义的位置上区别:
- 成员变量是定义在方法之外,类之内的。
- 局部变量是定义在方法之内。
作用域的区别
- 成员变量的可以在本类任意位置使用,如果被public修饰,其它类如可以拿到本类对象引用也可使用
- 局部变量只能在方法体内部使用
生命周期的区别
- 成员变量的生命周期与本类对象的生命周期绑定,类创建而开始,类消亡而消失
- 局部变量的生命周期与方法的生命周期相关,在方法中线程执行到该成员变量生命周期开始,而方法执行完生命周期结束
在内存中的区别
- 成员变量存储在堆中的对象里面,由垃圾回收器负责回收
- 局部变量的数据存在栈内存中,栈内存中的局部变量随着方法的消失而消失。
默认值的区别
成员变量
数据类型 | 默认的初始值 |
---|---|
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
boolean | false |
char | ' ' |
String | null |
对象 | null |
局部变量
局部变量没有默认的初始值,必须初始化才能使用。
调用顺序
在同一个类中,成员变量的名字可以与局部变量的名字相同,但是优先调用局部变量,就近优先,如果非要访问成员变量,须本类引用.变量,才可以,本类引用大多是用this,但要注意使用位置!
public class MyClass {
private int i;//成员变量
private void myMethod(){
final int i = 1;//局部变量
new Thread() {
@Override
public void run() {
int x = i;
//int x = this.i;//错误
}
}.start();
}
}
上方代码第8行的i是局部变量的i,第9行之所以错误是因为this关键字代表本类对象,当前是在子线程中,所以代表的是子线程中的本类对象Thread。第9行这里如果必须使用成员变量,要么你想办法拿到MyClass对象的引用,用么就直接把成员变量的名字改掉与局部变量不同就可以了!