黑马程序员技术交流社区

标题: 关于java中方法重写的一些完整总结 [打印本页]

作者: 冯越    时间: 2012-5-16 13:36
标题: 关于java中方法重写的一些完整总结
关于java中方法的重写要求我想大家都一定非常熟悉了吧,但我想大家熟悉但并不一定知道的完整。今天我在学习过张孝祥老师的视频之后,又看书查了一下资料,就索性把方法重写的要求做一下总结吧!
1.子类中的方法与父类中的方法有相同的返回类型(或者返回类型是父类返回类型的子类)
2.子类中的方法与父类中的方法有相同的方法名称
3.子类中的方法必须和父类中的方法有相同的参数列表
4.子类中的方法的访问级别不能低于父类中该方法的访问级别(举例:父类方法级别是protected,那么子类重写该方法,访问级别必须是protected或者public,一定和父类的访问级别相同或更宽,否则编译无法通过)
5.子类中方法抛出的异常范围不能大于父类中该方法抛出异常的范围(子类不抛出异常也满足该原则或者父类未抛出异常而子类抛出RuntimeException这也是可以的的!因为编译器是不强制检查RuntimeException的)
关于第五条我一直都想不明白为什么要这样设计,后来看到《Thinking in java》上面有对这一点的介绍,但那蹩脚的翻译实在是让我看的迷茫。又鉴于自己英语能力有限无法去阅读英文原版,所以只能自己思考。我也不知道这样想是否正确。我的理解是这样的:子类中方法抛出的异常范围不能大于父类中该方法抛出异常的范围。试想如何编译器允许子类中方法中抛出的异常比父类中该方法抛出的异常宽泛。当此子类对象向上转型(upcast)时,父类对象引用调用该子类对象方法时编译器就不会强制要求抛出或catch子类方法所独有而父类方法中所没有的异常。而该方法又确确实实会抛出异常。这样我们的异常处理机制就失灵了就起不到相应的作用了。所以,通过强制子类遵守父类方法的异常说明,对象的可替换性就得到了保证。
希望我的总结可以对大家有所帮助。
作者: 袁錦泰    时间: 2012-5-16 15:54
我为你補充一點,關於第五點異常:
如果子類異常不屬於RuntimeException,你該怎樣處理?
這時就必須做try{}catch{}處理.我說這個是提醒你在子類繼承父類后做異常處理時不要一味的拋出RuntimeException,那樣不太合適.
作者: 冯越    时间: 2012-5-16 20:18
袁錦泰 发表于 2012-5-16 15:54
我为你補充一點,關於第五點異常:
如果子類異常不屬於RuntimeException,你該怎樣處理?
這時就必須做try{}cat ...

除了RuntimeException 子类不可能抛出父类中不存在的异常吧。
作者: 袁錦泰    时间: 2012-5-16 20:22
本帖最后由 袁錦泰 于 2012-5-16 20:33 编辑
冯越 发表于 2012-5-16 20:18
除了RuntimeException 子类不可能抛出父类中不存在的异常吧。

我说的不是父类存在异常,而是子类继承父类之后自身需要做预期考虑并对可能发生的异常做出处理。父类不存在异常不代表其子类也肯定没有异常发生,你可以看一下视频或者问一下老师和同学,这之是我个人的观点,如果你经过求证之后证明我说的存在偏差请回复并纠正我,谢谢。
作者: 冯越    时间: 2012-5-16 20:49
袁錦泰 发表于 2012-5-16 20:22
我说的不是父类存在异常,而是子类继承父类之后自身需要做预期考虑并对可能发生的异常做出处理。父类不存 ...

你说的是 try catch 我说的是 throws




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2