成员变量和局部变量
成员变量和局部变量
考点:
- 就近原则
- 变量的分类
- 成员变量: 类变量 实例变量
- 局部变量
- 非静态代码块的执行: 每创建一次实例对象就会执行一次
- 方法的调用规则: 调用一次执行一次
- 成员变量有默认值,而局部变量没有默认值
局部变量和成员变量的区别
1. 声明的位置
- 局部变量: 声明在方法体中(){} 形参 代码块{}中
- 成员变量: 类中 方法的外面-->类的属性
- 类变量:有static修饰
- 实例变量:没有static修饰
2. 修饰符
- 局部变量:可以使用fianl
- 成员变量:public protected private final static volatile teansient
3. 值存储的位置
- 局部变量:栈(stack)
- 成员变量:
- 实例变量: 堆(heap)
- 类变量: 方法区

- heap:这个内存唯一的目的就是存放对象实例,几乎所有的对象都是在这里分配内存,所有的对象实例以及数组都是要在堆的上面分配的
- stack:指的是栈,用来存储局部变量表,局部变量(表中存放了编译器间就能知道长度的各种基本的数据类型(boolean,byte,char,short,int,float,long,daoble),对象引用(reference类型,它们不等同与对象的本身,是对象在heap中的首地址)方法执行完成之后,自动释放)
- 方法区:用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据.
4. 作用域
- 局部变量:从声明出开始到所属的}结束
- 成员变量
- 实例变量:在当前类中this 有时this可以省略,在其他类中以对象名.xxx来访问
- 类变量: 随着类的初始化而初始化,随着类的卸载而消亡,该类的所有的对象的类变量是共享的
5. 声明周期
- 局部变量: 每一个线程,每一次调用执行都是新的生命周期
- 成员变量:
- 实例变量:随着对象的创建而初始化,随着对象的回收而消亡,每一个对象的实例变量都是独立的(实例变量,,顾名思义也就是在实例中的变量,在单个的实例中共享,属于属性)
- 类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象是共享类变量的(类变量,顾名思义也就是在类中的变量,所以一个类时共享的,实例变量加上static就是类变量了)
6. 测试代码
package Other;
public class Exam5 {
static int s;// 5
int i; // A-2 B-1
int j;//A-1 B-1
{
int i = 1;
i++; // 就近原则
j++;
s++;
}
public void test(int j) {
j++; // 就近原则 21
i++;
s++;
}
public static void main(String[] args){
Exam5 obj1 = new Exam5();
Exam5 obj2 = new Exam5();
obj1.test(10);
obj1.test(20);
obj2.test(30);
// 2 1 5
System.out.println(obj1.i + "," + obj1.j + "," + obj1.s);
// 1 1 5
System.out.println(obj2.i + "," + obj2.j + "," + obj2.s);
}
}
答案:
2,1,5
1,1,5


浙公网安备 33010602011771号