super关键字和this关键字的区别是什么?
一、核心含义不同
- this:代表当前类的实例对象(自己这个对象)
- super:代表父类的引用,指向直接父类对象
二、四大使用场景对比
1. 访问成员变量
this.变量名:访问本类的成员变量,区分局部变量同名super.变量名:访问父类的成员变量,解决父子类变量重名
class Father {
String name = "父亲";
}
class Son extends Father {
String name = "儿子";
void test(){
System.out.println(this.name); // 儿子(本类)
System.out.println(super.name); // 父亲(父类)
}
}
2. 调用成员方法
this.方法():调用本类中任意方法super.方法():调用父类中被重写的原始方法
@Override
void say(){
super.say(); // 先执行父类的say
this.play(); // 调用自己的play方法
}
3. 调用构造方法(构造器专用)
this(参数):调用本类其他构造方法,必须放在第一行super(参数):调用父类构造方法,必须放在第一行
重要限制:
this() 和 super() 不能同时出现在同一个构造器,两者都要求第一行,冲突编译报错。
- 子类构造默认隐含
super(),不写也会调用父类无参构造; - 父类只有有参构造时,子类必须手动写
super(实参)。
4. 作为对象返回值
return this:返回当前对象本身(链式调用常用)- super 不能单独作为对象返回,不能写
return super
三、使用范围限制(共同点+区别)
- 共同点
- 都只能在实例方法/构造方法中使用
- 静态方法
static、静态代码块中都不能使用(没有对象)
- 区别
- this:普通类、无继承关系的类也能使用
- super:只能存在有继承关系的子类中,普通类不能用super
四、表格汇总
| 对比维度 | this | super |
|---|---|---|
| 指代对象 | 当前类自身实例 | 直接父类对象引用 |
| 访问变量 | 本类成员变量 | 父类成员变量 |
| 调用方法 | 本类方法 | 父类被重写的方法 |
| 构造调用 | this() 本类构造 |
super() 父类构造 |
| 使用前提 | 只要有实例就能用,无需继承 | 必须有父子继承关系 |
| 返回对象 | 可 return this 返回自身 |
不允许单独return super |
| 静态环境 | 禁止使用 | 禁止使用 |
| 共存规则 | 和super()不能同处一个构造器 | 和this()不能同处一个构造器 |
五、高频面试题总结
- 没有继承的类里能不能用super?
不能,super依赖父类,编译报错。 - 构造方法里this()和super()能否一起写?
不能,都要求第一行,只能二选一。 - static方法里能使用this/super吗?
都不行,静态属于类,不绑定实例对象。 - 子类重写方法后,如何执行父类原有逻辑?
使用super.方法名()。 - 局部变量和成员变量重名,用谁区分?
this.变量。

浙公网安备 33010602011771号