super只能在非静态上下文中使用,必须位于构造方法首行调用父类构造器,仅对被重写的实例方法或同名字段有意义,无法访问private成员或静态成员,且不能赋值或参与运行时判断。

子类用 super 调用父类成员,核心是“明确访问父类版本”,但不是所有情况都能用,也不是随便写就能生效。关键在于理解它的作用边界和编译器的硬性约束。
super 只能在非静态上下文中使用
它代表当前对象的父类视图,依赖实例存在。所以:
- 不能在 static 方法、static 块、static 字段初始化中出现——编译直接报错
-
不能在构造方法外的静态语境里写 super.xxx,哪怕只是读一个父类 static 字段也不行(要用
ParentClass.fieldName) - 普通实例方法和构造方法内才合法
调用父类构造方法必须是第一句
子类构造器里写 super(...) 不是可选项,而是初始化顺序的强制要求:
- 必须出现在构造方法体的第一行,否则编译失败:“call to super must be first statement”
- 没写时,编译器自动补
super(),但前提是父类有无参构造;否则必须显式写带参的super(参数) -
super()和this()互斥,同一构造器里只能选其一,且都得是首句
访问字段和方法要看是否被覆盖或隐藏
super 的作用不是“通用访问”,而是“绕过子类定义”:
- 调用
super.method()仅对被重写(override)的实例方法有意义;如果父类方法没被重写,直接调用即可,无需 super - 访问
super.field仅在子类声明了同名实例字段时才有区别;否则直接用字段名就指向父类那个 - 对 private 成员完全无效——子类根本看不见,super 也无能为力
- 静态方法不能用 super 调用,语法错误;得用
ParentClass.staticMethod()
别把 super 当成万能引用
它不是对象,也不能参与运行时判断:
-
super不能赋值给变量,不能做if (super == null)这类操作 - 它只在编译期起作用,用于定位父类中可访问的成员,不产生运行时开销
- 在父类构造方法还没执行完时,不要让子类逻辑(比如通过回调)去访问尚未初始化的父类状态
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











