java初始化块和构造方法的执行顺序

       初始化块是java语言中的第四种成员(其他的为属性、方法和构造器),一个类中可以有多个初始化块,相同修饰符的初始化块的执行顺序为:前面定义的初始化块先执行,后面的后执行。那初始化块和构造方法的执行顺序是怎么样的呢?答案是当创建java对象的时候,系统总是先调用该类里定义的初始化块,然后再调用构造方法。看下面这个简单的例子:

public class Person {
	{
		System.err.println("person first init block");
	}
	
	public Person(){
		System.err.println("person Constructor methed");
	}
	{
		System.err.println("person second init block");
	}
	
}

 在主方法中定义 一个Person类,程序输出结果为:

person first init block
person second init blok
person Constructor methed

         另一个问题,初始化块是可以有修饰符的,但是修饰符只能是static关键字,那如果初始化块加上static后,会有什么不同呢?如果按照我们定义静态变量的思维来想的话,是不是系统在加载该类的时候就执行静态初始化块呢?没错,就是这个样子的。把上面的程序改一下。

public class Person {
	{
		System.err.println("person first init block");
	}
	
	public Person(){
		System.err.println("person Constructor methed");
	}
	{
		System.err.println("person second init blok");
	}
	
	static{
		System.out.println("person static init block");
	}
	
	
}

 执行结果:

person static init block
person first init block
person second init blok
person Constructor methed

 很明显,系统在初始化类之前可定要先加载类,所以,static最先执行,然后是依次执行非静态块,最后执行构造方法。

       还有一种情况,那就是有继承的情况。如果父类和子类都有静态初始化块和非静态初始化块,初始化一个子类的实例,应该是如何执行呢?顺序为:子类的静态初始化块、父类的静态初始化块、父类的非静态初始化块、父类的构造方法、子类的非静态初始化块、子类的构造方法。

猜你喜欢

转载自deep-fish.iteye.com/blog/2218040