super关键字和this关键字的区别是什么?

一、核心含义不同

  1. this:代表当前类的实例对象(自己这个对象)
  2. 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

三、使用范围限制(共同点+区别)

  1. 共同点
    • 都只能在实例方法/构造方法中使用
    • 静态方法 static、静态代码块中都不能使用(没有对象)
  2. 区别
    • this:普通类、无继承关系的类也能使用
    • super:只能存在有继承关系的子类中,普通类不能用super

四、表格汇总

对比维度 this super
指代对象 当前类自身实例 直接父类对象引用
访问变量 本类成员变量 父类成员变量
调用方法 本类方法 父类被重写的方法
构造调用 this() 本类构造 super() 父类构造
使用前提 只要有实例就能用,无需继承 必须有父子继承关系
返回对象 return this 返回自身 不允许单独return super
静态环境 禁止使用 禁止使用
共存规则 和super()不能同处一个构造器 和this()不能同处一个构造器

五、高频面试题总结

  1. 没有继承的类里能不能用super?
    不能,super依赖父类,编译报错。
  2. 构造方法里this()和super()能否一起写?
    不能,都要求第一行,只能二选一。
  3. static方法里能使用this/super吗?
    都不行,静态属于类,不绑定实例对象。
  4. 子类重写方法后,如何执行父类原有逻辑?
    使用 super.方法名()
  5. 局部变量和成员变量重名,用谁区分?
    this.变量
posted @ 2026-07-02 10:10  kk9986  阅读(3)  评论(0)    收藏  举报