You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:38:26