总结this与super


本文共1048字,读完大概需要3分钟
既然是搞java开发,这两个关键字是入门的时候必学的。但是不能说每个人都一定会一定懂。今天就来聊聊这两个东东。
对象实例化的时候,至少有一条从本类出发抵达Object的通道,而打开这条通道的两个主要的工兵就是this和super,可以说是逢山开路遇水搭桥。其实很多时候this和super往往是默默无闻的,在很多情况下是被省略的。
比如:
- 本类方法调用本类属性
- 本类方法调用另一个本类方法
- 子类构造方法隐含调用super()
任何类在初创期,都有一个默认的空构造方法,同时super方法的一条默认通道。构造方法的参数列表决定了调用通道的选择,如果子类调用父类的某个构造方法,super就会不断往上溯源;如果没有指定,则默认调super方法。如果父类没有提供默认的构造方法,子类集成会报错。
class Base{
public Base(int age){
}
}
public class User extends Base{
//编译失败
public User() {
}
}
提示
Error:无法将类 com.tian.swagger.domain.Base中的构造器 Base应用到给定类型;
需要: int
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
如果父类始终没有提供默认的无参构造方法,必须在本类的无参构造方法中使用super方式调用父类的有参构造方法:
class Base{
public Base(int age){
}
}
public class User extends Base{
public User() {
super(1);
}
}
- 一个实例变量可以使用this.赋值另外一个实例变量;
- 一个实例方法也可以通过this.调用另外一个实例方法;
- 即使是一个构造方法都可以使用this.来调用另外一个构造方法。
- 如果this.和super指代构造方法,则必须位于方法的第一行。
换句话说,就是一个方法中this和super只能出现一个,并且只能出现一次,否则实例化对象的时候,会因为子类调用到多个父类构造方法,从而导致混乱。
由于this和super都在实例化阶段调用,所以不能在静态方法和静态代码块中出现this.和super关键字。this还可以指代当前对象,比如在同步代码块中
private void test() {
synchronized (this) {
//doSomething
}
}
super却不能这么使用。但是super也有自己的特点,在子类中覆写父类方法时候,可以使用super调用父类同名的实例方法,下面总结一下this和super的异同点:

