类的实例化顺序一般遵循以下规则:
- 父类静态代码块、静态变量的初始化。这些内容只会在类加载的时候执行一次,而且是在子类静态代码块、静态变量的初始化之前执行。
- 子类静态代码块、静态变量的初始化。这些内容只会在类加载的时候执行一次,并且是在父类静态代码块、静态变量的初始化之后执行。
- 父类实例变量的初始化,这些内容会在每次创建父类实例的时候执行,而且是在父类构造函数之前执行。
- 父类构造函数的执行。在执行父类构造函数之前,会先执行父类实例变量的初始化。
- 子类实例变量的初始化,这些内容会在每次创建子类实例的时候执行,而且是在子类构造函数之前执行。
- 子类构造函数的执行。在执行子类构造函数之前,会先执行子类实例变量的初始化。
需要注意的是,当创建一个类的实例时,它的静态代码块和静态变量的初始化只会在第一次创建实例的时候执行一次,之后再创建实例时不会再次执行。而实例变量的初始化和构造函数的执行是每次创建实例时都会执行的。
此外,还需要注意的是,如果子类继承了父类的构造函数,并且没有显式地调用父类构造函数,那么编译器会默认调用父类的无参构造函数。如果父类没有无参构造函数,那么子类必须显式地调用父类的有参构造函数。