先上代码
测试类public class MyNumber {
public static MyNumber myNumber=new MyNumber(2.8);
private static double value=20;
public double currentvalue;
public MyNumber(double number){
currentvalue=value-number;
}
}
里面存放了一些静态变量。
调用类double result1= MyNumber.myNumber.currentvalue;
Log.d("TAG","result1----:"+result1);
MyNumber myNumber=new MyNumber(2.8);
double result2=myNumber.currentvalue;
Log.d("TAG","result2----:"+result2);
结果:result1----:-2.8
result2----:17.2
为什么会输出-2.8
原因如下:
在Java对静态类的初始化的时候是分为一下两个阶段:
1)系统为类里面的静态变量分配内存空间。
2)按初始化的代码编写顺序对类变量执行初始化。
所以在上面的代码里面的类初始化过程中。首先会为myNumber和value先分配内存空间,并赋默认初始值null和0.0。紧接着,程序按顺序依次为上述的变量赋值。
这时执行到public static MyNumber myNumber=new MyNumber(2.8);这段代码。
然后就去执行构造函数MyNumber(2.8),注意,这时因为value还是0.0,所以执行完构造函数之后,currentvalue=0-2.8=-2.8。
然后程序继续执行private static double value=20;,所以,以后value=20了,回到客户端继续执行,下次打印currentValue就是17.8了。
如果:private static double value=20;
public static MyNumber myNumber=new MyNumber(2.8);
即我们调换value和myNumber的顺序。
结果:result1----:17.2
result2----:17.2
这充分验证Java类中静态变量的初始化顺序的问题。