- 静态代码块和静态变量在使用到该类时就会初始化,要早于对象的初始化
- 静态变量和静态代码块执行的顺序取决于它们在代码中的顺序
- 普通代码块只有在创建对象时会执行,并且执行顺序优先于构造方法
- 执行顺序:静态代码块和静态变量 -> 普通代码块 -> 构造方法
public class Parent {
static String name = "parent";
static {
System.out.println("Parent静态代码块,name=" + name);
}
Parent() {
System.out.println("Parent构造方法");
}
{
System.out.println("Parent普通代码块");
}
public static void main(String[] args) {
Parent parent = new Parent();
}
}
运行结果:
>>Parent静态代码块,name=parent
>>Parent普通代码块
>>Parent构造方法
在上面示例中,如果变量name的定义在static{}代码块下面,则编译就会报错,这也侧面证明了静态变量和静态代码块是根据代码中的位置来决定初始化顺序的
子类和父类中静态变量、静态代码块、普通代码块、构造方法的执行顺序:
- -> 父类静态代码块/静态变量
- -> 子类静态代码块/静态变量
- -> 父类普通代码块
- -> 父类构造方法
- -> 子类普通代码块
- -> 子类构造方法
public class Parent {
static String name = "parent";
static {
System.out.println("Parent静态代码块,name=" + name);
}
Parent() {
System.out.println("Parent构造方法");
}
{
System.out.println("Parent普通代码块");
}
static class Child extends Parent{
static String name = "child";
static {
System.out.println("Child静态代码块,name=" + name);
}
Child() {
System.out.println("Child构造方法");
}
{
System.out.println("Child普通代码块");
}
}
public static void main(String[] args) {
Child child = new Child();
}
}
运行结果:
>>Parent静态代码块,name=parent
>>Child静态代码块,name=child
>>Parent普通代码块
>>Parent构造方法
>>Child普通代码块
>>Child构造方法