成员变量与局部变量
输出结果为???
public class Exam2 {
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) {
Exam2 obj1 = new Exam2();
Exam2 obj2 = new Exam2();
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);
}
}
结果
2,1,5
1,1,5
解释
局部变量与成员变量的区别:
①声明的位置
局部变量:方法体{}中, 形参,代码块{}中
成员变量:类中方法外
- 类变量:有static修 饰
- 实例变量:没有static修饰
②修饰符
局部变量: final
成员变量: public、protected、private、 final、static、volatile、transient
③值存储的位置
局部变量:栈
实例变量:堆
类变量:方法区
public class Exam2 {
static int s;//成员变量,类变量
int i;//成员变量,实例变量
int j;//成员变量,实例变量
{
int i = 1;//非静态代码块中的局部变量 i
//this.i++; //这就打破了就近原则,调用是是上面的实例变量 i
i++; //调用局部变量 i = 1
j++;
s++;
}
public void test(int j){//形参,局部变量 j
//this.j++; //这就打破了就近原则,调用是是上面的实例变量 j
j++; //调用局部变量 形参 j
i++;
s++;
}
public static void main(String[] args) {//形参,局部变量 args
Exam2 obj1 = new Exam2();//局部变量 obj1
Exam2 obj2 = new Exam2();//局部变量 obj1
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);
//打破就近原则
//System.out.println(obj1.i + "," + obj1.j + "," + obj1.s); // 3,3,5
//System.out.println(obj2.i + "," + obj2.j + "," + obj2.s); // 2,2,5
}
}
当局部变量与xx变量重名时,如何区分?
- 局部变量与实例变量重名:在成员变量前面加上“this”
- 局部变量与类变量重名:再类变量前面加上“类名”