既然是搞java开发,这两个关键字是入门的时候必学的。但是不能说每个人都一定会一定懂。今天就来聊聊这两个东东。
对象实例化的时候,至少有一条从本类出发抵达Object的通道,而打开这条通道的两个主要的工兵就是this和super,可以说是逢山开路遇水搭桥。其实很多时候this和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和super只能出现一个,并且只能出现一次,否则实例化对象的时候,会因为子类调用到多个父类构造方法,从而导致混乱。
由于this和super都在实例化阶段调用,所以不能在静态方法和静态代码块中出现this.和super关键字。this还可以指代当前对象,比如在同步代码块中
private void test() { synchronized (this) { //doSomething } }
super却不能这么使用。但是super也有自己的特点,在子类中覆写父类方法时候,可以使用super调用父类同名的实例方法,下面总结一下this和super的异同点: