关键字super

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

  • super可用于访问父类中定义的属性
  • super可用于调用的父类中定义的成员方法
  • super可用于在子类构造方法中调用父类的构造器

注意:

  • 尤其当子父类出现同名成员时,可以用super进行区分
  • super的追溯不仅限于直接父类(super不仅可以调用父类,还可调用父类的父类)
  • super和this的用法很相像,this代表本类对象的引用,super代表父类的内存空间的表示
public class kk extends Kids{
    public void text(){
        super.salary = 1;//salary为kids的父类ManKind中的成员变量
        super.yearsOld = 100;//yearsOld为Kid的成员变量
        super.employeed();//可以用super追溯父类的成员方法
        super.manOrWorman();//可以使用super向上追溯父类的父类的成员方法
    }
}
public class Kids extends ManKind {
    public int yearsOld;

    public int getYearsOld() {
        return yearsOld;
    }

}
public class ManKind {
    public int sex;
    public int salary;

    public void manOrWorman(){
        
    }
    public void employeed(){
       
    }

}

public class kid extends man {

    public void show(){
        super.showInfo();
    }

    public static void main(String[] args) {
        kid k = new kid();
        k.show();
    }
}
public class man {
    String name = "sa";
    int age =10;

    public void showInfo(){
        System.out.println("name"+name+"age"+age);
    }
}

调用父类的构造器

  • 子类中所有的构造器默认都会访问父类中空参数的构造器
public class man {
    String name = "sa";
    int age =10;

    public man(){//显式无参构造
        System.out.println("mankind");
    }

//    public void showInfo(){
//        System.out.println("name"+name+"age"+age);
//    }
}

public class kid extends man {

//    public void show(){
//        super.showInfo();
//    }

    public static void main(String[] args) {
        kid k = new kid();//new kid()是在调用kid类的默认无参构造方法,在这个过程中就会使用父类的无参构造

    }
}

//相当于下面
public class man {
    String name = "sa";
    int age =10;

    public man(){//显式无参构造
        System.out.println("mankind");
    }

//    public void showInfo(){
//        System.out.println("name"+name+"age"+age);
//    }
}

public class kid extends man {
      
      public kid(){
          super();
      }

//    public void show(){
//        super.showInfo();
//    }

    public static void main(String[] args) {
        kid k = new kid();//new kid()是在调用kid类的默认无参构造方法,在这个过程中就会使用父类的无参构造

    }
}

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