类变量的初始化机制

class Price{
final static Price INSTANCE = new Price(2);
static double initPrice = 20;
double currentPrice;

public Price(double discount){
currentPrice = initPrice - discount;
}

}
public class PriceTest {
public static void main(String[] args){
System.out.println(Price.INSTANCE.currentPrice);
Price price = new Price(2);
System.out.println(price.currentPrice);
}

}
/***********/
输出结果:-2.0
                    18.0


下面从内存的角度分析这个程序。第一次用到Price类时,程序开始对Price进行初始化,初始化分为以下两个阶段。
1、系统为Price的两个类变量分配内存空间;
2、按初始化代码的排列顺序对类变量执行初始化;
在初始化第一个阶段,系统先为INSTANCE、initPrice 两个类变量分配内存空间,此时INSTANCE、initPrice 的值默认为null、0.0。接着初始化进入第二阶段,程序按顺序依次为INSTANCE、initPrice 进行赋值。对INSTANCE赋值时调用Price(2),创建Price实例,此时立即执行程序中粗体字代码为currentPrice进行赋值,此时initPrice类变量为0.0,因此,赋值的结果是currentPrice等于-2.0,接着程序再次将initPrice赋值为20,但是此时对INSTANCE的currentPrice实例变量已经不起作用了。
当Price类初始化完成后,INSTANCE类变量引用到一个currentPrice为-2.0的Price实例,而initPrice类变量的值为20.0。当再次创建Price实例时,该Price实例的currentPrice实例变量的值才等于20.0-discount。

你可能感兴趣的:(初始化)