分类
在程序中可以通过大括号{}来形成代码块, 代码块分为普通代码块,静态代码块和构造代码块。
定义
普通代码块: 定义在方法体内部,按顺序在方法内部执行。
应用场景: 在方法中进行功能拆分时使用。
代码例子:
public void blockTest() {
{
System.out.println("我是普通代码块1的输出。");
}
System.out.println("我是方法中的其它代码输出。");
{
System.out.println("我是普通代码块2的输出。");
}
}
输出结果为:
输出结果显示普通代码块在方法中按顺序执行。
构造代码块: 构造代码块和普通代码块很像,构造代码块在类内定义,不能在方法内定义。构造代码块的执行在构造方法之前,在对象实例化时调用。按顺序执行,实例化一次执行一次。
应用场景: 类的每个对象在实例化时都要进行的功能。(PS : 在这种情境下和构造方法的区别是构造方法有可能在每次对象实例化时会选择无参构造方法或者带参构造方法,而构造代码块则会在每一次实例化是都执行一次,保证每个对象都执行了这个功能。)
代码例子:
System.out.println("我是构造代码块1的输出。");
}
public Test() {
System.out.println("我是构造方法的输出。");
}
{
System.out.println("我是构造代码块2的输出。");
}
输出结果为:
输出结果显示构造代码块的执行在构造方法之前按顺序执行。
静态代码块: 静态代码块就是在构造代码块的前面加一个static关键字,在类内定义,不能在方法中定义,可以定义多次。在类中按顺序执行,无论实例化多少次都只执行一次。
应用场景: 性能优化时使用,在项目整体启动时执行一次。
代码例子:
static{
System.out.println("我是静态代码块1的输出。");
}
{
System.out.println("我是构造代码块的输出。");
}
static{
System.out.println("我是静态代码块2的输出。");
}
输出结果为:
输出结果显示静态代码块在构造代码块之前按顺序执行。
普通代码块、构造代码块和静态代码块的优先级
静态代码块 > 构造代码块 > 普通代码块
普通代码块、构造代码块和静态代码块与成员变量的关系
普通代码块和构造代码块都可以调用静态和非静态的成员变量,但静态代码块只能直接调用静态成员,对于非静态成员只能在代码块的内部先实例化一个新的对象再通过对象名进行调用即可。
继承关系中的代码块加载顺序
父类静态代码块 -> 子类静态代码块 -> 父类构造代码块 -> 子类构造代码块