上节回顾
本节重点
重写的定义
重写中使用super关键字
重写和重载和区别
为什么要重写呢?
父类已经有这个功能的方法了,子类假如有相同功能的方法,使用重写的方式更加便利,
不会造成子类既继承得到了父类的这个功能,又自己拥有一个同样的功能而方法名却不一
样的尴尬境地。
继承是多态的前提,重写方法也是为了多态的扩展性的。
重写的定义
重写是子类对父类的允许访问的方法的实现过程进行重新编写的过程,要求方法名和参数列
表不变(方法的签名)即外壳不变,核心重写!
@override的作用
可以当注释用,方便阅读;
编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。
例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译
通过的,因为编译器以为这个方法是你的子类中自己增加的方法。
测试类
在上面的例子中可以看到,尽管b属于Animal类型,但是它运行的是Dog类的move方法。
这是由于在编译阶段,只是检查参数的引用类型。
然而在运行时,Java虚拟机(JVM)指定对象的类型(Dog类型)并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为Animal类中存在move方法,然而运行时,
运行的是特定对象(Dog类)的方法。
故而当子类对象的重写方法被调用时,无论是通过子类的引用调用还是父类的引用调用,运行
的是子类重写后的方法。
思考:子类中定义方法,用Animal的引用b能不能调到?
测试:
该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。
重写中使用super关键字
当需要在子类中调用父类的被重写方法时,需要用到super关键字
测试
案例
群发邮件
Email父类
myEmail子类
重载和重写的区别
重载(overload)
重载是发生在一个类里,要求方法名相同,参数列表不同。
常用于构造器的重载
重载规则:
被重载的方法必须参数类型,个数,顺序不同
方法的重载与修饰符和返回值无关
方法的重载要求发生在一个类中
重写(override)
重写以继承为基础,是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和参数
列表还有方法名都不允许变,外壳不变,核心重写
重写规则:
两同(方法名相同,参数类型相同)
重写的方法方法名必须和被重写方法一致
重写的方法参数列表必须保持一致
两小(返回值类型、异常)
Son类中重写Father的方法,Father的返回值为A,那么Son类的返回值类型,只能是A或A的子
类,不能是Object,也就是?只能是A或B,不能是Object。
声明异常的小指的跟返回值类型的小是一样的,比如父类声明了 一个父类异常IOException 那
么子类声明的异常只能是IOException或其子类,不能是IOException的父类;
并且子类的声明异常要被父类声明的异常包含,什么意思呢?比如父类声明了多个异常,子类
只能声明父类声明的异常被包含的范围内,
比如,父类声明了A,B,C异常,子类只能最多声明A,B,C当然,子类只声明A也是可以的
但是这里有点小特殊的地方:比如父类声明了A异常,子类重写的方法声明多个A异常的子
类,是可以的。(其实意思就是子类重写的方法声明的异常是父类声明的异常被包含的范围
内)
一大
总结
重载(overload)和重写(override)的区别

方法的重写和重载是Java 多态性的不同表现,重写是父类与子类之间多态性的一种表现,重
载可以理解为是多态的具体表现形式。
标签: