Java关键字 super

131 阅读3分钟
1. 为什么需要 super ?

举例1: 子类继承父类以后,对父类的方法进行了重写,那么在子类中,是否还可以对父类中被重写的方法进行调用?? 可以! 使用super关键字即可
举例2: 子类继承父类以后,发现子类和父类中定义了同名的属性,是否可以在子类中区分两个同名的属性?? 可以! 使用super关键字即可

2. super 的理解: 父类的
3. super 可以调用的结构:属性、方法、构造器

具体的:

3.1 super调用属性、方法

子类继承父类以后,我们就可以在子类的方法或构造器中,调用父类中声明的属性或方法。(满足封装性的前提下)如何调用呢?需要使用 "super." 的结构,表示调用父类的属性或方法。
一般情况下,我们可以考虑省略"super"的结构。但是,如果出现子类重写了父类的方法或子父类中出现了同名的属性时则必须使用"super."的声明,显式的调用父类被重写的方法或父类中声明的同名的属性。

public class Person {

    public void eat(){
        System.out.println("吃饭ing");
    }
    public void toilet(){
        System.out.println("洗手间ing");
    }
}

public class Man extends Person{
    @Override
    public void eat(){
        System.out.println("男人正在吃饭");
    }
    @Override
    public void toilet(){
        System.out.println("男人在上厕所");
    }
    public void smoke(){
        System.out.println("抽烟ing");
    }
    public void show(){
        super.eat();
    }
}
public class Exer4 {

    public static void meeting(Person a){
        a.eat();
        a.toilet();

        if(a instanceof Man){
            ((Man) a).smoke();
            ((Man) a).show();
        }else{
            ((Woman) a).makeup();
        }
    }

    public static void main(String[] args) {
        meeting(new Man());
    }
}
3.2 super调用构造器
  1. 子类继承父类时,不会继承父类的构造器只能通过“super(形参列表)”的方式调用父类指定的构造器
  2. 规定:“super(形参列表)”,必须声明在构造器的首行。
  3. 我们前面讲过,在构造器的首行可以使用"this(形参列表),调用本类中重载的构造器结合 2 ,结论:在构造器的首行,"this(形参列表)”和“super(形参列表)"只能二选一。
  4. 如果在子类构造器的首行既没有显示调用"this(形参列表)",也没有显式调用"super(形参列表)"则子类此构造器默认调用"super()",即调用父类中空参的构造器。
  5. 由 3 和 4 得到结论子类的任何一个构造器中,要么会调用本类中重载的构造器,要么会调用父类的构造器只能是这两种情况之一。
  6. 由 5 得到:一个类中声明有n个构造器,最多有n-1个构造器中使用了"this(形参列表)"6则下的那个一定使用"super(形参列表)"。

MARK

我们在通过子类的构造器创建对象时,一定在调用子类构造器的过程中,直接或间接的调用到父类的构造器。
也正因为调用过父类的构造器,我们才会将父类中声明的属性或方法加载到内存中,供子类对象使用。

public class Person {

    String name = "李四";
    int age = 10;

    public Person(){

    }
    public Person(String name,int age){
        this.name = name;
        this.age = age;

    }
}
public class Man extends Person{

    String name;
    int age;
    int height;

    public Man(){
        //这个构造器的首行有一个默认的super(),不写时,编辑器会自动加上该默认super()
    }
    public Man(String name,int age,int height){
        super(name,age);
        this.height = height;
    }
    public String getName(){
        return super.name;
    }
    public int getAge(){
        return super.age;
    }
}
public class Exer4 {

public static void main(String[] args) {
    Man man = new Man();
    System.out.println(man.getName() + man.getAge());


    Man m = new Man("张三",6,190);
    System.out.println(m.getName() + m.getAge() + m.height);
    }
}