Java继承中调用super()是否会创建父类实例?
关于Java继承中构造器调用与实例创建的问题解答
你的理解完全正确:继承场景下只会创建一个子类实例,不会单独生成父类实例,下面拆解关键细节:
构造链的本质:初始化而非创建对象
子类构造器中调用super()(无论显式还是隐式),核心作用是初始化当前实例中属于父类的属性与逻辑,而非创建新对象。整个构造链(从Object到父类再到子类)的执行,都是在同一块内存空间上完成的——它会一步步把实例的各个组成部分(父类成员、子类成员)初始化完毕,最终得到一个完整的子类实例。
JVM如何区分new与super()调用?
new是对象创建的唯一入口:当执行new SubClass()时,JVM首先在堆内存中分配一块足够容纳子类所有属性(包括继承自父类的所有成员)的空间,这一步才是真正的“创建对象”。之后才会触发构造链的调用,完成初始化。super()仅触发构造器逻辑执行:它只是构造器之间的调用跳转,不会触发新的内存分配。调用super()时,JVM会在已分配的那块内存上,执行父类构造器中的代码(比如给父类成员变量赋值、执行实例初始化块等),仅此而已。
和类加载的区别
类加载是把类的字节码加载到JVM内存、生成Class对象的过程,这个过程在首次使用类时触发(比如第一次new该类、访问静态成员等),属于类层面的操作,和对象实例的创建完全无关。而对象创建是在堆上分配内存+构造链初始化的过程,是实例层面的操作,二者是先后独立的两个阶段。
代码示例验证
class Parent { private String parentField; public Parent() { this.parentField = "父类属性初始化"; System.out.println("父类构造器被调用"); } } class Child extends Parent { private String childField; public Child() { // 隐式调用super() this.childField = "子类属性初始化"; System.out.println("子类构造器被调用"); } } public class TestInstance { public static void main(String[] args) { Child child = new Child(); // 输出顺序:父类构造器被调用 → 子类构造器被调用 // 验证实例唯一性 System.out.println(child instanceof Parent); // true System.out.println(child instanceof Child); // true // 该实例同时拥有父类和子类的属性,符合IS-A关系 } }
内容的提问来源于stack exchange,提问作者Always_Beginner
相关产品推荐
相关产品推荐

