JAVA中使用super调用属性、方法、构造器

子类中super关键字的使用


   1.super可以理解为父类的

   2.super可以用来调用属性,方法,构造器

   3.在子类中使用super调用属性和方法

     3.1在子类的方法或构造器中,通过使用“super.属性”或者“super.方法”的方式 ,显示的调用父类中声明的属性或者方法 但是,通常情况下,我们习惯省略 “super.”

     3.2特殊情况,当子类和父类中定义了同名的属性时,想要调用父类中声明的属性,就需要通过“super.属性”的方式来表明调用的是父类中声明的属性

     3.3特殊情况,当子类重写了父类中的方法以后,想在子类的方法中调用父类被重写的方法时,则必须显示的使用“super.方法” 来表明调用的是父类中被重写的方法

  4.在子类中使用super调用父类的构造器

    4.1我们可以在子类的构造器中显示的使用“super(形参列表)”的方式,来调用父类中声明的指定的构造器 

    4.2“super(形参列表)”的使用,必须声明在子类构造器的首行

    4.3我们在类的构造器中,针对于“this(形参列表)”和“super(形参列表)”只能二选一,不能同时出现。“this(形参列表)”表示子类中重载的构造器,“super(形参列表)”表示调用父类的构造器

    4.4在构造器的首行,没有显示的调用“this(形参列表)”和“super(形参列表)”时,则默认调用的是父类中空参的构造器,super()

    4.5在类的多个构造器中,至少有一个类的构造器使用了“super(形参列表)”调用父类中的构造器,不可能全是“this(形参列表)”。

新建一个父类Person

public class Person {
    String name="张三";
    int age=21;
    int id=1001001001;//证号

    //空参构造器
    public Person(){
        System.out.println("我无处不在!");
    }
    //一个参数的构造器
    public Person(String name){
        this.name = name;
    }
    //多个参数的构造器
    public Person(String name,int age){
        this(name);
        this.age = age;
    }

    public void eat(){
        System.out.println("人吃饭");
    }
    public void walk(int distance){
        System.out.println("人走路,走的距离是"+distance+"公里");
    }
}

再新建一个子类Student,继承上面的父类Person

package com.guigu.exer;

import com.guigu.exer.Person;

public class Student extends Person {

    String major;
    int id=10086;//学号
    //子类空参构造器
    public Student(){

    }
    //子类一个参数的构造器
    public Student(String major){
        //这个构造器的首行有一个默认的super(),不写时,编辑器会自动加上该默认super()
        //super();
        this.major = major;
    }
    //子类中多个参数的构造器
    public Student(String name,int age,String major){
        //使用"super(形参列表)"的方式调用父类中指定形参的构造器
        //使用"super(形参列表)"的时候,必须声明在子类构造器的首行
        super(name,age);
        this.major = major;

    }

    //该方法对父类方法进行了重写
    @Override
    public void eat(){
        System.out.println("学生吃饭");
    }

    public void show(){
        //此时的name、age前面可以省略this
        System.out.println("name=" + name + "," + "age=" + age);
        //这里的this,super都可以调用,第一是因为子类和父类没有属性冲突的情况,都在堆空间去找且仅有一个name、age
        System.out.println("name=" + this.name + ","+ "age=" + super.age);
        //因为子类和父类都有一个同名的属性,此时在堆空间是有两个id的, 默认调用的是子类的属性,这里省略了一个this
        System.out.println("子类中的> id);
        //如果想要调用父类的属性,需要在前面加上一个super
        System.out.println("父类中的id = "+ super.id);
    }

    public void study(){

        System.out.println("学生,好好学习,天天向上");
        //这里的调用省略了前面的“this.”
        eat();
        super.eat();
        //因为walk没有被重写,那么在子类中调用时,可以省略this,也可以使用"this.",还可以使用"super."
        //使用“this."和"super."的区别在于:“this."会先在本类去找,没有找到再去父类找该方法,使用"super."直接去父类去找该方法
        walk(2);
        this.walk(3);
        super.walk(5);
    }

}

新建一个测试类,来验证一下,看看打印结果

package com.guigu.exer;

public class SuperTest {
    /**
     * @param args
     */

    public static void main(String[] args) {
        Student student =new Student();
        student.show();
        student.study();
        System.out.println("------------------");
        Student s1= new Student("Tom",21,"IT");
        s1.show();
        System.out.println("********************");
        Student s2= new Student();