黑马程序员技术交流社区

标题: 为什么这个程序的输出结果不一样 [打印本页]

作者: 嘎路的米    时间: 2015-7-7 10:03
标题: 为什么这个程序的输出结果不一样
  1. public class PriceTest {
  2.     public static void main(String[] args) {
  3.         //输出位置1   
  4.         System.out.println(Price.INSTANCE.currentPrice);//-2.8
  5.         Price p = new Price(2.8);
  6.         //输出位置2
  7.         System.out.println(p.currentPrice);//17.2
  8.     }
  9. }
  10. class Price {
  11.     public Price(double discount) {
  12.         currentPrice = initPrie - discount;
  13.     }
  14.    
  15.     static final Price INSTANCE = new Price(2.8);
  16.    
  17.     static double initPrie = 20;

  18.     double currentPrice;
  19. }
复制代码

作者: 孙嘉亮    时间: 2015-7-7 13:09
你把    static double initPrie = 20;
这一句放在构造函数之前。
作者: 孙嘉亮    时间: 2015-7-7 13:18
因为    static final Price INSTANCE = new Price(2.8);
比    static double initPrie = 20;
先执行。
    static final Price INSTANCE = new Price(2.8);时就创建Price(2,8)对象,此时initPriest还未赋值。



作者: 嘎路的米    时间: 2015-7-8 10:36
孙嘉亮 发表于 2015-7-7 13:18
因为    static final Price INSTANCE = new Price(2.8);
比    static double initPrie = 20;
先执行。

那为什么Price p = new Price(2.8)时,initPriest就已经赋值了呢?
而且当你把initPriest的静态属性删除,得到的结果就是一样的了,这又是为什么呢?
作者: 孙嘉亮    时间: 2015-7-8 13:39
嘎路的米 发表于 2015-7-8 10:36
那为什么Price p = new Price(2.8)时,initPriest就已经赋值了呢?
而且当你把initPriest的静态属性删除 ...

因为static 会在程序运行前先加载。
所以在程序开始运行前。
static final Price INSTANCE = new Price(2.8);
   
    static double initPrie = 20;
这两句会最先执行。
作者: zhhrai    时间: 2015-7-8 13:55
我也是刚学.我的理解是:
静态变量会按照声明的顺序加载.
上一个还没有初始化完毕,怎么可能访问到下一个呢?
如果不加static,却可以,是因为你在初始化上一个静态变量的过程中建了对象,初始化了initPrie.






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2