Java继承中super()疑问:子类对象是否继承父类对象?
关于Java继承中父类对象的误区解析
嘿,这个问题其实戳中了Java继承里很容易混淆的点——很多人都会误以为子类对象是“套”了一个独立的父类对象,但实际情况不是这样的,咱们一步步拆解清楚:
核心结论:子类对象并没有继承一个独立的父类对象
当你执行B b = new B();时,JVM不会创建一个单独的父类A对象。super()(不管是显式还是隐式调用)的作用是初始化子类对象中属于父类的那部分状态和属性,而不是生成一个全新的父类实例。
用你的代码例子具体说明
假设你的子类是CompCalculator(补全你没写完的代码),完整代码如下:
class HumanCalculator { String madeBy; HumanCalculator(String madeBy){ this.madeBy = madeBy; } } class CompCalculator extends HumanCalculator { int softwareVersion; // 子类构造器必须调用父类构造器 CompCalculator(String madeBy, int version) { super(madeBy); // 这里不是创建HumanCalculator对象,而是初始化当前子类对象里的madeBy字段 this.softwareVersion = version; } }
当你创建子类对象时:
CompCalculator calc = new CompCalculator("jwkoo", 1);
此时内存中只有一个CompCalculator对象,它的内存空间里同时包含了父类的madeBy字段和子类自己的softwareVersion字段。super(madeBy)只是把madeBy的值赋值给这个子类对象里的父类字段,完全没有生成独立的HumanCalculator实例。
为什么会有“创建父类对象”的误解?
这是因为Java的构造器调用链:创建子类对象时,会先调用父类构造器,再执行子类构造器。但这个过程只是初始化顺序的问题——先把父类定义的属性初始化好,再处理子类自己的属性,全程都是在同一个对象的内存空间里操作,没有新对象生成。
一句话总结
Java的继承是子类继承父类的属性和方法定义,子类对象会包含父类的状态,但不存在“子类对象继承了一个父类对象”的情况,整个过程只有一个子类实例,super()只是负责初始化这个实例里的父类部分。
内容的提问来源于stack exchange,提问作者jwkoo
相关产品推荐
相关产品推荐

