- 就近原则
- 变量的分类
- 成员变量:类变量、实例变量
- 局部变量
- 非静态代码块的执行:每次创建实例对象都会执行
- 方法的调用规则:调用一次执行一次
一、代码演示
老规矩先上代码
public class Demo02 {
static int s; // 成员变量--类变量
int i; // 成员变量--实例变量
int j; // 成员变量--实例变量
{
int i = 1; // 非静态代码块中的局部变量i
i++;
j++;
s++;
}
public void test(int j) { // 形参,局部变量,j
j++;
i++;
s++;
}
public static void main(String[] args) { // 形参,局部变量 args
Demo02 obj1 = new Demo02(); // 局部变量,obj1 i=0,j=1,s=1
Demo02 obj2 = new Demo02(); // 局部变量,obj2 i=0,j=1,s=2
obj1.test(10); // i=1,j=1,s=3
obj1.test(20); // i=2,j=1,s=4
obj2.test(30); // i=1,j=1,s=5
System.out.println(obj1.i + "," + obj1.j + "," + obj1.s);
System.out.println(obj2.i + "," + obj2.j + "," + obj2.s);
}
}
运行结果:
2,1,5
1,1,5
二、成员变量与局部变量的区别
2.1 声明位置
- 局部变量:方法体 { } 中,形参,代码块 { } 中
成员变量:类中方法外
成员变量的作用是用于描述一类事物的公共 属性的。
-
2.3 初始值区别
成员变量是有默认的初始值
数据类型 默认的初始值<br /> int 0<br /> float 0.0f<br /> double 0.0<br /> boolean false<br /> char ' '<br /> String(引用数据类型) null
-
2.4 值存储位置
局部变量:栈
- 实例变量:堆
- 类变量:方法区
堆(heap):存储对象实例,和数组 栈(stack):虚拟机栈。用于存储局部变量表。局部变量表存放了编译期可以知道长度的各种基本数据类型(boolean、byte、short、char、int、float、long、double)、对象引用(reference类型,存储对象在堆内存的首地址)。方法执行完自动释放。 方法区(Method Area)用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。
注:jdk8之后,常量、静态常量放到了堆当中。
例如Demo02 obj1 = new Demo02(),obj1在栈里面,new Demo02()在堆里面
2.5 生命周期
- 局部变量:每一个线程,每一次调用执行都是新的生命周期
- 实例变量:随着对象的创建而创建,随着对象的回收而消亡,每一个对象的实例变量都是独立的。
- 类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的。