尚硅谷JavaSE基础

6.7 super关键字

6.7.1 super关键字含义

1. super关键字

作用:

在Java类中使用super来调用父类中的指定操作:

super可用于访问父类中定义的属性

super可用于调用父类中定义的成员方法

super可用于在子类构造方法中调用父类的构造器

注意: 

尤其当子父类出现同名成员时,可以用super进行区分

super的追溯不仅限于直接父类

super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识

super关键字表示在当前类中特别指定要使用父类的成员时使用super限定.

这里的父类不仅包括直接父类, 也包括间接父类.

6.7.2 super使用场景

1. 方法中使用

class Person {

protected String name="张三";

protected int age;

public String getInfo() {

         return “Name: ” + name + “\nage: ” + age;

}

}

class Student extends Person {

    protected String name = "李四";

private String school = "New Oriental";

public String getSchool(){

return school;

}

    @Override

public String getInfo() {

        return super.getInfo() +"\nschool: " +school;

// 在方法中使用super可以调用父类中的被覆盖方法

}

}

public class TestStudent{

public static void main(String[] args){

Student st = new Student();

System.out.println(st.getInfo());

} }

2. 构造器中使用

  • 子类中所有的构造器默认都会访问父类中空参数的构造器
  • 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行
  • 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错

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);

}

// ……

}

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;

}

public Student(String s) { // 直接隐式调用父类无参构造器

school = s;

}

}

6.7.3子类对象实例化过程

1. 执行顺序

6.7.4 super和this的区别

No.

区别点

this

super

1

访问属性

访问本类中的属性,如果本类没有此属性则从父类中继续查找

访问父类中的属性

2

调用方法

访问本类中的方法

直接访问父类中的方法

3

调用构造器

调用本类构造器,必须放在构造器的首行

调用直接父类构造器,

必须放在子类构造器的首行

4

特殊

表示当前对象

无此概念