从语法角度来讲程序可以在两个地方对类进行初始化
---定义类变量时指定初始值。
---静态初始化块中对类进行初始化。
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.
网友评论