在初始化一个类时,到底是先执行哪一部分,总体的执行顺序是什么样的呢,同样,当类被释放时,又是怎样一个顺序呢?先来看下面的代码好了。

package net.moon.insignificant.commonclass;
class CommonSubClass extends CommonSupperClass {
static {
System.out.println("Common sub static initial");
}

public CommonSubClass() {
System.out.println("Common sub construct");
}

@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
System.out.println("Common sub finalize");
super.finalize();
}
}

abstract class CommonSupperClass {
public CommonSupperClass() {
System.out.println("Common super construct");
}

static {
System.out.println("Common supper static initial");
}

@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
System.out.println("Common supper finalize");
super.finalize();
}
}

public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
CommonSubClass css = new CommonSubClass();
css = null;
System.gc();
}
}


只要运行上面的代码,结果如下:
Common supper static initial
Common sub static initial
Common super construct
Common sub construct
Common sub finalize
Common supper finalize

其实大家已经清楚,在初始化时,执行的顺序是:
1. 父类的静态代码块
2. 子类的静态代码块
3. 父类的构造方法
4. 子类的构造方法

释放资料时,执行的顺序是:
1. 子类的finalize方法
2. 父类的finalize方法

只是这里一个意外是:竟然父类为抽象类时也同样会调用父类的构造方法,看来抽象类在虚拟机内部还是被实例化了。