java中的this和super关键字
对象实例化时,至少有一条从本类出发抵达Object的通路,而打通这条路的两个主要关键字就是this和super。但是this和super往往是默默无闻的,在很多情况下可以省略,比如:
- 本类方法调用本类属性
- 本类方法调用本类的另一个方法
- 子类构造方法隐含调用super()
任何类在创建之初,都有一个默认的空构造方法,他是super()的一条默认通路。构造方法的参数列表决定了调用通路的选择;如果子类指定调用父类的某个构造方法,super就会不断往上溯源;如果没有指定,则默认调用super()。如果父类没有提供默认的构造方法,子类在继承时就会编译错误。
public class Father{
public Father(int a){}
}
//子类编译出错,因为父类没有提供默认的构造方法
class Son extends Father{}
如果父类坚持不提供默认的无惨构造方法,必须在本类的无参构造方法中使用super方式调用父类的有参构造方法,如下代码:
public class Father{
public Father(int a){}
}
class Son extends Father{
public Son{
//必须调用父类的有参构造方法否则编译出错
super(12);
}
}
- 一个实例变量可以通过this.赋值给另一个实例变量;
- 一个实例方法可以通过this.调用另一实例的方法;
- 一个构造方法可以通过this.调用另一个构造方法;
如果this和super指代构造方法,则必须位于方法体的第一行,否则在实例化对象时,会因子类调用到多个父类构造方法二造成混乱。由于this和super都在实例化阶段调用,所以不能再静态方法和静态代码块中使用this和super关键字。this还可以指代当前对象,比如在同步代码块synchronized(this){}中,super并不具备此能力。但suoer也有自己特异的功能,在子类覆写父类方法时,可以使用super调用父类同名的实例方法。