先来看下总结吧,主要有以下一些区别:
1.变量定义位置
成员变量:类中,方法外,一种是有static修饰,一种是实例变量没有static修饰
局部变量:形参/非静态代码块中
2.修饰符使用
成员变量:public、protected、private、final,static,volatile,transient
局部变量:只有final
3.作用域
成员变量:当前类中的this,在其他类中的对象名访问,
静态变量:在当前类中的类名.,在其他类中的类名.或对象名.访问
局部变量:局部变量冲声明处开始,到所属的“}”结束
4.值存储位置
实例变量:存放于堆空间中
静态变量:存放于方法区中,1.8之后静态变量是存放在堆区,是实际数据的存储。方法中使用直接引用其指针,在栈中使用
局部变量:存放于栈中
5.生命周期
局部变量:每一个线程每一次调用执行都是新的生命周期(随着方法进栈而诞生,随着方法出栈而死亡)
实例变量:跟随实例对象的生命周期(对象创建诞生,对象回收消失)
静态变量:跟随类的生命周期(类加载诞生,类卸载消失),静态变量可以被所有实例对象共享
6.使用优先级不同
局部变量优先于成员变量(就近原则)
好了,说多了都是废话,我们先上个demo从代码里面来看区别:
public calss Demo{
String str;//成员变量
public static Integer a = 10;//静态变量
int i = 5;
public void test1(){
int num=20;//局部变量 默认值null
System.out.println(num);
System.out.println(str);
}
public void test2(int i){
int age;
//System.out.println(age);//错误写法 未赋值不能使用,必须赋值
//方法的参数就是局部变量
System.out.println(i);//优先使用局部变量
}
}