类变量初始化时机

public class Price {
      final static Price INSTACE = new Price ( 2.8 ) ;
      static double initPrice = 20 ;
      double currentPrice ;
      public Price ( double discount ){
           //根据静态变量计算实例变量
           currentPrice = initPrice - discount ;
      }
}

public class PriceTest {
      public static void main ( String [] args ){
           //通过Price的INSTACE来访问currentPrice
           System . out . println ( Price . INSTACE . currentPrice ) ;
           //显示创建price实例
           Price price = new Price ( 2.8 ) ;
           //通过显示创建的price实例来访问currentPrice
           System . out . println ( price . currentPrice ) ;
      }
}

-2.8
17.2

代码结果解释:
        第一次用到Price类时,程序开始对Price类进行初始化,初始化分为以下两个阶段:
        (1)系统为Price的两个类变量分配内存空间。
        (2)按初始化代码(定义时指定初始值和初始化块中执行初始值)的排序顺序对类变量执行初始化。
        初始化第一阶段,系统先为INSTANCE、intiPrice两个类变量分配内存空间,此时INTSTANCE、initPrice的值为默认值为null和0.0。接着初始化进入第二个阶段,程序按顺序依次为INSTANCE、initPrice进行赋值。对 INSTANCE赋值时要调用Price(2.8),创建Price实例,此时立即执行程序中代码为currentPrice进行赋值,此时initPrice类变量的值为0。因此赋值的结果是currentPrice等于-2.8。接着,程序再次将initPrice赋为20,但此时对INSTANCE的currentPrice实例变量已经不起作用了。
        当Price类初始化完成后,INSTANCE类变量引用到一个 currentPrice为-2.8的Price实例,而 initPrice类变量的值为20.0。当再次创建Price实例时,该 Price实例的 currentPrice实例变量的值才等于20.0 - discount

猜你喜欢

转载自blog.csdn.net/zt_star/article/details/78401082