1. 特点
- 静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面;
- 静态代码块内的变量都是局部变量,只在本块内有效;
- 静态代码块会在类被加载时自动执行,无论加载者是 JVM 还是其他类;
- 一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行;
- 静态代码块只能访问类的静态成员,不允许访问实例成员。
2. 静态块与构造块
- 静态块:用 static 申明,JVM 加载类时执行,仅执行一次;
- 构造块:类中直接用 {} 定义,每次创建对象时执行。
执行顺序:静态块 > main() > 构造块 > 构造方法
3. 类的加载顺序
- 父类静态成员变量和静态代码块
- 子类静态成员变量和静态代码块
- 父类非静态成员变量和非静态代码块
- 父类构造函数
- 子类非静态成员变量和非静态代码块
- 子类构造函数
静态成员变量和静态代码块级别相同,非静态成员变量和非静态代码块级别相同。
class Root {
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类普通代码块");
}
public Root() {
System.out.println("父类无参构造函数");
}
}
class Middle extends Root {
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类普通代码块");
}
public Middle() {
System.out.println("子类无参构造函数");
}
public Middle(String msg) {
System.out.println("子类带参数构造函数,参数值为:" + msg);
}
}
class Leaf extends Middle {
static {
System.out.println("孙类静态代码块");
}
{
System.out.println("孙类普通代码块");
}
public Leaf() {
super("来自" + Middle.class.getName());
System.out.println("孙类无参构造函数");
}
}
修订记录:
日期 | 版本号 | 作者 | 修订内容 | 备注 |
---|---|---|---|---|
2019-7-16 | 1.0 | moonspirit | 创建文档 |