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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yp324 中级黑马   /  2013-5-5 19:19  /  2394 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yp324 于 2013-5-5 22:27 编辑

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

运行结果为什么不是两个17.2,求解释

4 个回复

倒序浏览
final static Price INSTANCE = new Price(2.8);
因为,经过static修饰的过的INSTANCE 对象只要类存在,这个对象就存在了,它存在后就会创建对象
就会调用相应的构造函数,故两个都是17.2

只要jvm虚拟机一进入main方法就会从上往下执行,
之后就加载price,加载他的时候,就会先初始化他的静态字段,或者其他的,之后才道
实例变量,也就是没有static修饰的变量,所以结果是17.2就不难理解了

创建对象就会调用构造函数,这个没问题吧?

希望可以帮到你
回复 使用道具 举报
不好意思啊!没搞清楚对象
回复 使用道具 举报
因为你的程序中当执行System.out.println(Price.INSTANCE.currentPrice);时程序会先跳到初始化INSTANCE的那一句,然后再利用构造方法初始化话变量,此时构造方法中initPrice的值还是0.0,所以会输出-2.8 ,如果你把initPrice的赋值语句放在INSTANCE赋值语句的前面,则答案就是17.2,
代码如下
  1. class Price{
  2.         static double initPrice = 20;//首先初始化initPrice的值
  3.          final static Price INSTANCE = new Price(2.8);
  4.          double currentPrice;
  5.          public Price(double discount){
  6.                  currentPrice = initPrice-discount;
  7.          }
  8. }
  9. class PriceTest{
  10.          public static void main(String arg[]){
  11.                  System.out.println(Price.INSTANCE.currentPrice);
  12.                  Price p = new Price(2.8);
  13.                  System.out.println(p.currentPrice);
  14.          }
  15. }
复制代码
回复 使用道具 举报
代码的顺序问题 要理解static和final的用法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马