JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
来源:互联网 发布:淘宝客怎么修改pid 编辑:程序博客网 时间:2024/06/05 14:38
JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
今天看视频的时候,方立勋老师说到这个问题,他举出一个例子,说父亲有一个错误的方法,导致自己可能犯错,可能杀人放火。儿子继承了父亲这个方法,那么儿子肯定不能比父亲更坏,不能够在杀人放火的基础上还调戏妇女。
听到这个问题之后,我就觉得不对劲。即便是模拟现实,儿子不能比父亲更加差劲这种东西也太违背自然规律了,因为社会上存在着很多比父亲差劲的儿子。而且并不是每一个抢劫犯都是抢劫犯的儿子。也并不是每一个不抢劫的人,生不出抢劫犯儿子。
后来自己就这个问题思考了下。
得出以下的结论,当然,该结论虽然让我觉得比较正确,也不能确定其真伪。
子类在覆盖父类方法的时候,父类的引用是可以调用该方法的,如果父类的引用调用子类的方法,那么这个多抛出来的异常,就可能处于一种无法被处理的状态。下面,我就通过代码进行一下演示:
我们先定义一个Animal类:
class Animal{public void eat()throws IOException,FileNotFoundException{System.out.println("eat");}}
接着,我们再定义一个Tiger类继承该Animal类
class Tiger extends Animal{public void eat()throws IOException ,Exception{System.out.println("Tiger eat animal");}}
这样,tiger的eat方法里,就有一个Exception 异常,这个异常的级别高于IO。也就是说对IO异常的处理,无法处理Exception 异常。
这个时候,如果我们定义一个测试方法,测试动物吃东西这个方法。
如下:
class Test{ public void TestAnimalEat(Animal a) { try { a.eat(); } catch(FileNotFoundException e1) { e1.printStackTrace(); } catch(IOException e2) { e2.printStackTrace(); } }}
那么,这个方法是完全正确的,因为他处理了eat方法的两个异常。一个抛出,一个捕获。
这个时候,如果我们再进行如下的操作:
class TestDemo{public static void main(String[] args) {Test t = new Test();Tiger tiger = new Tiger();t.TestAnimalEat(tiger);}}
则在调用tiger对象的时候,Test中的TestAnimalEat()方法只处理Animal类的eat()方法的两个异常,而这个Tiger类中的eat()方法多出来的Exception,就无法进行处理。所以,JAVA就不允许做这种子类抛出比父类更多的异常。
当然,这里说更多是不合适的,子类不能抛出父类异常本身和其子异常以外的其他异常。比如,如果父类抛出一个Exception 异常,那么子类就可以随心所欲的抛出很多的异常了。因为这些异常都是父类异常的子异常。
那么如果要联系现实,应该如何说呢。
一个修理家电的人,他能够修理冰箱,电脑,洗衣机,电视机。 一个年轻人从他这里学的技术,就只能修理这些家电,或者更少。你不能要求他教出来的徒弟用从他这里学的技术去修理直升飞机。
这个说法和老师说法其实也比较一致,但是徒弟这个说法可能比儿子这个说法,更加容易理解吧。
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- 为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- 子类抛出的异常类型不能比父类抛出的异常类型更宽泛!
- 子类重写父类的方法时声明抛出异常不能比父类范围大
- 子类重写父类的方法时声明抛出异常不能比父类范围大
- 方法覆盖子类不能抛出比父类范围更大的异常
- Java 中子类重写父类的方法时声明抛出异常不能比父类范围大
- 子类重写父类的方法时声明抛出异常不能比父类范围大(转)
- 子类重写父类的方法时声明抛出异常不能比父类范围大(转自http://chenpingtai2008.javaeye.com/blog/246435)
- 子类不能继承或覆盖父类的private方法
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- JAVA 子类不能继承父类的构造函数
- java中如何让一个子类不能调用从父类继承的方法
- hdu 2680 Choose the best route
- Apache Ant 实例介绍,以及部分标签介绍
- 进制转换模板 (十进制 < == > 任意进制 )
- 费用流 poj3680 Intervals
- hdu 1754 I Hate It(线段树点修改)
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?
- 搭建部署zabbix
- uva 1614Hell on the Markets
- 计算mysql内存使用
- extjs 在toolbar中加入文本框 下拉框
- ACM经典算法之数据结构
- MSP430G2553与MSP430F5336系列单片机总结[0]——概述
- POJ 4014
- 先尝试后决策