概念
super的使用
- super可用于访问父类中定义的属性
- super可用于调用父类中定义的成员方法
- super可用于在子类构造器中调用父类的构造器
- 尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
- super的追溯不仅限于直接父类
- super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
- 当子类重写了父类的方法时,我们想在子类调用父类中被重写的方法,必须显示的使用super.方法的方式,表明调用的是父类中被重写的方法
示例
Person类
package pers.zyx.Java3;
public class Person {
String name;
int age;
int id = 1001; // 身份证号
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("人:吃饭");
}
public void walk(){
System.out.println("人:走路");
}
}
Student类
package pers.zyx.Java3;
public class Student extends Person{
String major;
int id = 1002; // 学号
public Student(){
}
public void setMajor(String major) {
this.major = major;
}
@Override
public void eat() {
System.out.println("学生:多吃有营养的食物");
}
public void study() {
System.out.println("学生:学习知识");
}
public void show(){
System.out.println("name = " + name + " , age = " + age);
System.out.println("id = " + this.id);
System.out.println("id = " + super.id);
}
}
name = null , age = 0
id = 1002
id = 1001
super调用构造器
- 子类中所有的构造器默认都会访问父类中空参数的构造器
- 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行
- 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
- 在类的多个构造器中,至少又一个类的构造器使用了super(形参列表),调用父类的构造器
示例
Person类
public class Person {
private String name;
private int age;
private Date birthDate;
// 调用父类构造器举例
public Person(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthDate = d;
}
public Person(String name, int age) {
this(name, age, null);
}
public Person(String name, Date d) {
this(name, 30, d);
}
public Person(String name) {
this(name, 30);
}
}
Student类
public class Student extends Person {
private String school;
public Student(String name, int age, String s) {
super(name, age);
school = s;
}
public Student(String name, String s) {
super(name);
school = s;
}
// 编译出错: no super(),系统将调用父类无参数的构造器。
public Student(String s) {
school = s;
}
}
super和this的区别
no. | 区别点 | this | super |
---|---|---|---|
1 | 访问属性 | 访问本类中的属性,如果本类没 有此属性则从父类中继续查找 | 直接访问父类中的属性 |
2 | 调用方法 | 访问本类中的方法,如果本类没 有此方法则从父类中继续查找 |
直接访问父类中的方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造 器的首行 |
调用父类构造器,必须 放在子类构造器的首行 |