java中的this和super关键字

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调用父类同名的实例方法。

java中的this和super关键字

上一篇:ES6(2)


下一篇:浅谈C++编译过程