super.method()调用父类方法(静态绑定),this.method()调用当前对象实际类型的方法(动态绑定);前者用于复用父类逻辑,后者用于本类内部协作;super是语法机制,this是真实引用。

在类继承中,super.method() 和 this.method() 看似相似,但调用目标和语义完全不同:前者明确调用父类版本的方法,后者调用当前对象上实际运行的方法(可能被子类重写)。
调用目标不同:静态绑定 vs 动态绑定
super.method() 是静态绑定的。编译器在编译时就确定调用父类中声明的那个方法,不看运行时对象的真实类型。即使子类重写了该方法,super 仍强制走父类实现。
this.method() 是动态绑定的。它根据当前对象的实际类型决定调用哪个版本——如果子类重写了该方法,就执行子类的;否则才回退到父类。
- 例如父类有
void show() { System.out.println("Fu"); },子类重写为void show() { System.out.println("Zi"); } - 在子类中写
this.show()→ 输出 "Zi" - 在子类中写
super.show()→ 输出 "Fu"
使用场景不同:绕过重写 vs 正常调用
super.method() 主要用于子类重写方法时,需要复用父类逻辑的场合。比如在子类的 toString() 中先调用 super.toString() 获取父类字段信息,再拼接自己的字段。
this.method() 是常规调用方式,适用于本类内部方法协作、链式调用或避免局部变量遮蔽成员变量等场景。它体现的是“当前对象的行为”,不涉及继承层次的显式跳转。
- 常见于构造器中:用
this(...)调用本类其他构造器 - 也用于方法内:如
this.calculate();明确调用本类另一个方法,增强可读性
语法限制与本质差异
super 不是一个对象引用,而是一个访问父类成员的语法机制。它不能赋值、不能比较(如 super == null 报错)、也不能作为参数传递。
this 是一个真实的引用,代表当前正在执行方法的对象实例。它可以被赋值给变量、传参、参与判断,甚至返回出去。
-
super.method()只能在有继承关系的非静态方法或构造器中使用 -
this.method()在任何非静态方法中都合法,包括没有继承的类 - 两者都不能在 static 方法中使用(因为 static 不属于实例)
不能混用:不是同一层级的概念
它们解决的问题不在同一维度:super 是继承体系中的“向上访问”工具,强调“我要父类的那份”;this 是面向对象中的“自我指代”工具,强调“我自己的行为”。
一个方法里可以同时出现两者,比如子类重写方法时先用 super.init() 初始化父类状态,再用 this.customSetup() 执行子类专属逻辑。

















