静态代码块、非静态代码块、构造函数的执行顺序


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里面静态变量与静态代码块是按代码先后顺序执行。所以就导致非静态代码块在静态代码块之前执行。 

你可能感兴趣的:(java,jvm,jni)