类的初始化时机

从语法角度来讲程序可以在两个地方对类进行初始化
---定义类变量时指定初始值。
---静态初始化块中对类进行初始化。

class Person{
    final static Person I=new Person(2.8);
    static double initPrice=20;
    double currentPrice;
    public Person(double discount){
        currentPrice=initPrice-discount;
    }
}
class BianDemo{
    public static void main(String[] args) {
        System.out.println(Person.I.currentPrice);
        Person p=new Person(2.8);
        System.out.println(p.currentPrice);
    }
}

如果仅仅停留在代码表面看这个问题,很难得到正确结果,从内存角度来分析程序初始化分为两个阶段。
1.系统为Person的两个类变量分配内存空间。
2.按初始化代码的排列顺序对类执行初始化。
根据上面的描述,初始化第一阶段,系统先为I,initPrice进行分配内存,此时这两个类变量默认值为null,0.0.之后进行按初始化代码的排列顺序对类执行初始化,先为I进行初始化,赋值时需要调用Person(2.8),创建Person实例此时立即执行构造器对currentPrice进行赋值,此时initPrice的值为0,所以System.out.println(Person.I.currentPrice);的输出结果为-2.8.

你可能感兴趣的:(类的初始化时机)