作为 Java 书呆子,比起实用技能,我们会对介绍 Java 和 JVM 的概念细节更感兴趣。因此我想推荐 Lukas Eder 在 jooq.org 发表的原创作品给大家。 你是从很早开始就一直使用 Java 吗?那你还记得它的过去吗?那时,Java 还叫 Oak,OO 还是一个热门话题,C 的 folk 者认为 Java 是不可能火起来,Java 开发的小应用程序 Applets 还受到关注。 我敢打赌,下面我要介绍的这些事,有一半你都不知道。下面让我们来深入探索 Java 的神秘之处。 1. 没有检查异常这种事情 没错!JVM 不会知道这些事情,只有 Java 语句知道。 如今大家都认为检查异常是个错误。正如 Bruce Eckel 在布拉格 GeeCON 闭幕时所说,Java 之后再没别的语言检查异常,甚至 Java 8 在新的 Stream API 中也不再干这个事情(如果你的 Lambda 使用 IO 和 JDBC,这其实还是有点痛苦)。 如何证实 JVM 并不清楚检查异常一事?试试下面的代码:
这不仅可以编译通过,它还可以抛出 SQLException。你甚至不需要 Lombok 的@SneakyThrows就能办到。 这篇文章可以看到更详细的相关内容,或者在Stack Overflow上看。 2. 你可以定义仅在返回值有差异的重载函数 这样的代码无法编译,对不?
对。 Java 语言不允许两个方法在同一个类中“等效重载”,而忽略其诸如throws自居或返回类型等的潜在的差异。 查看Class.getMethod(String, Class…)的 Javadoc。 其中说明如下: 请注意,类中可能有多个匹配方法,因为 Java 语言禁止在一个类声明具有相同签名但返回类型不同的多个方法,但 Java 虚拟机并不是如此。虚拟机中增加的灵活性可以用于实现各种语言特征。例如,可以用桥接方法实现协变参返回; 桥接方法和被重写的方法将具有相同的签名但拥有不同的返回类型。 哇哦,有道理。实际上下面的代码暗藏着很多事情:
|