Price p = new Price(2.8);
//通过显示创建的Price实例访问currentPrice实例变量
System.out.println(p.currentPrice);
}
}
表面上看,程序输出两个Price的currentPrice都应该返回17.2(20-2.8),但实际上运行后输出结果为-2.8和17.2。
如果仅仅停留在代码表面来看这个问题,很难得到正确结果,下面将从内存角度来分析这个程序。
首先看PriceTest类中的主函数,执行System.out.println(Price.INSTANCE.currentPrice);时程序会第一次用到Price类,这个时候会对Price类进行初始化,初始化过程为:
A. 为Price的两个类变量(INSTANCE和initPrice)分配内存空间,此时INSTANCE和initPrice的值为默认值null和0.0;
B. 按照初始化代码(定义时指定初始值和初始化块中执行初始值)的排列顺序对类变量执行初始化:
a) 对INSTANCE执行初始化:创建Price实例用到Price类的带参数构造器,执行其中的currentPrice=initPrice-discount。因为此时的initPrice=0.0,所以currentPrice=-2.8;
b) 对initPrice执行初始化:initPrice=20;
C. 这个时候主函数main()中System.out.println(Price.INSTANCE.currentPrice);执行完毕,出书结果为-2.8。
D. 之后执行Price p = new Price(2.8);这行代码,会先执行ABC过程,此时currentPrice=-2.8,initPrice=20。然后调用Price类的带参构造器执行currentPrice = initPrice – discount,得到currentPrice=17.2。