static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
public static void main(String[] args){
System.out.println(
"Creating new Cupboard() in main");
new Cupboard();
System.out.println(
"Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
}
} 在ThinkTest 类中的main程序入口 因为t2声明称静态的变量所以先执行的是static修饰的变量 并且按照程序代码的先后顺序,所以先new Table();
进入Table类之后 一样的先是执行static修饰的变量或者代码块,然后再执行构造方法。
public class Table {
static Bowl b1 = new Bowl(1);
Table() {
System.out.println("Table()");
b2.f(1);
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
static Bowl b2 = new Bowl(2);
}
public class Cupboard {
Bowl bowl = new Bowl(3);
static Bowl b4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
b4.f(2);
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
static Bowl b5 = new Bowl(5);
}
public class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
根据上面测试之后总结得出 当一个类实例化时,首先是去执行这个类里面的static修饰的变量或者代码块(按顺序执行),然后执行没有被static修饰的代码块,最后才是执行构造方法。
父类静态块 --> 子类静态块 --> 父类自由块 --> 父类构造函数块 --> 子类自由块 --> 子类构造函数块