this 和 super 是Java的两个关键字,两者之间有很多相似之处,极易混淆,下面将分别介绍两者的用法以供对比
this 关键字
访问成员变量
this关键字,实际上是当前对象的引用。当方法中的形参或局部变量 与 对象的成员变量同名时,对象的成员变量会被屏蔽。此时可以使用 this.memberVariable 的形式来访问成员变量。该用法在构造函数中可以经常看到
调用该类其他构造器
一个类中,可能会有多个不同形参重载版本的构造器。可以在构造器方法中通过 this(var1, var2) 的形式来调用该类中重载的其他构造器。需要注意的是,使用this调用重载版本的构造器 只能位于 构造器方法中的第一行。该用法可以抽取多个构造器方法中的公共代码部分
super 关键字
调用父类方法
使用 super.method1() 的形式可以调用其父类的方法。比如: 在子类中无法访问父类的私有成员变量,这时就可以通过 super.method1() 来调用父类中相应的访问器方法
调用父类构造器
在子类构造器中使用 super(var1, var2) 实现对父类构造器的调用。使用super调用父类的构造器 也必须只能在 子类构造器方法的第一行。故在一个构造器方法中不可能同时使用super、this来调用构造器
不管是否使用super显式调用父类构造器,子类构造器总会调用一次父类构造器。该过程可以分为以下三种情况:
- 子类构造器中即没有使用super显式调用构造器,也没有使用this显式调用构造器。则将自动调用父类的无参构造器,如果父类的无参构造器不存在,则将出现编译错误
- 子类构造器中使用super显式调用父类构造器,系统将根据super传入的实参列表调用指定版本的父类构造器
- 子类构造器中使用this显式调用本类中重载版本的构造器,系统将根据传入this的实参列表来调用子类重载版本的构造器。当然如果这个子类重载版本的构造器依然使用了this继续调用子类其他重载版本构造器,会继续重复这个过程。但最终某个子类的构造器一定会根据 第2种情况 或 第3种情况 来调用父类构造器
Note
- Java下仅当一个类中未显式提供任何构造器方法时,系统才会提供一个默认的无参构造器
- this、super关键字并不是类似的概念。前者是实际上对当前对象的引用;而后者只是一个指示编译器调用父类方法的关键字