例子如下:
public class TestCodeSeg {
static {
System.out.println("1");
}
{
System.out.println("2");
}
public TestCodeSeg() {
System.err.println("3");
}
public static void main(String[] args) {
new TestCodeSeg();
}
}
运行结果如下:
run:
1
3
2
成功生成(总时间:0 秒)
run:
1
2
3
成功生成(总时间:0 秒)
run:
3
1
2
成功生成(总时间:0 秒)
三种不同的运行结果说明它们的执行顺序是:
到目前为止能确定的一句话就是静态代码块比非静态代码块先执行。而构造函数的执行顺序不能确定,有可能在非静态代码块之后,有可能在它之前,也有可能在静态代码块之前执行。
再举例说明,如下所示:
public class Father {
//父类静态代码块
static {
System.out.println("父类---静态代码块");
}
//父类非静态代码块
{
System.out.println("父类===非静态代码块");
}
//父类构造函数
public Father() {
System.out.println("父类~~~构造函数");
}
//父类的main方法
/*public static void main(String args[]){
Father f=new Son();
}*/
}
class Son extends Father {
//static Son s=new Son();
//子类静态代码块
static {
System.out.println("子类---静态代码块");
}
//子类非静态代码块
{
System.out.println("子类===非静态代码块");
}
//子类构造函数
public Son(){
System.out.println("子类~~~构造函数");
}
//子类的main方法。
public static void main(String args[]){
Father f=new Son();
}
}
运行结果如下:
run:
父类---静态代码块
子类---静态代码块
父类===非静态代码块
父类~~~构造函数
子类===非静态代码块
子类~~~构造函数
成功生成(总时间:0 秒)
根据运行结果可知:
父类和子类的静态代码块先执行,其次是执行父类的非静态代码块和构造函数,最后执行的是子类的非静态代码块和构造函数。