静态初始化块与非静态初始化块
初始化块块分为静态初始化块与非静态初始化块,用 static 修饰的就是静态初始化块也称为类初始化块,没有用 static 修饰的代码块就是非静态初始化块也称为实例初始化块。
静态初始化块只会在类初始化的时候调用一次,而非静态初始化块则在每次类实例化的时候都会调用一次。
子类的第一次实例化的时候会先调用父类的静态初始化块,如果父类上面还有父类,则依次类推,最先调用的肯定是最大的父类的静态初始化块。等所有的静态代码块调用完成后,再调用父类的非静态初始化块,而后是子类的非静态初始化块。
初始化块虽然是类的成员之一,类成员有(成员变量、方法、构造器、初始化块),但它没有名字,也就没有标识,但是它并不能被类或者实例来调用,实例初始化块只在创建 JAVA 对象的隐式的执行,而且在构造器之前自动执行,而类初始化块则在类初始化的阶段自动执行。
我们通过简单的例子来说明一下
public class Animal {static {System.out.println("父类静态初始化块");}{System.out.println("父类实例初始化块");}public Animal(){System.out.println("父类构造器");}}public 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();}
}