区别
- 初始化块是java语言中的第四种成员(其他的为属性、方法和构造器),一个类中可以有多个初始化块,相同修饰符的初始化块的执行顺序为:前面定义的初始化块先执行,后面的后执行。
- Java构造函数,也叫构造方法,是java中一种特殊的函数,函数名与相同,无返回值,且只运行一次。一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。
执行顺序
如下所示,当创建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 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最先执行,然后是依次执行非静态块,最后执行构造方法。
还有一种情况,那就是有继承的情况。如果父类和子类都有静态初始化块和非静态初始化块,初始化一个子类的实例,应该是如何执行呢?顺序为:子类的静态初始化块、父类的静态初始化块、父类的非静态初始化块、父类的构造方法、子类的非静态初始化块、子类的构造方法。