非靜態執行個體初始化,靜態執行個體初始化
Java中也有被稱為執行個體初始化的類似文法,用來初始化每一個對象的非靜態變數。例如:
//: initialization/Mugs.java
// Java "Instance Initialization."
class Mug {
Mug(int marker) {
System.out.println("Mug(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
public class Mugs {
Mug mug1;
Mug mug2;
{
mug1 = new Mug(1);
mug2 = new Mug(2);
System.out.println("mug1 & mug2 initialized");
}
Mugs() {
System.out.println("Mugs()");
}
Mugs(int i) {
System.out.println("Mugs(int)");
}
publis static void main(String[] args) {
System.out.println("Inside main()");
new Mugs();
System.out.println("new Mugs() completed");
new Mugs(1);
System.out.println("new Mugs(1) completed");
}
} /* Output:
Mug(1)
Mug(2)
mug1 & mug2 initialized
Mugs()
new Mugs() completed
Mug(1)
Mug(2)
mug1 & mug2 initialized
Mugs(int)
new Mugs(1) completed
*///:~
這裡面的執行個體初始化子句:
{
mug1 = new Mug(1);
mug2 = new Mug(2);
System.out.println("mug1 & mug2 initialized");
}
看起來它與靜態初始化子句一模一樣,只不過少了static關鍵字,這種文法對於支援“匿名內部類”的初始化是必須的,但是它也使得你可以保證無論調用了哪個顯示構造器,某些操作都會發生。從輸出中可以看到執行個體初始化子句事在兩個構造器之前執行的。