public class Variable {
static int s;//成员变量,类变量
int i;//成员变量,实例变量
int j;//成员变量,实例变量
{
int i = 1;//非静态代码块中的局部变量 i
i++; //此时的 i 指的是上一行的 i 而非代码块外声明的 i (就近原则)
j++;
s++;
}
public void test(int j) {//形参,局部变量 j
j++;
i++; //此时的 i 不仅仅要就近原则,而且要考虑作用域,所以此时的 i 应是最开始声明的 i,因为最近的 i 在非静态代码块结束以后就失效了
s++;
}
public static void main(String[] args) {//形参,局部变量 args
Variable v1 = new Variable();//局部变量 v1
Variable v2 = new Variable();//局部变量 v2
v1.test(10);
v1.test(20);
v2.test(30);
System.out.println(v1.i + "," + v1.j + "," + v1.s);
System.out.println(v2.i + "," + v2.j + "," + v2.s);
}
}
/**
* 答案
* 2,1,5
* 1,1,5
*/
/**
* 考点:
*
* 1、就近原则
*
* 2、变量的分类
* 成员变量:类变量、实例变量
* 局部变量
*
* 3、非静态代码块的执行:每次创建实例对象都会执行
*
* 4、方法的调用规则:调用一次执行一次
*/
/**
* 成员变量与局部变量的区别
*
* 1、声明的位置
* 局部变量:方法体 {} 中,形参,代码块 {} 中
* 成员变量:类中方法外
* 类变量:有static修饰
* 实例变量:没有static修饰
*
* 2、修饰符
* 局部变量:final
* 成员变量:public protected private final static volatile transient
*
* 3、值存储的位置
* 局部变量:栈
* 实例变量:堆
* 类变量:方法区
*
* 4、作用域
* 局部变量:从声明处开始,到所属的}结束
* 实例变量:在当前类中 "this."(有时this.可以缺省),在其他类中 "对象名."访问
* 类变量:在当前类中 "类名."(类名.可以缺省),在其他类中 "类名."或"对象名."访问
*
* 5、生命周期
* 局部变量:每一个线程,每一次调用执行都是新的生命周期
* 实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例变量是独立的
* 类变量:随着类的创建而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的
*/
其他注意:
当局部变量与实例变量重名,在实例变量前面加"this."
当局部变量与类变量重名,在实例变量前面加"类名."