本帖最后由 辉Se天空 于 2015-3-27 11:21 编辑
- ---------------------------------------------程序1------------------------------------------------
- public class PriceTest {
- public static void main(String[] args) {
- //输出位置1
- System.out.println(Price.INSTANCE.currentPrice);
- Price p = new Price(2.8);
- //输出位置2
- System.out.println(p.currentPrice);
- }
- }
- class Price {
- public Price(double discount) {
- currentPrice = initPrie - discount;
- }
-
- static final Price INSTANCE = new Price(2.8);
-
- static double initPrie = 20;
- double currentPrice;
- }
复制代码 * 对于(1) 输出的结果为:-2.8
* 、、对于类变量的初始化,在程序中只有两个地方 ,一个是定义时指定初始值;另一个是在静态初始化块中对类变量指定初始值 ;
*1.系统为price的两个类变量分配内存空间
*2.按初始化代码的排列顺序对类变量执行初始化
*在第一阶段,系统为INSTANCE/initPrice 两个类变量分配内存空间,此时INSTANCE和initPrice的默认值分别为 null 和 0.0。
*接着进入到第二阶段,为每个类变量进行赋初值的操作。先为INSTANCE 初始化,初始化的过程中会调用程序的Price()方法,执行方法的方法体,
*此时的initPrice还未被初始化,所以计算得到的currentPrice=-2.8;
*
*对于(2) 输出的结果为: 17.2
*、、对于final 类变量而言,初始化也只能在两个地方指定 ,一个是在定义 final 类变量时指定 ;另一个是在初始化块中为final 类变量指定;
* 对于一个使用final 修饰的变量而言,如果定义该 final 变量时就指定初始值,而且这个初始值 可以在编译时确定下来,那么这个final 变量
* 交不再是一个变量,系统会将其当成“宏变量”处理。也就是说,所有出现该 变量的地方,系统将直接把它当成对应的值处理。
*/
以上来自网络解析非常清楚大家可以参考下
然后再举个例子 把 static final Price INSTANCE = new Price(2.8); 中的final去掉
我们会发现结果依然是-2.8.因为再变量分配内存之后,就是依次按照代码顺序初始化变量首先初始化 INSTANCE ,但是此时 initPrie并没有初始化其值为null,所以结果依然不变为-2.8.
如果我们 把 static final Price INSTANCE = new Price(2.8); 中的final去掉,并且交换 - static Price INSTANCE = new Price(2.8)
- static double initPrie = 20;
复制代码 这两句的顺序会发现结果为17.2,大家可以想想为什么就能深入了解类变量初始化时的机制了
|