super在构造函数中必须首行调用父类构造器,不可省略;在普通方法中用于访问被遮蔽的父类成员,不强制首行。super引用父类实例,this引用当前实例,二者不可共存于同一构造方法。

super在构造函数中的用法:必须首行,且不可省略逻辑
在子类构造函数中,super() 或 super(参数) 的作用是显式调用父类构造器。它不是可选的“锦上添花”,而是初始化链条的关键一环。Java 规定:每个子类构造方法执行前,必须完成父类部分的初始化。若父类只有有参构造、没有无参构造,而子类又没写 super(参数),编译直接报错。
关键规则:
- 必须出现在子类构造方法的第一行,否则编译失败
- 若未显式写出,编译器自动插入 super()(即调用父类无参构造)
- 一旦写了 this(...),就不能再写 super(...),二者互斥
- 不能在 static 方法、静态代码块或普通方法中使用 super(...)
super在普通方法中的用法:精准访问被遮蔽的父类成员
当子类定义了与父类同名的字段或重写了父类方法时,直接使用变量名或方法名默认指向子类自身。此时 super.字段 或 super.方法() 就成了唯一能明确“越过子类、直达父类”的语法通道。
典型场景包括:
- 子类和父类都有
name字段 →super.name拿到父类值 - 子类重写了
toString(),但仍需复用父类逻辑 →super.toString()调用原始实现 - 父类方法含通用校验逻辑,子类扩展业务 → 先
super.validate(),再加自定义检查
注意:super 在方法中不强制首行,也不限制位置;它只是引用,不是调用动作本身。
super 与 this 的核心分界点
super 和 this 表面相似,本质完全不同:
- super 是对父类对象空间的引用,只在继承关系中有效;this 是对当前对象自身的引用,任何非静态上下文都可用
- super.方法() 和 this.方法() 可能执行不同版本(尤其涉及重写时),前者强制走父类实现
- super(...) 和 this(...) 都只能用于构造方法首行,但前者跳转到父类,后者跳转到本类其他构造器
- 二者不能共存于同一构造方法——因为 this(...) 内部仍会隐含调用 super(...),重复调用无意义且违反语义
常见误区与调试提示
实际编码中容易踩坑的地方:
- 误以为
super.name总是“安全读取”——若父类字段是private,即使加 super 也编译失败(可见性优先于 super) - 在子类静态方法里写
super.xxx→ 编译报错,static 环境无“当前对象”也无“父类对象实例” - 调用
super.method()时,该方法在父类中为final或private→ 语法合法但运行时可能受限(private方法根本不可见) - 父类构造器抛异常,而子类没处理 → 异常沿构造链向上抛出,可能导致 new 对象失败却不明显

















