this表示当前对象引用(注意不是当前对象). 可以借助 this 来访问对象的字段和方法
super 表示获取到父类实例的引用. 涉及到两种常见用法:
- 使用了 super 来调用父类的构造器
public Bird(String name) {
super(name);
}
- 使用 super 来调用父类的普通方法
public class Bird extends Animal {
public Bird(String name) {
super(name);
}
@Override
public void eat(String food) {
// 修改代码, 让子调用父类的接口.
super.eat(food);
System.out.println("我是一只小鸟");
System.out.println(this.name + "正在吃" + food);
}
}
在这个代码中,如果子类的eat方法直接调用eat(不加super),那他就调的是子类自己的eat,而加上super,才是调用父类的方法
如果父类里不定义无参的构造的话子类的构造函数会报错,所以说明在子类的构造函数默认的都有一句隐式的super();
在子类构造器中如果没有显式的去调用父类构造器,那么就会隐式的调用父类的无参构造器。如果父类无参构造不存在(已经在父类写了带参构造),就必须用super去显式的调用父类带参数的构造器(这时一定要放在第一行)!如果存在就没问题。
区别:
this表示当前对象,是访问本类中的属性和方法,super是由子类访问父类的属性和方法;
this是先查找本类,如果本类没有就调用父类,super是不查找本类,直接调用父类;
this调用本类构造器,必须放在构造器的首行,super调用父类构造器,必须放在子类构造器的第一行。
注意:this与super在构造器里面是不可以同时存在的
super和this两个关键字不能在静态上下文中使用,(this是当前实例的引用, super是当前实例父类实例的引用, 也是和当前实例相关)