ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Java基础】方法重写为什么不能抛出比父类更多的异常?

2019-09-17 14:08:17  阅读:416  来源: 互联网

标签:Java 比父 异常 方法 Tiger Animal 父类 重写 eat


原文链接:https://blog.csdn.net/fortheother/article/details/10087713

        今天看视频的时候,方立勋老师说到这个问题,他举出一个例子,说父亲有一个错误的方法,导致自己可能犯错,可能杀人放火。儿子继承了父亲这个方法,那么儿子肯定不能比父亲更坏,不能够在杀人放火的基础上还调戏妇女。

      

         听到这个问题之后,我就觉得不对劲。即便是模拟现实,儿子不能比父亲更加差劲这种东西也太违背自然规律了,因为社会上存在着很多比父亲差劲的儿子。而且并不是每一个抢劫犯都是抢劫犯的儿子。也并不是每一个不抢劫的人,生不出抢劫犯儿子。

     

        后来自己就这个问题思考了下。

         得出以下的结论,当然,该结论虽然让我觉得比较正确,也不能确定其真伪。

   

         子类在覆盖父类方法的时候,父类的引用是可以调用该方法的,如果父类的引用调用子类的方法,那么这个多抛出来的异常,就可能处于一种无法被处理的状态。下面,我就通过代码进行一下演示:


       我们先定义一个Animal类:

    

  1. class Animal
  2. {
  3. public void eat()throws IOException,FileNotFoundException
  4. {
  5. System.out.println("eat");
  6. }
  7. }

  接着,我们再定义一个Tiger类继承该Animal类


  1. class Tiger extends Animal
  2. {
  3. public void eat()throws IOException ,Exception
  4. {
  5. System.out.println("Tiger eat animal");
  6. }
  7. }

这样,tiger的eat方法里,就有一个Exception 异常,这个异常的级别高于IO。也就是说对IO异常的处理,无法处理Exception 异常。

这个时候,如果我们定义一个测试方法,测试动物吃东西这个方法。

如下:

  1. class Test
  2. {
  3.     public void TestAnimalEat(Animal a)
  4.     {
  5.         try
  6.         {
  7.             a.eat();
  8.         }
  9.         catch(FileNotFoundException e1)
  10.         {
  11.             e1.printStackTrace();
  12.         }
  13.         catch(IOException e2)
  14.         {
  15.             e2.printStackTrace();
  16.         }
  17.         
  18.     }
  19. }

那么,这个方法是完全正确的,因为他处理了eat方法的两个异常。一个抛出,一个捕获。

这个时候,如果我们再进行如下的操作:

  1. class TestDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. Test t = new Test();
  6. Tiger tiger = new Tiger();
  7. t.TestAnimalEat(tiger);
  8. }
  9. }

则在调用tiger对象的时候,Test中的TestAnimalEat()方法只处理Animal类的eat()方法的两个异常,而这个Tiger类中的eat()方法多出来的Exception,就无法进行处理。所以,JAVA就不允许做这种子类抛出比父类更多的异常。


当然,这里说更多是不合适的,子类不能抛出父类异常本身和其子异常以外的其他异常。比如,如果父类抛出一个Exception 异常,那么子类就可以随心所欲的抛出很多的异常了。因为这些异常都是父类异常的子异常。

        

 

那么如果要联系现实,应该如何说呢。

        一个修理家电的人,他能够修理冰箱,电脑,洗衣机,电视机。 一个年轻人从他这里学的技术,就只能修理这些家电,或者更少。你不能要求他教出来的徒弟用从他这里学的技术去修理直升飞机。


      这个说法和老师说法其实也比较一致,但是徒弟这个说法可能比儿子这个说法,更加容易理解吧。

标签:Java,比父,异常,方法,Tiger,Animal,父类,重写,eat
来源: https://blog.csdn.net/zzf_forgot/article/details/100924159

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有