目录
super是Java中的关键字,用来访问父类中的成员变量,成员方法和父类的构造方法
super的使用场景必须在继承关系中,如果没有继承关系,就不能使用super
super关键字
1,访问父类的成员变量
如果子类中有和父类中重名的变量,当我们想使用父类中的变量时就要使用super关键字,否则就遵循就近原则---------方法中的局部变量--------》本类成员变量--------》父类中的成员变量
代码演示
person{
int age =10;
}
student extends person{
int age =20;
public void a(){
int age = 30;
print{age}
}
}
这种情况打印的age是30
person{
int age =10;
}
student extends person{
int age =20;
public void a(){
int age = 30;
print{this.age}
}
}
当使用this关键字后调用的是成员位置的age打印的是20
person{
int age =10;
}
student extends person{
int age =20;
public void a(){
int age = 30;
print{super.age}
}
}
当使用super关键字后调用的是父类中的age打印的是10
2,访问父类的成员方法
访问成员方法的过程和访问成员变量的过程类似,当子类中出现和父类重名的方法时(方法的重写)使用super关键字调用父类方法
代码演示
person{
public void a(){
print{“父类”}
}
}
student extends person{
public void a(){
super.a();
}
}
使用super关键字即可调用父类方法
3,访问父类的构造方法
当我们创建子类对象时会调用子类的构造方法,但是因为有了继承关系,在子类的构造方法的第一行会默认调用父类的无参构造方法
jvm会默认在子类构造方法的第一行加上super();表示调用父类的构造方法,因为子类的一些属性是写在父类中的所以在创建子类对象之前必须先对父类的属性进行初始化。因此子类的构造方法是先调用的,但是父类的构造方法是先执行完的
我们也可以自己手动调用父类的构造方法
注意当我们自己编写调用父类的构造方法后jvm将不会再自动给我们提供默认的调用父类空参构造的代码
代码演示
person{
int age;
public person(){
}
public person(int age){
this.age = age;
}
}
student extends person{
public student(){
}
public student(int age){
super(age);
}
}
使用super(参数列表);即可调用父类的构造方法,我们通过子类构造方法将数据传到父类构造方法中完成数据初始化。
总结
1,super关键字只能出现在继承关系中
2,当子类和父类的属性重名是即可使用super关键字来调用父类的属性
3,使用super(参数列表);代码即可调用父类的构造方法
4,当父类方法和子类方法重名时可以使用super来调用父类方法,这种情况就是方法的重写