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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑世光 中级黑马   /  2012-9-21 22:11  /  1991 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑世光 于 2012-9-22 21:49 编辑

下面程序的初始化看得我真的有点乱,谁能讲讲程序执行中那些变量
是怎么变的。结果是-2.8 和17.2

public class PriceTest {
/**
  * @param args
  */
public static void main(String[] args) {
  System.out.println(Price.INSTANCE.currentPrice);
  Price p=new Price(2.8);
  System.out.println(p.currentPrice);
}
}
class Price
{
final static Price INSTANCE =new Price(2.8);
static double initPrice=20;
double currentPrice;
public Price(double discount)
{
  currentPrice=initPrice-discount;
}
}

4 个回复

正序浏览
汪小照 发表于 2012-9-21 22:51
public class PriceTest {
/**
  * @param args

INSTANCE显示初始化完毕后,initPrice才会显示初始化.那么initPrice的默认初始化是在什么时候。final static Price INSTANCE =new Price(2.8);这句还没执行完,initPrice就该还没有读到,它怎么就有0这个初始值
回复 使用道具 举报
张 涛 发表于 2012-9-21 22:18
1.price类中,有一个常量INSTANCE ,类型是price,其属性值是2.8;
2.price中有一个静态变量initPrice,其 ...

第一个是 -2.8
回复 使用道具 举报
public class PriceTest {
/**
  * @param args
  */
public static void main(String[] args) {
  System.out.println(Price.INSTANCE.currentPrice);
  /*
   执行这条语句时:
   由于这条语句用到了Price这个类,所以会把Price类加载到内存,当一个类加载时,类中
   的静态成员也随之加载,并且先给INSTANCE默认初始化为0后,又显初始化new Price(2.8)
   在显示初始化时会时会执行这个构造函数,此时静态成员initPrice默认初始化为0,还没有
   显示初始化为20,因为要等到INSTANCE显示初始化完毕后,initPrice才会显示初始化,所以
   此时currentPrice的值为currentPrice=0-2.8;即为-2.8。此时INSTANCE已显示化完毕,
   然后静态成员initPrice才显示化为20了。
  */
  Price p=new Price(2.8);
  /*
  当在执行这条语句时,此时再调用public Price(double discount)构造函数时,
  已经是20-2.8了,所以第二语句执行后currentPrice才为17.2了。
  */
  System.out.println(p.currentPrice);
}
}
class Price
{
final static Price INSTANCE =new Price(2.8);
static double initPrice=20;
double currentPrice;
public Price(double discount)
{
  currentPrice=initPrice-discount;
}
}

以上标红色字迹是我为你写的程序执行步骤

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.price类中,有一个常量INSTANCE ,类型是price,其属性值是2.8;
2.price中有一个静态变量initPrice,其值是20;
3.构造方法price,传入的参数discount,属性得到的值是20-discount;

4.main方法中,new了一个price对象,传入的参数是2.8;那么实际属性得到的值是20-2.8=17.2;
5.main方法中,第一个打印的值是2.8,第二个打印的值是17.2
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马