一、什么是super?
它是一个指代变量,是直接父类对象的引用,用于在子类中指代父类对象。
二、应用范围
只能用于子类的构造函数和实例方法中,不能用于子类的类(静态)方法中。
原因:super指代的是一个父类的对象,是需要在运行时被创建的,而静态方法是类方法,它是类的一部分。在类被载入时,方法已经存在,但是父类对象还没被创建。
三、如何使用
(一)通过super关键字在子类中调用父类的成员变量或方法
可用下列方式调用:
1 | super.<成员变量名> |
1 | /** |
测试结果:
(二)通过super关键字调用父类中定义的构造方法
可用下列方式调用:
1 | super() //调用无参构造器 |
其中调用参数列表必须和父类的某个构造函数方法的参数列表完全匹配。
子类与其直接父类之间的构造方法存在约束关系,有以下几条重要原则:
(1)按继承关系,构造方法是从顶向下进行调用的。
(2)如果子类没有构造方法,则它默认调用父类无参的构造方法,如果父类中没有无参数的构造方法,则将产生错误。
(3)如果子类有构造方法,那么创建子类的对象时,先执行父类的构造方法,再执行子类的构造方法。
(4)如果子类有构造方法,但子类的构造方法中没有super关键字,则系统默认执行该构造方法时会产生super()代码,即该构造方法会调用父类无参数的构造方法。
(5)对于父类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必须是子类构造函数方法中的第一条语句。
(6)Java语言中规定当一个类中含有一个或多个有参构造方法,系统不提供默认的构造方法(即不含参数的构造方法),所以当父类中定义了多个有参数构造方法时,应考虑写一个无参数的构造方法,以防子类省略super关键字时出现错误。
(7) 子类的静态方法中不能使用super关键字。
1 | /** |
测试结果:
1 | /** |
测试结果:
三、总结
1、通过super关键字在子类中调用父类的成员变量或方法
2、通过super关键字调用父类中定义的构造方法
Java新手,若有错误,欢迎指正!