class="java" name="code">
public class ExA {
	static {
		System.out.println("父类--静态代码块");
	}
	public ExA() {
		System.out.println("父类--构造函数");
	}
	{
		System.out.println("父类--非静态代码块");
	}
	public static void main(String[] args) {
		new ExB();
	}
}
class ExB extends ExA {
	static {
		System.out.println("子类--静态代码块");
	}
	{
		System.out.println("子类--非静态代码块");
	}
	public ExB() {
		System.out.println("子类--构造函数");
	}
}
执行结果  
=====  
父类--静态代码块  
子类--静态代码块  
父类--非静态代码块  
父类--构造函数  
子类--非静态代码块  
子类--构造函数  
可是静态代码块真的会一定在非静态代码块之前执行吗?  
下面这段代码 
public class ExA {
	private static ExA a = new ExA();
	static {
		System.out.println("父类--静态代码块");
	}
	public ExA() {
		System.out.println("父类--构造函数");
	}
	{
		System.out.println("父类--非静态代码块");
	}
	public static void main(String[] args) {
		new ExB();
	}
}
class ExB extends ExA {
	private static ExB b = new ExB();
	static {
		System.out.println("子类--静态代码块");
	}
	{
		System.out.println("子类--非静态代码块");
	}
	public ExB() {
		System.out.println("子类--构造函数");
	}
}
执行结果 
=====  
父类--非静态代码块  
父类--构造函数  
父类--静态代码块  
父类--非静态代码块  
父类--构造函数  
子类--非静态代码块  
子类--构造函数  
子类--静态代码块  
父类--非静态代码块  
父类--构造函数  
子类--非静态代码块  
子类--构造函数  
=====  
可以发现非静态代码块并不是一定在静态代码块之后执行的。  
我认为此时private static ExA a = new ExA()是静态变量。而java里面静态变量与静态代码块是按代码先后顺序执行。所以就导致非静态代码块在静态代码块之前执行。