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()方法。
总结
贴一张网上看到的图