Parent.java
package book.oo.initorder;

public class Parent

...{
private int ix = 50;

private static int iz = getNext(30);

...{
System.out.println("Parent的初始化块");
int x = 100;
int y = 100; // getNext(100);
}
static

...{
System.out.println("Parent的静态初始化块");
int sx = 100;
int sy = getNext(100);
}

private int endall = 1;

public Parent()

...{
System.out.println("Parent的构造方法被调用");
}

public void display()

...{
System.out.println("Parent的display方法被调用");
System.out.print("ix=" + this.ix);
System.out.println("; iz=" + iz);
dispA();
}

public static void dispA()

...{
System.out.println("Parent的dispA()被调用");
}

public static int getNext(int base)

...{
System.out.println("Parent的getNext(int base)被调用");
return ++base;
}


/** *//**
* 当Java在进行垃圾回收时,会调用对象的finalize方法
*/
protected void finalize()

...{
System.out.println("Parent的销毁方法被调用");
}
}
package book.oo.initorder;

public class Child extends Parent

...{

...{
System.out.println("Child的初始化块");
int bx = 100;
}
static

...{
System.out.println("Child的静态初始化块");
}

public Child()

...{
super();
System.out.println("Child的构造方法被调用");
}

public static void dispB()

...{
System.out.println("Child的dispB()被调用");
}


/** *//**
* 当Java在进行垃圾回收时,会调用对象的finalize方法
*/
protected void finalize()

...{
System.out.println("Child的销毁方法被调用");
super.finalize();
}
}
package book.oo.initorder;

public static void main(String[] args)

...{
System.out.println("不new对象,访问静态方法时的输出:");
Child.dispB();

System.out.println();
System.out.println("new对象,访问非静态方法时的输出:");
new Child().display(); //通知虚拟机进行垃圾回收 System.gc();

}






























































Child.java








































ClassInitOrderTest.java














以上代码摘抄自 JAVA JDK实例宝典,但书中关于JAVA类的加载部分有误,但代码可用来作测试,了解类的加载顺序
当一个类或它的子类调用它的静态方法时,如上面的Child.dispB(),虚拟机会先初始化类的静态变量,静态初始化块,其初始化顺序按照变量和初始化块在程序中的位置来决定,依次按排在前面到后面的顺序初始化,初始化静态变量和静态初始化块的顺序没有先后之分,但不会初始化烊的静态方法.如Child.dispB()这样访问类的静态方法的时候,不会初始化类的初始化块,构造函数,普通变量等.
当一个类new一个对象时,会按先父类后子类的顺序初始化类的,静态变量,静态初始化块,普通变量,普通初始化块,构造函数等.