当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,Java提供了super关键字,super关键字可以在子类中调用父类的普通属性、方法和构造方法。
下面详细讲解super关键字的具体用法。
1.使用super关键字访问父类的成员变量和成员方法,具体格式如下:
super.成员变量
super.成员方法(参数1,参数2...)
图1:下面通过一个案例学习使用super关键字访问父类的成员变量和成员方法, 修改图1中的代码,在Dog类中使用super关键字访问父类的shout()方法,修改后的代码如图2所示。
图2:
在图2中,第2~8行代码定义了一个Animal类,并在Animal类中定义了name属性和shout()方法。第10~19行代码定义了Dog类并继承了Animal类。 在Dog类的shout()方法中使用“super.shout()”调用了父类被重写的shout()方法。在printName()方法中使用“super.name”访问父类的成员变量name。从图2运行结果中可以看出,子类通过super关键字可以成功地访问父类成员变量和成员方法。
图2运行结果:
2.使用super关键字访问父类中指定的构造方法,具体格式如下:
super(参数1,参数2...)
下面通过一个案例学习如何使用super关键字调用父类的构造方法,如图3所示。
图3:
图3运行结果:在图3中,第29行代码使用super()调用了父类中有两个参数的构造方法;39~41行代码是在子类Dog中重写了父类Animal中的info()方法;第46~47行代码实例化了一个Dog对象并调用了info()方法。由图3运行结果可知,程序输出的内容是在子类中定义的内容。这说明,如果在子类中重写了父类的info()方法,使用子类的实例化对象调用info()方法时,会调用子类中的info()方法。
注意:
通过super()调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
super与this关键字的作用非常相似,都可以调用构造方法、普通方法和属性,但是两者之间还是有区别的,super与this的区别如图4所示。
图4:
需要注意的是,this和super两者不可以同时出现,因为this和super在调用构造方法时都要求必须放在构造方法的首行。