在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表和返回值类型,且在子类重写的方法不能拥有比父类方法更加严格的访问权限。
下面通过一个案例讲解方法的重写,具体代码如图1所示。
图1:图1运行结果:
在图1中,第2~7行代码定义了一个Animal类,并在Animal类中定义了一个shout()方法。第9~14行代码定义了Dog类继承Animal类,并在类中重写了父类Animal的shout()方法。第18~19行代码创建并实例化Dog类对象dog,并通过dog对象调用shout()方法。从图1运行结果可以看出,dog对象调用的是子类重写的shout()方法,而不是父类的shout()方法。
子类重写父类方法时,不能使用比父类中被重写方法更严格的访问权限。例如,父类中的方法是public权限,子类的方法就不能是private权限。如果子类在重写父类方法时定义的权限缩小,则在编译时将出现错误提示。下面对图1代码进行修改,修改后的代码如图2所示。
图2:编译图2代码时,编译报错,如图2运行结果所示 。
图2运行结果:
在图2中,第4行代码在Animal类中定义了一个shout()方法并将访问权限定义为public,第9~14行代码定义了一个Dog类并继承Animal类,第11行代码在声明shout()方法时,将shout()方法的访问权限定义为private。如图2运行结果所示,编译文件会报错,这是因为子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限。