Java继承中,父类成员变量初始化究竟在何时发生?

Java继承:深入探讨父类成员变量初始化顺序

本文探讨Java继承中父类成员变量的初始化时机,并纠正一些常见的误解。 《On Java》一书中提到“变量定义会在任何方法(包括构造器)调用之前被初始化”,但这与实际执行情况略有出入。

我们以一个CADSystem类继承Shape类的例子为例,深入分析其初始化过程。 关键在于,父类成员变量的初始化并非发生在子类构造器super()调用之前,而是插入到super()调用与子类构造器体之间

具体来说,CADSystem类的初始化过程如下:

  1. CADSystem构造器开始执行,调用super()
  2. 父类Shape的成员变量初始化,输出"Shape"。
  3. 子类Line(如果存在)的成员变量初始化

    输出"Shape"、"Line" (假设CADSystem继承了LineLine继承了Shape)。
  4. 子类CADSystem的成员变量初始化,输出"CADSystem"。

因此,实际的输出顺序为:

Shape
Shape
Line
CADSystem

之所以出现两次"Shape"输出,是因为父类Shape的初始化过程在子类构造器执行的过程中被穿插执行,而非完全在子类构造器之前。 这也说明了,书中关于变量初始化时机规则的描述需要更精确的理解。 实际执行顺序更准确地反映了Java的初始化机制。