
Java继承:深入探讨父类成员变量初始化顺序
本文探讨Java继承中父类成员变量的初始化时机,并纠正一些常见的误解。 《On Java》一书中提到“变量定义会在任何方法(包括构造器)调用之前被初始化”,但这与实际执行情况略有出入。
我们以一个CADSystem类继承Shape类的例子为例,深入分析其初始化过程。 关键在于,父类成员变量的初始化并非发生在子类构造器super()调用之前,而是插入到super()调用与子类构造器体之间。
具体来说,CADSystem类的初始化过程如下:
立即学习“Java免费学习笔记(深入)”;
-
CADSystem构造器开始执行,调用super()。 -
父类
Shape的成员变量初始化,输出"Shape"。 -
子类
Line(如果存在)的成员变量初始化,输出"Shape"、"Line" (假设CADSystem继承了Line,Line继承了Shape)。 -
子类
CADSystem的成员变量初始化,输出"CADSystem"。
因此,实际的输出顺序为:
Shape Shape Line CADSystem
之所以出现两次"Shape"输出,是因为父类Shape的初始化过程在子类构造器执行的过程中被穿插执行,而非完全在子类构造器之前。 这也说明了,书中关于变量初始化时机规则的描述需要更精确的理解。 实际执行顺序更准确地反映了Java的初始化机制。










