通过一个父类和子类代码来说明吧
public class ClassLoaderOrder {
public static void main(String[] args) {
/**
* 输出:
* 父类的静态方法2
* 我是父类静态初始化块
* 父类类的静态方法
* 在类被加载的时候,会先初始化类中静态成员变量 也就是t
* t调用了静态方法2 所以会先输出 "父类的静态方法2"
* 然后初始化类的静态代码块 "我是父类静态初始化块"
* 最后调用parentStaticMethod(),打印"父类类的静态方法"
*/
//Parent.parentStaticMethod();
/**
* 输出:
* 父类的静态方法2
* 我是父类静态初始化块
* 子类静态初始化块
*
* 我是父类非静态块
* 我是父类构造函数
*
* 子类的静态方法
* 子类非静态初始化块
* 子类的构造方法
*
* 子类被new时:
* 先初始化父类静态变量(按顺序)
* 初始化父类和子类的静态块
* 初始化父类非静态块,父类构造函数
* 子类静态变量
* 初始化子类非静态块,子类构造函数
*
*/
Child child = new Child();
}
}
class Parent {
public static int t = parentStaticMethod2();
static {
System.out.println("我是父类静态初始化块");
}
{
System.out.println("我是父类非静态块");
}
public Parent() {
System.out.println("我是父类构造函数");
}
public static int parentStaticMethod() {
System.out.println("父类类的静态方法");
return 10;
}
public static int parentStaticMethod2() {
System.out.println("父类的静态方法2");
return 9;
}
@Override
protected void finalize() throws Throwable{
super.finalize();
System.out.println("销毁父类");
}
}
class Child extends Parent {
public int i = childStaticMethod();
{
System.out.println("子类非静态初始化块");
}
static
{
System.out.println("子类静态初始化块");
}
public Child()
{
System.out.println("子类的构造方法");
}
public static int childStaticMethod()
{
System.out.println("子类的静态方法");
return 1000;
}
@Override
protected void finalize() throws Throwable{
// TODO Auto-generated method stub
super.finalize();
System.out.println("销毁子类");
}
}