必须用 super 而不是 new 父类对象,因为 super 作用于当前 this 对象,能正确访问继承链字段和父类逻辑;new 则创建无关新实例,无法共享子类状态。

子类重写父类方法后,想保留父类逻辑再扩展自己的行为,关键就是用 super 关键字——它不是可选项,而是最直接、最安全的调用方式。
为什么必须用 super 而不是 new 父类对象?
new 一个父类实例调用方法,创建的是全新对象,和当前子类实例无关,无法访问子类字段或共享状态。而 super 是编译期绑定的父类视角,作用在当前 this 对象上,能正确读取继承链中的字段和被重写前的方法逻辑。
- super 不是对象,是语法糖,代表“当前对象在父类视角下的行为”
- 不能在 static 方法中使用 super(没有 this,就没有父类视角)
- 构造器里调用 super() 必须是第一行,普通方法里 super.xxx() 可以出现在任意位置
super 调用的典型场景
不是所有重写都需要调父类方法,但以下情况几乎必用:
- 初始化增强:子类构造器中用 super() 先完成父类字段赋值,再设置子类特有属性
- 行为叠加:比如日志记录、权限校验、资源预处理——先执行父类基础逻辑,再追加子类动作
- toString / equals / hashCode 重写:避免完全丢弃父类字段信息,用 super.toString() 拼接后再补充子类字段
注意访问限制与编译检查
super 只能调用父类中允许被子类访问的方法(public/protected/同包默认),不能调 private 或 final 方法。如果误写,编译器会直接报错,不会静默失败。
- @Override 注解不是必需的,但强烈建议加上——它让编译器帮你检查签名是否真匹配父类方法
- 返回类型需兼容:子类方法返回类型可以是父类返回类型的子类型(协变返回),但 super 调用时仍按父类声明类型处理
- 重写方法里调 super.xxx() 和不调,完全是子类设计决定;但一旦调了,就该明确它是前置、后置还是包裹逻辑
别混淆 super 和多态调用
super.xxx() 是静态绑定,编译时就确定调父类版本;而 parentRef.method() 是动态绑定,运行时看实际对象类型。两者目的不同:
- super 用于“我作为子类,在当前对象上复用父类实现”
- 父类引用指向子类对象,是为接口统一、策略替换服务的,不是为了回退到父类逻辑











