this 和 super 完整区别对比
一、核心含义
- this:代表当前类的对象
- super:代表父类的对象引用(不是父类对象,只是访问父类成员的标识)
二、四大使用场景对比
1. 访问成员变量
this.变量:访问本类的成员变量,区分局部变量重名super.变量:访问父类的成员变量,区分父子同名属性
classFather{Stringname="父亲";}classSonextendsFather{Stringname="儿子";voidtest(){System.out.println(this.name);// 儿子System.out.println(super.name);// 父亲}}2. 调用成员方法
this.方法():调用本类方法,可调用重载方法super.方法():调用父类被重写的方法
@Overridepublicvoidshow(){this.hello();// 本类hellosuper.show();// 父类show}3. 调用构造方法
this(...):调用本类其他构造器super(...):调用父类构造器
共同点:- 都必须放在构造方法第一行
this()和super()不能同时出现
4. 作为对象返回
return this:返回当前对象,支持链式调用- 不能
return super,语法报错
三、能否用在静态方法中
this:不能,static无对象super:不能,static无对象
静态方法里两者都会编译报错。
四、使用范围
this:可在本类任意普通方法、构造器使用super:只能存在子类中,普通类不能使用super
五、表格总结
| 对比项 | this | super |
|---|---|---|
| 指代 | 当前类实例对象 | 父类对象引用 |
| 访问变量 | 本类成员变量 | 父类成员变量 |
| 调用方法 | 本类方法 | 父类重写前的方法 |
| 构造调用 | this() 调用本类构造 | super() 调用父类构造 |
| 使用位置 | 本类任意非静态方法 | 子类任意非静态方法 |
| 静态方法 | 禁止使用 | 禁止使用 |
| 返回对象 | return this 合法 | return super 非法 |
| 无继承类 | 可正常使用 | 不能使用 |
六、关键易错点
- 子类构造默认第一行隐藏
super(),如果父类只有有参构造,必须手动写super(参数); this()和super()互斥,不能共存;- super不能访问爷爷类,只能访问直接父类;
- this可以区分局部变量和成员变量,super解决父子同名成员冲突。