概念

super的使用

  • super可用于访问父类中定义的属性
  • super可用于调用父类中定义的成员方法
  • super可用于在子类构造器中调用父类的构造器
  • 尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
  • super的追溯不仅限于直接父类
  • super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
  • 当子类重写了父类的方法时,我们想在子类调用父类中被重写的方法,必须显示的使用super.方法的方式,表明调用的是父类中被重写的方法

示例
Person类

  1. package pers.zyx.Java3;
  2. public class Person {
  3. String name;
  4. int age;
  5. int id = 1001; // 身份证号
  6. public Person(){
  7. }
  8. public Person(String name, int age) {
  9. this.name = name;
  10. this.age = age;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. public void eat(){
  19. System.out.println("人:吃饭");
  20. }
  21. public void walk(){
  22. System.out.println("人:走路");
  23. }
  24. }

Student类

  1. package pers.zyx.Java3;
  2. public class Student extends Person{
  3. String major;
  4. int id = 1002; // 学号
  5. public Student(){
  6. }
  7. public void setMajor(String major) {
  8. this.major = major;
  9. }
  10. @Override
  11. public void eat() {
  12. System.out.println("学生:多吃有营养的食物");
  13. }
  14. public void study() {
  15. System.out.println("学生:学习知识");
  16. }
  17. public void show(){
  18. System.out.println("name = " + name + " , age = " + age);
  19. System.out.println("id = " + this.id);
  20. System.out.println("id = " + super.id);
  21. }
  22. }
  23. name = null , age = 0
  24. id = 1002
  25. id = 1001

super调用构造器

  • 子类中所有的构造器默认都会访问父类中空参数的构造器
  • 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行
  • 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
  • 在类的多个构造器中,至少又一个类的构造器使用了super(形参列表),调用父类的构造器

示例
Person类

  1. public class Person {
  2. private String name;
  3. private int age;
  4. private Date birthDate;
  5. // 调用父类构造器举例
  6. public Person(String name, int age, Date d) {
  7. this.name = name;
  8. this.age = age;
  9. this.birthDate = d;
  10. }
  11. public Person(String name, int age) {
  12. this(name, age, null);
  13. }
  14. public Person(String name, Date d) {
  15. this(name, 30, d);
  16. }
  17. public Person(String name) {
  18. this(name, 30);
  19. }
  20. }

Student类

  1. public class Student extends Person {
  2. private String school;
  3. public Student(String name, int age, String s) {
  4. super(name, age);
  5. school = s;
  6. }
  7. public Student(String name, String s) {
  8. super(name);
  9. school = s;
  10. }
  11. // 编译出错: no super(),系统将调用父类无参数的构造器。
  12. public Student(String s) {
  13. school = s;
  14. }
  15. }

super和this的区别

no. 区别点 this super
1 访问属性 访问本类中的属性,如果本类没 有此属性则从父类中继续查找 直接访问父类中的属性
2 调用方法 访问本类中的方法,如果本类没 有此方法则从父类中继续查找
直接访问父类中的方法
3 调用构造器 调用本类构造器,必须放在构造 器的首行
调用父类构造器,必须 放在子类构造器的首行