什么是代码块?
- 在Java代码中被一组
{}
所括起来的代码称为代码块。 - 根据代码块位置的不同我们可以将其分为:局部代码块,构造代码块,静态代码块。
不同代码块有什么区别?
局部代码块 | 构造代码块 | 静态代码块 |
---|---|---|
定义在函数方法中的代码块 | 处于类中的方法之外 | 代码块前有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:
我是静态初始化代码块1x1中
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
我是构造方法