super关键字表示对某个类的父类的引用。一般而言,super有两种通用形式:第一种用来访问被子类的成员隐藏的父类成员;第二种则是可以调用父类的构造函数。接下来说一下两种使用形式的方法和规则。
第一种:
如子类和父类有同名的成员变量或方法,则父类的成员将会被覆盖,此时可用下面的方式来引用父类的成员:
super.<成员变量名>
super.<成员方法名>
在Java语言中,用过继承关系实现对成员的访问是按照最近匹配原则进行的,规则如下:
(1)在子类中访问成员变量和方法时将优先查找是否在本类中已经定义,如果该成员在本类中存在,则使用本类的,否则,按照继承层次的顺序往父类查找,如果未找到,继续逐层向上到其祖先类查找。
(2)super特指访问父类的成员,使用super首先到直接父类查找匹配成员,如果未找到,再逐层向上到祖先类查找。
第二种:
子类可以通过super关键字调用父类中定义的构造方法,格式如下:
super(调用参数列表)
其中调用参数列表必须和父类的某个构造函数方法的参数列表完全匹配。
子类与其直接父类之间的构造方法存在约束关系,有以下几条重要原则:
(1)按继承关系,构造方法是从顶向下进行调用的。
(2)如果子类没有构造方法,则它默认调用父类无参的构造方法,如果父类中没有无参数的构造方法,则将产生错误。
(3)如果子类有构造方法,那么创建子类的对象时,先执行父类的构造方法,再执行子类的构造方法。
(4)如果子类有构造方法,但子类的构造方法中没有super关键字,则系统默认执行该构造方法时会产生super()代码,即该构造方法会调用父类无参数的构造方法。
(5)对于父类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必须是子类构造函数方法中的第一条语句。
(6)Java语言中规定当一个类中含有一个或多个有参构造方法,系统不提供默认的构造方法(即不含参数的构造方法),所以当父类中定义了多个有参数构造方法时,应考虑写一个无参数的构造方法,以防子类省略super关键字时出现错误。