尚硅谷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 |
特殊 |
表示当前对象 |
无此概念 |