静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
非静态代码块是在类new一个实例的时候执行,而且是每次new对象实例都会执行。
代码的执行顺序
- 主调类的静态代码块
- 对象父类的静态代码块
- 对象的静态代码块
- 对象父类的非静态代码块
- 对象父类的构造函数
- 对象的非静态代码块
- 对象的构造函数
public abstract class Animal {
static{
System.out.println("父类静态代码块");
}
{
System.out.println("父类非静态代码块");
}
public Animal(){
System.out.println("我是Animal的无参构造器");
}
}
public class Dog extends Animal{
static{
System.out.println("子类静态代码块");
}
{
System.out.println("子类非静态代码块");
}
public Dog(){
System.out.println("我是一只没有参数的狗");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
Dog dog2 = new Dog();
}
}
结果如下:
父类静态代码块
子类静态代码块
父类非静态代码块
我是Animal的无参构造器
子类非静态代码块
我是一只没有参数的狗
父类非静态代码块
我是Animal的无参构造器
子类非静态代码块
我是一只没有参数的狗