- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于Java你可能不知道的10件事
关于Java你可能不知道的10件事呃,你是不是写Java已经有些年头了?还依稀记得这些吧: 那些年,它还叫做Oak;那些年,OO还是个热门话题;那些年,C++同学们觉得Java是没有出路的;那些年,Applet还风头正劲……但我打赌下面的这些事中至少有一半你还不知道。这周我们来聊聊这些会让你有些惊讶的Java内部的那些事儿吧。1. 其实没有受检异常(checked exception)是的!JVM才不知道这类事情,只有Java语言才会知道。今天,大家都赞同受检异常是个设计失误,一个Java语言中的设计失误。正如?Bruce Eckel?在布拉格的GeeCON会议上演示的总结中说的,?Java之后的其它语言都没有再涉及受检异常了,甚至Java?8的新式流API(Streams API)都不再拥抱受检异常 (以lambda的方式使用IO和JDBC,这个API用起来还是有些痛苦的。)想证明JVM不理会受检异常?试试下面的这段代码:public?class?Test?{???????//?方法没有声明throws?????public?static?void?main(String[]?args)?{?????????doThrow(new?SQLException());?????}???????static?void?doThrow(Exception?e)?{?????????Test.RuntimeException?doThrow0(e);?????}???????@SuppressWarnings(unchecked)?????static?E?extends?Exception?????void?doThrow0(Exception?e)?throws?E?{?????????throw?(E)?e;?????}?}?不仅可以编译通过,并且也抛出了SQLException,你甚至都不需要用上Lombok的@SneakyThrows。更多细节,可以再看看这篇文章,或Stack Overflow上的这个问题。2. 可以有只是返回类型不同的重载方法下面的代码不能编译,是吧?class?Test?{?????Object?x()?{?return?abc;?}?????String?x()?{?return?123;?}?}?是的!Java语言不允许一个类里有2个方法是『重载一致』的,而不会关心这2个方法的throws子句或返回类型实际是不同的。但是等一下!来看看Class.getMethod(String, Class...)方法的Javadoc:注意,可能在一个类中会有多个匹配的方法,因为尽管Java语言禁止在一个类中多个方法签名相同只是返回类型不同,但是JVM并不禁止。 这让JVM可以更灵活地去实现各种语言特性。比如,可以用桥方法(bridge method)来实现方法的协变返回类型;桥方法和被重载的方法可以有相同的方法签名,但返回类型不同。嗯,这个说的通。实际上,当写了下面的代码时,就发生了这样的情况:abstract?class?ParentT?{?????abstract?T?x();?}???class?Child?extends?ParentString?{?????@Override?????String?x()?{?return?abc;?}?}?查看一下Child类所生成的字节码://?Method?descriptor?#15?()Ljava/lang/String;?//?Stack:?1,?Locals:?1?java.lang.String?x();???0??ldc?String?abc?[16]???2??areturn?????Line?numbers:???????[pc:?0,?line:?7]?????Local?variable?table:???????[pc:?0,?pc:?3]?local:?this?index:?0?type:?Child???//?Method?descriptor?#18?()Ljava/lang/Object;?//?Stack:?1,?Locals:?1?bridge?synthetic?java.lang.Object?x();???0??aload_0?[this]???1??invokevirtual?Child.x()?:?java.lang.String?[19]???4??areturn?????Line?numbers:???????[pc:?0,?line:?1]?在字节码中,T实际上就是Object类型。这很好理解。合成的桥方法实际上是由编译器生成的,因为在一些调用场景下,Parent.x()方法签名的返回类型期望是Object。 添
您可能关注的文档
- 二能级系统的布居囚禁现象!.PDF
- 于泡在LIMCA系中形的.PDF
- 云阳县鑫诚清洁有限公司推土机政府采购.doc
- 五、教学杰出教师教学经验分享.PDF
- 交易所支持的特殊指令详解.PDF
- 交流输入直流无刷电机驱动器.PDF
- 产_苯丙氨酸变位酶基因工程菌的构建及其发酵条件优化_葛飞.pdf
- 产品代码LR5A25.PDF
- 产品性.PDF
- 产权证明》的说明.PDF
- DB44_T 2611-2025 城市排水管网有毒有害气体监测与风险分级管理技术标准.pdf
- DB44_T 2612-2025 竞赛类科普活动策划与实施服务规范.pdf
- DB43_T 2947-2024 烟草种子质量控制规程.pdf
- DB37_T 4836-2025 煤矿风量实时监测技术要求.pdf
- 叉车防撞系统,全球前22强生产商排名及市场份额(by QYResearch).docx
- 超滤膜,全球前18强生产商排名及市场份额(by QYResearch).docx
- DB62T 4172-2020 玉米品种 酒623规范.pdf
- DB62T 4160-2020 在用真空绝热深冷压力容器综合性能在线检测方法.pdf
- DB62T 4164-2020 辣椒品种 酒椒1号.pdf
- DB62T 4133-2020 公路隧道地质超前预报机械能无损探测技术规程.pdf
文档评论(0)