Java中代码块及初始化详解

什么是代码块?

  1. 在Java代码中被一组{}所括起来的代码称为代码块。
  2. 根据代码块位置的不同我们可以将其分为:局部代码块构造代码块静态代码块

不同代码块有什么区别?

局部代码块构造代码块静态代码块
定义在函数方法中的代码块处于类中的方法之外代码块前有static关键字修饰
在方法中被加载在进行对象创建的过程中被加载,优先于对象的构造方法随着类的加载而加载,优先于构造代码块执行,且只执行一次
随着方法的运行而运行每创建一个实例对象都会执行一次在第一次运行时会首先存放在方法区的静态常量池里,所以先打印出来,在创建第二个实例对象时将不再执行

各代码块的执行顺序

静态代码块 − > -> > 构造代码块 − > -> > 构造方法

如果该类存在父类,则还需要考虑继承情况下的初始化顺序:父类静态块 − > -> > 子类静态块 − > -> > 父类非静态块 − > -> > 子类非静态块

相同类型的代码块按照代码的先后顺序执行,静态变量和静态代码块的执行也是按照顺序进行

代码测试

创建一个Person类,包含一个无参构造方法两个构造代码块两个静态代码块,静态块中间放置一个静态成员变量并进行实例化,通过创建Person对象来观察代码块的执行顺序。

public class Person{
	public int age;
	public String name;
	public Person() {
		System.out.println("我是构造方法");
	}
	{
		System.out.println("我是初始化代码块1");
	}
	{
		System.out.println("我是初始化代码块2");
	}
	static {
		System.out.println("我是静态初始化代码块1");
	}
	private static Person x = new Person();
	static {
		System.out.println("我是静态初始化代码块2");
	}
}
public static void main(String[] args){
	Person x1 = new Person();
	Person x2 = new Person();
    Person x3 = new Person();
}

输出结果分析

x1:
我是静态初始化代码块1

x1中private static Person x = new Person()执行
我是初始化代码块1
我是初始化代码块2
我是构造方法
在Person类中生成静态变量x的时候,new Person()已经属于第二次创建实例对象,因此不会再触发static初始化代码块,因此会先执行:我是初始化代码块,然后执行:我是初始化代码块2,最后:我是构造方法,这一段执行完毕后,第一次实例化的对象代码会继续运行,完成最后一个static的运行

x1:
我是静态初始化代码块2
我是初始化代码块1
我是初始化代码块2
我是构造方法

x2:
我是初始化代码块1
我是初始化代码块2
我是构造方法

x3:
我是初始化代码块1
我是初始化代码块2
我是构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值