直接上代码(Java程序员的基本修养示例)
class Price上面的输出结果是什么呢?
{
final static Price INSTANCE = new Price(2.8);
//定义一个初始化变量
static double initPrice = 20;
//定义当前价格
double currentPrice;
public Price(double discount)
{
System.out.printf("initPrice:%f \n",initPrice);
this.currentPrice = initPrice - discount;
}
public static void main(String[] args)
{
//通过INSTANCE访问
System.out.println(Price.INSTANCE.currentPrice);
//显示创建对象访问
Price price = new Price(2.8);
System.out.println(price.currentPrice);
}
}
你的结果是不是 输出的 currentPrice都是 17.2呢
代码分享:
如果仅仅停留在代码表面看这个问题,很难得到正确的结果
从内存角度分析:
第一次用到Price类是,程序开始对Price类进行初始化
两个阶段:
1.系统为Price的两个变量[initPrice、currentPrice]
2.按初始化代码(定义是指定初始化值和初始化块中执行的初始值)的排列顺序对类变量执行初始化。
初始化第一阶段,系统为INSTANCE、initPrice两个类变量分配内存空间,此时INSTANCE、initPrice的值为默认值null和0.0。接着初始化进入第二个阶段,程序按顺序依次为INSTANCE、initPrice进行赋值。对INSTANCE赋值时要调用Price(2.8),并创建Price实例,此时理解执行程序中构造函数中的代码,当Price类初始化完成后,INSTANCE类变量引用到一个currentPrice为-2.8的Price实例,而initPrice类变量的值为20.0。当再次创建Price实例时 currentPrice = 20.0 - discount。