知识点:
成员变量和局部变量的区别
- 声明的位置
- 局部变量:方法体{}中,形参,代码块{}
- 成员变量:类中方法外(类变量:有static修饰;实例变量:没有static修饰)
- 默认值
- 成员变量没有初始化,默认值是0
- 局部变量必须初始化,否则编译不通过
- 修饰符
- 局部变量:final
- 成员变量:public private protected static final volatile transient
- 值存储的位置
- 局部变量:栈(用于存放局部变量表,局部变量表存放了各种基本数据类型本身,以及引用数据类型的地址)
- 实例变量:堆(此内存区域的唯一目的就是存放实例对象)
- 类变量:方法区(存储已被虚拟机加载的类信息,常量,静态变量)
- 作用域
- 局部变量:从声明处开始,到所属的 }结束
- 实例变量:在当前类中“this.”(有时this.也可以缺省),在其他类中“对象名.”访问
- 类变量:在当前类中“类名.”(有时“类名.”,可以省略),在其他类中“类名.”或者“对象名.”访问
- 生命周期
- 局部变量:每一个线程,每一次调用执行都是新的生命周期
- 实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例变量都是独立的
- 类变量:随着类的初始化而初始化,随着类的消亡而消亡,类变量为该类所有对象共享
代码分析:
package javaSE;
public class Test6 {
static int s; //成员变量:类变量(类中方法外)
int i; //成员变量:实例变量(类中方法外)
int j; //成员变量:实例变量(类中方法外)
{
int i =1; //局部变量(代码块内)
i++; //在没有用this指明是实例变量时,默认就近原则,也就是局部变量
j++;
s++;
}
public void test(int j){ //局部变量(形参)
j++; //在没有用this指明是实例变量时,默认就近原则,也就是局部变量
i++;
s++;
}
public static void main(String[] args) {
Test6 obj1 = new Test6(); //局部变量(方法内)
Test6 obj2 = new Test6(); //局部变量(方法内)
obj1.test(10);
obj1.test(20);
obj2.test(30);
System.out.println(obj1.i+","+obj1.j+","+obj1.s);
System.out.println(obj2.i+","+obj2.j+","+obj2.s);
}
}
先按照局部变量与全局变量的声明位置,对上述代码的中变量先进行分类
执行Test6 obj1 = new Test6()实例化时,会执行代码块,发生如下变化
对于局部变量"i",每一次调用执行都是新的生命周期,所以在实例化之后i=2就会被移除
同理 执行Test6 obj2 = new Test6()实例化时,会执行代码块,发生如下变化
对于局部变量"i",每一次调用执行都是新的生命周期,所以在实例化之后i=2就会被移除
执行obj1.test(10),发生如下变化,j为局部变量存放于局部变量表
对于局部变量"j",执行完obj1.test(10)被移除
接着执行obj1.test(20)
对于局部变量"j",执行完obj1.test(20)被移除
接着执行obj2.test(10)
这就是最后的结果