1 / 11
文档名称:

关于Java你可能不知道的10件事.docx

格式:docx   页数:11
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

关于Java你可能不知道的10件事.docx

上传人:yuzonghong1 2016/7/9 文件大小:0 KB

下载得到文件列表

关于Java你可能不知道的10件事.docx

相关文档

文档介绍

文档介绍:关于 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 不理会受检异常?试试下面的这段代码: 1. public class Test { 2. 3. // 方法没有声明 throws 4. public static void main(String[] args) { 5. doThrow( new SQLException()); 6.} 7. 8. static void doThrow(Exception e) { 9. Test.<RuntimeException> doThrow0(e); 10. } 11. 12. ***@SuppressWarnings ( "unchecked" ) 13. static <E extends Exception> 14. void doThrow0(Exception e) throws E{ 15. throw (E) e; 16. } 17. } 不仅可以编译通过,并且也抛出了 SQLException ,你甚至都不需要用上 Lombok 的***@SneakyThrows 。更多细节,可以再看看这篇文章,或 Stack Overflow 上的这个问题。 2. 可以有只是返回类型不同的重载方法下面的代码不能编译,是吧? 1. class Test { 2. Object x() { return "abc" ;} 3. String x() { return "123" ;} 4. } 是的! Java 语言不允许一个类里有 2 个方法是『重载一致』的, 而不会关心这 2 个方法的 throws 子句或返回类型实际是不同的。但是等一下!来看看 (String, Class...) 方法的 Javadoc : 注意, 可能在一个类中会有多个匹配的方法, 因为尽管 Java 语言禁止在一个类中多个方法签名相同只是返回类型不同, 但是 JVM 并不禁止。这让 JVM 可以更灵活地去实现各种语言特性。比如,可以用桥方法(bridge method) 来实现方法的协变返回类型; 桥方法和被重载的方法可以有相同的方法签名,但返回类型不同。嗯,这个说的通。实际上,当写了下面的代码时,就发生了这样的情况: 1. abstract class Parent<T> { 2. abstract T x(); 3. } 4. 5. class Child extends Parent<String> { 6. ***@Override 7. String x() { return "abc" ;} 8. } 查看一下 Child 类所生成的字节码: 1. // Method descriptor #15 ()Ljava/lang/String; 2. // Stack: 1, Locals: 1 3. x(); ldc <String "abc" >[ 16 ] areturn 6. Line numbers: 7. [pc: 0, line: 7] 8. Local variable table: 9. [pc: 0, pc: 3] local: this index: 0 type: Child 10. 11. // Method descriptor #18 ()Ljava/lang/Object; 12. // Stack: 1, Locals: 1 13. bridge synthetic x(); 14. 0 aload_0 [ this ] 15. 1 invokevirtual () : [ 19 ] 16. 4