在Java中正确调用父类方法需分两种情况:1.构造方法中必须首行显式调用super(...),否则默认super();2.重写方法中用super.方法名()调用父类被覆盖版本,仅限非静态、可访问(public/protected/包内默认)的虚方法。

在 Java 中正确调用父类方法,关键在于理解 super 关键字的使用场景和限制,并区分“构造方法调用”与“普通方法调用”两种情况。
构造方法中必须显式调用父类构造器
子类构造方法默认第一行会隐式调用 super()(无参父类构造器)。如果父类没有无参构造器,就必须手动写 super(...) 并传入对应参数,且必须放在子类构造方法的第一行。
- 不写
super(...)且父类无无参构造器 → 编译报错 -
super(...)必须是子类构造方法的第一条语句 - 不能在构造方法中同时调用
this(...)和super(...)
重写方法中用 super 调用被覆盖的父类版本
当子类重写了父类方法,又需要在子类实现中复用父类逻辑时,用 super.方法名(...) 显式调用父类方法体。这常见于模板方法、日志增强、参数预处理等场景。
- 只能在子类非静态方法中使用
super.方法名() - 不能在 static 方法中使用
super(因为 super 指向运行时父类实例,而 static 不依赖实例) - 若父类方法是 private 或被子类重载(overload)而非重写(override),
super无法访问或不会触发多态
注意访问权限与方法签名一致性
super 只能调用父类中可被子类访问的方法:即 public、protected,或同包下的默认(package-private)方法。若父类方法是 private,子类根本不可见,更无法通过 super 调用。
立即学习“Java免费学习笔记(深入)”;
- 调用
super.method()时,编译器检查的是父类中是否存在匹配签名的可访问方法 - 运行时仍遵循多态:如果父类方法本身是虚方法(非 final/static/private),且被其父类进一步重写,
super仍指向直接父类的实现,不会跳过一层
避免常见错误
容易混淆的点包括把 super 当作对象引用、误在 static 上下文中使用、或以为 super 可以访问父类私有成员。
-
super不是对象,不能赋值给变量,也不能用super.toString()以外的方式“保存” - 不要写
super = ...或Super s = super;—— 语法非法 - 想访问父类字段?只有该字段可被继承(非 private)时,才能用
super.fieldName;否则需通过父类提供的 public/protected 方法间接访问


















