1. 初始化块(代码块)的作用

对 Java 对象进行初始化。

2. 程序的执行顺序

  1. 声明成员变量的默认值;
  2. 显式初始化,多个初始化块被一次执行(先static代码块后普通代码块,同级别下按先后顺序执行)。
  3. 构造器再对成员进行赋值操作。

3. 非静态代码块和静态代码块

3.1. 非静态代码块

非静态代码块没有 static 修饰。

1
2
3
{
// statements
}
  1. 可以有输出语句;
  2. 可以对类的静态和非静态属性声明进行初始化操作;
  3. 可以调用静态和非静态的属性或方法;
  4. 若有多个非静态的代码块,按照从上到下的顺序依次执行;
  5. 每次创建对象,都会执行一次;
  6. 先于构造器执行。

3.2. 静态代码块

静态代码块有 static 修饰。

1
2
3
static {
// statements
}
  1. 可以有输出语句;
  2. 可以对类的静态属性声明进行初始化操作;
  3. 可以调用静态的属性或方法;
  4. 多有多个静态代码块,按照从上到下的顺序依次执行;
  5. 静态代码块只执行一次;
  6. 先于非静态代码块执行。
  7. static 代码块多用于对 static 属性进行初始化。

4. 匿名内部类

1
2
3
4
5
6
7
8
9
// public class Person {
// public void test () { ... }
// }
Person p = new Person() { // 构建了一个没有类名的 Person 子类
@Override
public void test() { ... } // 重写父类 Person 的 test() 方法
}
// 这种没有类名的类,不能显式的用 new 创建对象,也没有构造器
// 就要用到代码块来初始化其中的属性