A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 辉Se天空 于 2015-3-27 11:21 编辑
  1. ---------------------------------------------程序1------------------------------------------------
  2. public class PriceTest {
  3.     public static void main(String[] args) {
  4.         //输出位置1   
  5.         System.out.println(Price.INSTANCE.currentPrice);
  6.         Price p = new Price(2.8);
  7.         //输出位置2
  8.         System.out.println(p.currentPrice);
  9.     }
  10. }
  11. class Price {
  12.     public Price(double discount) {
  13.         currentPrice = initPrie - discount;
  14.     }
  15.    
  16.     static final Price INSTANCE = new Price(2.8);
  17.    
  18.     static double initPrie = 20;

  19.     double currentPrice;
  20. }
复制代码
* 对于(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去掉,并且交换   
  1. static Price INSTANCE = new Price(2.8)
  2. static double initPrie = 20;
复制代码
这两句的顺序会发现结果为17.2,大家可以想想为什么就能深入了解类变量初始化时的机制了



评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马