方法覆盖(Override)中的一些问题 1
2016-03-03 19:54
190 查看
解释一:
A a = new B();
a.test();
编译时调用 类A 中test(),抛出异常,
实际调用的是 类B 中的 test(),
如果类B中的 方法抛出了 更大的异常,这样就无法捕获了。
解释二:
接口定义的是某种规范或约束,相当于签了合同,具体事情怎么做不管,但不能违反法律和合同条款。
接口的实现类的可见性,异常等范围都要小于等于接口就是一个接口的“法律”,或者说约束条件。
如果没有这个约束,程序将不可预见和控制。
主要是两点原因,1.面向接口编程时,是不考虑具体实现类的(可能有很多实现,在处理业务逻辑时才去实现)
2.从异常的捕获方式来说,try{}catch(SQLException e){}可以捕获到指定的异常及其子异常。
因此,如存在接口A的方法am1抛出SQL异常,对于面向接口的编程来说,此类异常是可预见的,可以定制一些对应的异常捕获和处理方式。
如果一个实现类抛出SQL异常,或者SQL异常的子异常(如BatchUpdateException),那就是可以预期的,可以捕获并处理。
但如果实现类抛出的是IOException,不在SQLExcepton的范围,你无法预知,所以也是无法处理的。
A a = new B();
a.test();
编译时调用 类A 中test(),抛出异常,
实际调用的是 类B 中的 test(),
如果类B中的 方法抛出了 更大的异常,这样就无法捕获了。
解释二:
接口定义的是某种规范或约束,相当于签了合同,具体事情怎么做不管,但不能违反法律和合同条款。
接口的实现类的可见性,异常等范围都要小于等于接口就是一个接口的“法律”,或者说约束条件。
如果没有这个约束,程序将不可预见和控制。
主要是两点原因,1.面向接口编程时,是不考虑具体实现类的(可能有很多实现,在处理业务逻辑时才去实现)
2.从异常的捕获方式来说,try{}catch(SQLException e){}可以捕获到指定的异常及其子异常。
因此,如存在接口A的方法am1抛出SQL异常,对于面向接口的编程来说,此类异常是可预见的,可以定制一些对应的异常捕获和处理方式。
如果一个实现类抛出SQL异常,或者SQL异常的子异常(如BatchUpdateException),那就是可以预期的,可以捕获并处理。
但如果实现类抛出的是IOException,不在SQLExcepton的范围,你无法预知,所以也是无法处理的。
相关文章推荐
- 1044. 火星数字(20)
- 根据文本生成位图
- SFTP 实践
- Java获取、删除文件和目录
- gradle多渠道打包及友盟统计-eclipse版本
- 多种非接触卡 ATQA 字节说明
- Class Of Marquee Scroll通用不间断滚动JS脚本
- HDOJ-2057(A + B Again)
- 旋转字符串的三种算法
- 镜像二叉树
- iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)
- Quarta介绍
- Intellij IDEA快捷键与使用技巧
- uva 11800 基础几何的图形判断
- leetcode之Partition List
- Intellij IDEA快捷键与使用技巧
- Codeforces Round #201 (Div. 2) - C. Alice and Bob
- windows expect-5.21r1b1-setup.exe 下载链接
- 第一周作业
- 浏览器缓存机制