super是编译期指令,用于定位父类成员:构造方法中必须首行调用super()确保父类初始化;访问被遮蔽字段用super.field;重写方法中用super.method()扩展逻辑;不可在static方法或非构造/实例上下文中使用。

super 关键字不是“调用父类对象”,而是告诉编译器:请定位到当前类继承链中父类的对应成员。它不创建新对象,也不代表某个实例引用,只是一条编译期指令。
调用父类构造方法:必须首行、不可省略
子类每个构造方法都必须确保父类完成初始化。规则很明确:
- 若父类有无参构造器,且子类没写任何 super() 或 this(),编译器自动插入 super()
- 若父类只有带参构造器,子类构造方法第一句必须是 super(匹配参数),否则编译失败
- super() 和 this() 不能共存于同一个构造方法中,二者都必须是首句
- 哪怕只是想打印一行日志,也不能放在 super() 前面,否则报错 “call to super must be first statement”
访问被遮蔽的父类字段:解决同名变量冲突
当子类定义了和父类同名的实例变量(比如都叫 value),子类的字段会遮蔽(shadow)父类字段——注意这不是重写,而是静态绑定。此时:
- 直接写 value 或 this.value,访问的是子类字段
- 写 super.value,才能拿到父类原始值
- 该方式对 static 字段也有效,但更推荐用 ParentClass.STATIC_FIELD 提高可读性
- 无法通过 super 访问父类 private 字段,只能依赖 public/protected getter
调用被重写的父类方法:实现逻辑扩展
子类重写 toString()、equals()、onCreate() 等方法时,常需保留父类行为再追加处理。这时 super.方法名() 是标准做法:
- super.toString() + ", id=" + id 是典型组合写法
- 在生命周期方法中,先 super.onResume() 再执行自定义逻辑,保证基础流程不被跳过
- 不能在 static 方法里使用 super 调用实例方法,会触发编译错误
- 避免硬编码写法如 Parent.method(this),它绕过继承链,破坏多态与 MRO 协作
常见误区与边界提醒
super 的使用有严格上下文限制,容易踩坑:
- super 不是对象,不能赋值给变量,也不能做 super == null 判断
- super() 只能在构造方法中用;super.xxx 只能在实例方法或构造方法中用
- 在 Kotlin 中,多重继承或接口冲突时需用 super
.method() 明确指定目标 - Python 中 super() 是按 MRO 动态查找,不是固定调父类,漏掉 super().__init__() 可能导致属性未初始化而后续报 AttributeError










