Java --- 初始化块
初始化块和构造器的功能很相似,都可以对Java对象进行初始化操作,从而使Java对象的信息更加完整。
一个类里可以有多个初始化块,初始化块是按照定义的先后顺序执行,(尽量使用一个初始化块,初始化块是隐式执行且全部执行,合并成一个初始化块可以使代码更简洁可读性更强,便于更改)其语法格式如下:
[修饰符] {
// 初始化块的可执行代码
...
}
建立Java对象的时候系统总是先调用该类里定义的初始化块,在构造器之前执行。
与构造器相似,创建一个Java对象时,不仅会执行该类的的初始化块和构造器,而且系统会一直上溯到java.llang.Object类,依次向下执行其父类的初始化块、构造器。
初始化块的修饰符只能是static,使用static修饰的初始化块被称为静态初始化块,初始化块里能够写入任何可执行语句。静态初始化块是与类相关的,在类初始化的阶段就执行静态初始化块,而不是在创建对象的时候才执行。下面我们来看一个程序:
package JustSomeNEWTry;
public class javaP161 {
{
System.out.println("顶层父类的普通初始化块");
}
static {
System.out.println("顶层父类的静态初始化块");
}
public javaP161() {
System.out.println("顶层父类的无参构造函数");
}
}
class subjavaP161 extends javaP161 {
{
System.out.println("subjavaP161的普通初始化块");
}
static {
System.out.println("subjavaP161的静态初始化块");
}
public subjavaP161() {
System.out.println("subjavaP161的无参构造函数");
}
}
class subjava extends subjavaP161 {
{
System.out.println("subjava的普通初始化块");
}
static {
System.out.println("subjava的静态初始化块");
}
public subjava() {
System.out.println("subjava的无参构造函数");
}
public static void main(String[] args) {
new subjava();
}
}
执行结果:
前三条语句(类初始化阶段):
先执行顶层父类的静态初始化块,然后依次向下执行直到当前所调用的类的静态初始化块。
余下语句(对象初始化阶段):
先执行顶层父类的普通初始化块和构造器,然后依次向下执行普通初始化块(先)和构造器(后),直到当前所调用的类。
总结:
- 初始化块在构造器之前执行。
- 静态初始化块在普通初始化之前(类初始化阶段)执行。
- 创建Java对象时,初始化块和构造器一样会上溯到顶层执行。
参考书籍《疯狂Java讲义》