类初始化和实例初始化

类初始化和实例初始化

用例代码

运行结果:

(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
(9)(3)(2)(9)(8)(7)

以上代码考察的知识点有三个:

  • 类的初始化过程

  • 实例初始化过程

  • 方法的重写

类的初始化过程

一个类要创建实例需要先加载并初始化该类

  • main 方法所在的类需要先加载和初始化,不管main方法是否有其他操作。

  • 一个子类要初始化需要先初始化父类

  • 一个类的初始化就是执行 <clinit>() 方法

    • <clinit>() 方法由静态类变量显示赋值代码静态代码块组成

    • 类变量显示赋值代码和静态代码块从上到下顺序执行

    • <clinit>() 方法只执行一次

结合用例分析

运行子类的main方法,先不管执行了什么,首先会加载该类,该类如有父类会先加载父类。

执行父类的<clinit>() 方法,该方法中执行一次,该方法的内容由静态类变量和静态代码块组成:

  • 静态实例变量赋值代码在前,被先执行,调用了 method() 方法,打印 (5)

  • 其次是静态代码块被执行,打印 (1)

父类加载完毕,加载子类的<clinit>() 方法:

  • 静态实例变量赋值代码在前,被先执行,打印 (10)

  • 接着静态代码块,打印 (6)

结果就是:(5)(1)(10)(6)

实例初始化过程

实例化初始化就是执行<init>()方法

  • <init>() 方法可能重载有多个,由几个构造器就有几个 <init> 方法

  • <init>() 方法由非静态实例变量赋值代码非静态代码块对应构造器代码组成

  • 非静态实例变量赋值代码和非静态代码块代码按顺序执行,对应的构造器总是最后执行

  • 每次创建实例对象,调用对应构造器,执行的就是对应的 <init> 方法

  • <init>() 方法首行是super()或super(参数列表),即对应父类的<init>() 方法

方法的重写

final静态方法private修饰的方法不可被重写

对象的多态性:

  • 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码

  • 非静态方法默认的调用对象是this

  • this对象在构造器或者说<init>方法中就是正在创建的对象

结合用例分析

main 方法的 Son s1 = new Son(); 被执行,类加载器开始执行 <init>()

  • <init>() 首行是 super(),于是执行父类的 <init>(),该方法由非静态实例变量赋值代码、非静态代码块、构造器组成

  • 非静态实例变量赋值代码 test() 在前先被执行,应该是打印 (4),但是因为多态的特性,子类重写了test(),init() 初始化方法中this指向的是正在创建的子类对象 Son,调用的正是子类的test()。所以打印 (9)

  • 然后是父类的非静态代码块被执行,打印 (3)

  • 最后是父类的指定构造器,子类调用的是无参构造器,所以父类的无参构造器先被调用,打印 (2)

父类的 <init>() 执行完毕,再执行子类的 <init>()

  • 子类 test() 又被执行了一次,打印 (9)

  • 子类的非静态代码块执行,打印 (8)

  • 最后构造器执行,打印 (7)

至此,第一行打印(空格为了区分类初始化和实例初始化):(5)(1)(10)(6) (9)(3)(2)(9)(8)(7)

main 方法又执行了一次子类对象,由于类的初始化<clinit>()只创建一次,所以(5)(1)(10)(6)不被打印,而(9)(3)(2)(9)(8)(7)又被执行了一次。

颠倒位置,再测试一遍

测试用例

  • 执行父类 <clinit>(),依次打印:类静态变量 (5)、类静态代码块 (1)

  • 执行子类 <clinit>(),依次打印:类静态代码块 (6)、类静态变量 (10)

  • 执行父类 <init>(),依次打印:非静态代码块 (3)、非静态实例变量(多态机制) (9)、构造器 (2)

  • 执行子类 <init>(),依次打印:非静态代码块 (8)、非静态实例变量 (9)、构造器 (7)

最终结果:

-- 空格为了区分类初始化和实例初始化 --
(5)(1)(6)(10) (3)(9)(2)(8)(9)(7)
(3)(9)(2)(8)(9)(7)

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×