java中初始化块&构造方法的区别以及执行顺序

区别

  • 初始化块是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最先执行,然后是依次执行非静态块,最后执行构造方法。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值