super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那它们有什么区别呢?
一、相同点
1、都是Java中的关键字
2、只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3、在构造方法中调用时,必须是构造方法的第一条语句,并且不能同时使用
二、不同点
1、this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用。
2、在非静态成员方法中,this用来访问本来的方法和属性,super用来访问父类继承下来的方法和属性
3、在构造方法中,this()用于调用本类构造方法,super()用于调用父类的构造方法,两种调用不能同时在构造方法中出现
4、构造方法中一定会存在super()的调用,用户没有写编译器也会增加,但是this()用户不写则没有
注意:在底层(字节码层面)this是存在的,但是super是不存在的,super是代码层面的一个关键字,在代码中可以通过super访问子类对象中从基类继承下来的成员,但是代码经过javac编译之后,super就不存在了
用以下代码加深理解
- public class Base {
- public int a;
- public int b;
- public Base(int a,int b){
- this.a = a;
- this.b = b;
- }
- }
- public class Derived extends Base{
- public int d;
- public Derived(int a,int b,int d){
- super(a,b);
- this.d = d;
- }
- public void method(){
- super.a = 1;
- super.b = 2;
- this.d = 3;
- }
-
- public static void main(String[] args) {
- Derived derived = new Derived(1,2,3);
- derived.method();
- }
- }