java super关键字的三种用法及其与this关键字的比较

super关键字的用法及其与this关键字的比较

1.super关键字可以访问父类的成员变量 super.变量

如下这是父类People类,有一个age成员变量,变量值为20。

public class People {
 	int age=20;
 }

如下这是父类People的继承类Teacher类,有一个全局变量age,值为30,还有一个show方法,方法里有一个局部变量age,值为40.

public class Teacher extends People{
 	int age=30;
 	public void show(){
  	int age=40;
  	System.out.println(age);
  	System.out.println(this.age);
  	System.out.println(super.age);
 	}
}

如下为Demo类

public class Demo {
 	public static void main(String[] args) {
  	Teacher demo1=new Teacher();
  	demo1.show();
 	}
}

运行程序,得到如下结果
在这里插入图片描述
成员变量如果同名,则访问顺序是先局部变量,再该类的全局变量,再就是父类的全局变量,如果还没找到该成员变量就会报错。
现在第一行的40是show方法里的成员变量,按照默认访问顺序访问。
第二行用了this关键字,所以访问的是全局变量age的值30.
第三行用了super关键字,访问的是父类的全局变量age的值20.
而且因为Teacher继承了People,存在隐藏的全局变量age,如果不在Teacher中给出全局变量age的值,也没有问题,this.age依然可以访问到隐藏的age的值20.

2.访问父类的构造函数 super(…)

如下修改代码
People类

public class People {
 	public People() {
  	System.out.println("People类的构造函数");
 	}
}

Teacher类

public class Teacher extends People{
 	public Teacher(){
  	super();
 	}
}

Demo类

public class Demo {
 	public static void main(String[] args) {
  	Teacher demo1=new Teacher();
 	}
}

运行结果:
在这里插入图片描述
Demo中的Teacher类new对象的时候会加载Teacher的构造方法到栈里,Teacher的构造函数又要通过super()访问了父类的构造函数。实际上所有子类在初始化构造函数时都会先访问父类无参构造方法,子类构造方法第一句默认为super(),在此为了说明super特意写了出来。

3访问父类的成员方法 super.父类方法名

代码如下:
1.People类

public class People {
 	public void run(){
  	System.out.println("People在跑步");
 	}
}

2.Teacher类

public class Teacher extends People{
 	public void show(){
  	super.run();
 	}
}

3.Demo类

public class Demo {
 	public static void main(String[] args) {
  	Teacher demo1=new Teacher();
  	demo1.show();
 	}
}

结果如下:
在这里插入图片描述
demo1对象调用了show()方法,show()又访问了父类的run()方法。

总结

贴一张网上看到的图
java super关键字的三种用法及其与this关键字的比较_第1张图片

你可能感兴趣的:(Java)