8月更文挑战第 30天 | Java入门 14

80 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

super 关键字

当需要在子类中调用父类的被重写方法时,要使用 super 关键字。

super() 可以调用父类的构造方法。但此时,必须将 super()写在子类构造方法的第一行,其语法形式如下。

super( [参数列表] )

需要注意的是,子类的构造方法中如果不写 super(),编译器会帮助你在子类构造方法的第一行加上super(),因为在子类中调用父类构造器是“必须的”。但如果父类中只存在有参构造方法,并没有提供无参构造方法,则需要在子类构造方法中显式地调用父类存在的构造器。

简言之,子类构造方法中调用父类构造方法是“必须的”,如果程序员显式进行了调用,则编译器不提供额外帮助,如果程序员未通过 super()来调用,编译器就会帮助你插入super(),这时可能因为父类中没有无参构造器而得到一个编译错误。

我们知道构造方法可以用于给属性赋初值,而构造方法又不能被子类继承,那么在使用了继承后,如何同时调用父类和子类的构造方法,从而给所有的属性赋值呢?可以使用 super()

父类中没有无参构造器时,常见处理方式有以下两种:

在子类构造方法第一行显式的通过super([参数列表]),调用父类的某一个有参构造方法,如下所示。

public class Sup {
    public Sup( String arg){         
    }
}

class Sub extends Sup {
    public Sub(){
      super("argValue") ;          
      // ..
    }
}

先通过this([参数列表])调用本类中的其他构造方法,再在其他构造方法中通过super([参数列表])显式的调用父类的构造方法,如下所示。

public class Sup {
    public Sup( String arg){
    }
}

class Sub extends Sup {
    public Sub(){
        this(1) ;                   
    }
    public Sub(int a){
        super("argValue") ;         

    }
}

不难发现,以上形式的本质其实是一样的,都需要显式的写上super[参数列表]