零、⭐⭐⭐前情提要🌙🌙🌙
实例变量(也称成员变量),在类的实例对象被创建时,会先按照实例变量的先后顺序被赋初始默认值,然后再按照实例赋值语句先后的顺序进行实例变量的赋值操作,最后执行构造方法。
静态变量(也称类变量),在类初始化的时候,会先按照静态变量的先后顺序被赋初始默认值,然后再按照静态赋值语句先后的顺序进行静态变量的赋值操作。
这里还搞不大清楚没关系,让我们来演示推敲一番:
一、⭐⭐⭐实例变量版本演示代码🌙🌙🌙
class InstanceObj{
public static InstanceObj obj= new InstanceObj();
public int x;//注意此处无赋值操作
public int y = 0;
private InstanceObj() {
x++;
y++;
}
}
public class TestInstanceVariable{
public static void main(String[] args) {
InstanceObj obj = InstanceObj.obj;
System.out.println("x=" + obj.x);
System.out.println("y=" + obj.y);
}
}
二、⭐⭐⭐成员变量版本演示结果🌙🌙🌙
x=1
y=1
三、⭐⭐⭐静态变量版本演示代码🌙🌙🌙
class StaticObj{
public static StaticObj obj= new StaticObj();
public static int x;//注意此处无赋值操作
public static int y = 0;
private StaticObj() {
x++;
y++;
}
}
public class TestStaticVariable{
public static void main(String[] args) {
StaticObj obj = StaticObj.obj;
System.out.println("x=" + obj.x);
System.out.println("y=" + obj.y);
}
}
四、⭐⭐⭐静态变量版本演示结果🌙🌙🌙
x=1
y=0
五、⭐⭐⭐结果分析🌙🌙🌙
一开始看到这个结果时,也是纳闷了好一阵子… 两个版本的代码区别就只是:变量x,y是否加了static修饰。为啥执行结果会如此不同呢?这就要回到一开始提到的实例变量和成员变量在初始化时候的不同处理方式了,完整的分析过程如下:
实例变量:
⭐1、先按照实例变量的定义顺序分别为实例变量赋默认值,也就是x=0 y=0;
⭐2、接着,在执行构造方法的时候对x和y分别做了加1的操作,结果自然是:x=1 y=1。
静态变量:
⭐1、先按照静态变量的定义顺序分别为每个静态变量赋默认值,即:obj=null x=0 y=0;
⭐2、再按照赋值语句顺序为对应的静态变量赋值,即 obj = new StaticObj();
⭐3、执行new StaticObj()时会调用构造方法,执行x和y的加1操作,即x=1 y=1;
⭐4、然后执行后续的赋值操作,由于x没有定义赋值操作所以x的值仍是1,而y定义了赋值操作y=0,所以y的1的值被0右覆盖掉了,故最终的结果是x=1 y=0。
Do you get it?