**
Java中的初始化块和静态初始化块
**
Java中三种初始化数据与的方法:
- 在构造器中设置值
- 在声明中赋值
- 初始化块(initialization block)
这里主要讨论的第三种机制——初始化块。在一个类的声明中,可以包含多个代码块,并且只要构造类的对象,这些块就会被执行。
class Employee{
private static int nextId;
private String name ;
private double salary;
private int id;
//初始化块
{
id = nextId;
nextId++;
}
//构造方法
public Employee(String name, double salary){
this.name = name;
this.salary = salary;
}
}
在上面这个代码示例中,id域将在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主体部分。
与初始化块相对于的,Java中还存在着静态初始化块。例:
class Employee{
private static int nextId;
private String name = "";
private double salary;
private int id;
//静态初始化块
static{
Random generator = new Random();
nextId = generator.nextInt(1000);
}
...
...
}
这里的静态初始化块起到一个初始化静态域nextId的作用,但是与非静态初始化块不同的地方在于:
- 静态初始化块仅在类第一次被加载时执行,后面不再执行;而非静态初始化块,在每次构造类的对象时,都会执行一次。
- 静态初始化块的执行顺序是优先于非静态初始化块的。(PS.它们二者的执行顺序都优先于构造方法,详情可参见《Java核心技术 卷I》的4.6节)