类初始化过程

Java要求在实例化类之前,必须先实例化其超类,以保证所创建实例的完整性。

这一点是在构造函数中保证的:Java强制要求Object对象(Object是Java的顶层对象,没有超类)之外的所有对象构造函数的第一条语句必须是调用超类构造函数的语句或者是调用类中定义的其他的构造函数,

正因为如此,Java才可以使得一个对象在初始化之前其所有的超类都被初始化完成,并保证创建一个完整的对象出来。

总而言之,实例化一个类的对象的过程是一个典型的递归过程,在准备实例化一个类的对象前,首先准备实例化该类的父类,如果该类的父类还有父类,那么准备实例化该类的父类的父类,依次递归直到递归到Object类。

在实例化每个类时,都遵循如下顺序:先依次执行实例变量初始化和实例代码块初始化,再执行构造函数初始化。也就是说,编译器会将实例变量初始化和实例代码块初始化相关代码放到类的构造函数中去,并且这些代码会被放在对超类构造函数的调用语句之后,构造函数本身的代码之前。

子类必须调用父类的构造函数(有参或无参),子类不写明调用哪一个,系统默认调用父类无参构造函数,但是父类只有一个有参构造函数的话,子类就要写明调用父类的有参构造函数!

初始化过程是这样的: 
1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 
2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 
3.其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法;
4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法;
原文地址:https://www.cnblogs.com/wskb/p/10956260.html