Java进阶---对象与内存控制(一) (三)

2014-11-24 11:14:46 · 作者: · 浏览: 2
//显示创建Price实例
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。