一. 首先了解JVM的内存模型
二. 局部变量和成员变量的区别
1. 定义
- 成员变量:
- 实例变量
- 类变量:静态变量
- 局部变量:
- 一般在方法体{},形参,代码块{}中
2. 修饰符
- 成员变量:很多。。。
- 局部变量:final
3. 存储的位置
- 局部变量:栈
- 实例变量:堆
- 类变量:方法区
4. 作用域
-
局部变量:从声明开始,到所属的}的结束
-
实例变量:在当前类中“this.xx”(有时this可以省略),在其他对象中“对象名.xx”访问
例如:当如i为26行this修饰的时候,这个i就是第20行的实例变量i,当i为25行的时候,根据就近原则,i为第24行的i
-
类变量:在当前类中“类名.xx”(有时候类名.可以省略),在其他类中“类名.xx”或者“对象名.xx”访问
5. 生命周期
- 局部变量:每个线程,每一次调用执行都是新的生命周期,局部变量在方法体内,每一次方法的执行,都会在虚拟机占中开辟一片内存新建一个栈帧,随着方法的执行完毕,栈帧也随着消失(局部变量保存在栈中),更何况小小的局部变量呢
- 实例变量:随着对象的创建而初始化,随着对象的的回收而消亡,每个一个对象的实例变量都是独立的。
- 类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有变量的类变量是共享的
三. 例子
/**
* 成员变量:
* (1)实例变量
* (2)类变量:静态变量
* 修饰符:。。。。。。。。。
* 局部变量:
* 一般在方法体{},形参,代码块{}中
* 修饰符:final
*
* 存储的位置:
* 局部变量:栈
* 实例变量:堆
* 类变量:方法区
*/
public class Exam {
static int s;//类变量
int i;//实例变量
int j;//实例变量
{
int i=1;//非静态代码块中的局部变量
i++;
j++;
s++;
}
public void test(int j){//形参,局部变量
j++;
i++;
s++;
}
public static void main(String[] args) {
Exam object1 = new Exam();
Exam object2 = new Exam();
object1.test(10);
object1.test(20);
object2.test(30);
System.out.println(object1.i+","+object1.j+","+object1.s);
System.out.println(object2.i+","+object2.j+","+object2.s);
}
输出结果:
2,1,5
1,1,5