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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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. }
复制代码

5 个回复

倒序浏览
你把    static double initPrie = 20;
这一句放在构造函数之前。
回复 使用道具 举报
因为    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-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 10:36
那为什么Price p = new Price(2.8)时,initPriest就已经赋值了呢?
而且当你把initPriest的静态属性删除 ...

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

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马