super()关键字
关键字的理解
父类中定义了该方法,但是子类中重写了该方法,使用super来修饰这个方法,在调用的时候调用父类的方法。
super关键字的使用
-
1、super理解为父类
-
2、super可以用来调用:属性方法和构造器
-
3、super的使用,调用属性和方法:
3.1、我们可以在子类的方法或者构造器中,使用super.属性或者super.方法来显示调用父类中
声明的属性和方法,但是通常情况下,我们习惯省略“super.”
3.2、特殊情况,当子类和父类中定义了同名的属性时,我们在子类中调用父类中声明的属性,必须
显示的使用“super.属性”的方式,表明调用的是父类中声明的属性,在实际的开发中是不会出现同名的属性
其中调用了super方法之后,其子类还会向父类中进行寻找,如果父类找不到,再到父类的父类中来进行寻找。(super的追溯不仅限于直接父类)
-
3.3、特殊情况下,当子类重写了父类中的方法之后,我们想在子类的方法中调用父类中被重写的方法时:
则必须显示的使用“super.属性”的方式,表明调用的是父类中被重写的方法。
想要在子类中调用被重写的父类的方法时,就会用super.
-
4、使用super来调用构造器。
4.1、我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定构造器。
4.2、"super(形参列表)"的使用,必须声明在子类构造器的首行。
4.3、我们在类的构造器中,针对于"this(形参列表)"或者"super(形参列表)"只能时二选一。
4.4、在构造器的首行,没有显式声明"this.(形参列表)“或者"super(形参列表)”,则默认调用的是父类中空参的构造器:super()
4.5、一个类中有n个构造器,最多有n-1个使用了this,剩下一个用的就是super。
在类的多个构造器中,至少有一个类的构造器中使用了”super(形参列表)“,调用了父类的构造器.
下面是该代码的示例:
Person.java:
public class Person {
String name;
int age;
int id=1001;//身份证
public Person(){
System.out.println("我无处不在");
}
public Person(String name){
this.name=name;
}
public Person(String name,int age){
this(name);
this.age=age;
}
public void eat(){
System.out.println("人吃饭");
}
public void walk(){
System.out.println("人走路");
}
}
student.java
//父类和子类出现了同名的属性情况下,这时的属性在内存中有两个id
public class student extends Person{
String major;
int id=1002;//学号
public student(){
}
public student(String major){
this.major=major;
}
public student(String name,int age,String major) {
// this.name=name;
// this.age=age;
super(name,age);//代表了调用父类方法中的参数,name和age
this.major=major;
}
@Override
public void eat() {
System.out.println("学生吃有营养的食物");
}
public void study(){
System.out.println("学生学习知识");
this.eat();
super.eat();
walk();
}
public void show(){
System.out.println("name=" + this.name + ",age= "+ super.age);//super.age直接在自己的父类中来进行寻找
System.out.println("id= " + id);//这里相当于圣罗了this.
//想获取父类的id就是用super来调用
System.out.println("id= " + super.id);
}}
test.java:
public class Supertset {
public static void main(String[] args) {
student s=new student();
s.show();
s.study();
student s1=new student("Tom",21,"IT");
s1.show();
System.out.println("***********");
student s2=new student();
}
}