1、考点
①类的初始化过程
②实例初始化过程
③方法的重写
2、类初始化过程
①一个类要实例化必须初始化该类,main方法所在的类需要先加载和初始化。
②一个子类要初始化首先先初始化父类
③一个类初始化就是执行虚拟机中的<clinit>()方法,<clinit>()方法是类字节码初始化的方法。<clinit>()方法由静态变量赋值代码和静态代码块组成。类变量赋值代码和静态代码块从上到下依次执行。<clinit>()方法只执行一次。
分析:
子类初始化之前首先需要父类进行初始化。执行顺序是
先初始化父类;再初始化子类。
先执行父类的静态方法,静态代码块。这两个哪个在前面执行哪一个。
父类初始化:
(1)j = method()
(2)父类的静态代码块
子类初始化:
(1)j = method()
(2)子类的静态代码块
父类、子类的初始化输出的结果是:(5)(1)(10)(6)
3、实例初始化过程
实例初始化过程其实是在执行虚拟机中的<init>()方法。
<init>()方法可以重载多个,有几个构造器就会有几个<init>()方法。初始化方法由非静态实例变量复试代码和非静态代码块和构造器组成
非静态实例变量赋值代码、非静态代码块按照顺序执行(从上往下),而对应的构造器代码块最后执行。
每次创建实例对象,调用对应的构造器,都会执行对应的<init>方法。<init>方法首行是super()或者是super()参数列表,对应父类的<init>方法
注意:
每次初始化子类实例化的时候,子类的super()放在了最前面,super()就会先调用父类的实例化方法。实例化执行顺序还是,子类实例化中的super方法(调用父类实例化方法),然后再执行子类的实例化方法。
父类实例初始化:
(1)super()【最前执行】
(2)i = test()
非静态方法前面有一个this关键字,this代表当前正在创建的对象。因为是创建Son对象,父类中的test其实是子类重写的代码。
(3)父类非静态代码块
(4)父类无参构造【最后执行】
子类实例初始化:
(1)super()【最前执行】
(2)i = test()
(3)子类非静态代码块
(4)子类无参构造【最后执行】
注意:子类的super先调用父类的方法。所以结果为:(9)(3)(2)(9)(8)(7)
4、方法的重写Override
①首先明确,哪些方法方法不能被重写:
final修饰;静态方法;private等子类不可见的方法
②对象的多态性
子类如果重写了父类的方法,当调用该方法的时候,调用的对象一定是子类重写过的代码。非静态方法默认调用的对象是this,this对象在构造器或者<init>方法中是正在创建的对象。
5、总结
执行顺序:
① 首先是类的初始化
父类先初始化,子类再初始化。
无论是父类还是子类,静态方法或者静态方法的赋值代码,静态代码块。顺序是从上到下。
② 再次是类的实例初始化
(1)super()【最前执行】,执行的是父类中的非静态方法,非静态代码块,如果有重写的方法,执行子类的重写方法。
(2)i = test()
(3)子类非静态代码块
(4)子类无参构造【最后执行】