w88优德 - 关于 Java 你不知道的十件事

${website.getHeaderOriginal(${article.taxonomyName})}

··|--。(点击上方公众号··|,可快速关注)


编译:ImportNew - 心灵是一棵开花的树··|,


作为Java 控··|,我们总是对不太可能直接使用··|,但能使我们更了解 Java 和 Java 虚拟机(Java Virtual Machine··|,JVM) 的晦涩细节感兴趣··|--。这也是我将 Lukas Eder 在 jooq.org 上写的这篇文章发布出来的原因··|--。


你在Java发布的时候就开始使用了吗|-··?还记得那时它叫“Oak”··|,面向对象也 (Object Oriented··|, OO )还是个热门话题··|,C++ 程序员们觉得 Java 完全没机会成功··|,Applet的出现也是一件新鲜大事|-··?


我打赌下文中至少一半的内容你都不知道··|--。让我们来看看这些令人惊喜的 Java 细节吧··|--。


1. 受检异常(checked exception)这件事是不存在的


是这样的··|,JVM 完全不知道这件事··|,都是Java语言做的[只有Java语言这么干]··|--。


现在··|,异常检查被公认为是个错误··|,正如 Brue Eckel 在布拉格的 GeeCON 大会上的闭幕词中所说··|, Java 后的其他语言都不再使用异常检查了··|,就连 Java 8 都不愿在新的 Stream API 中使用它了(当你在 lambda 表达式中使用 IO 或者 JDBC 时··|,是很痛苦的)··|--。


你想要证明 JVM 不知道异常检查这件事吗|-··?尝试以下代码:


public class Test {

 

    // No throws clause here

    public static void main(String[] args) {

        doThrow(new SQLException());

    }

 

    static void doThrow(Exception e) {

        Test. doThrow0(e);

    }

 

    @SuppressWarnings("unchecked")

    static void doThrow0(Exception e) throws E {

        throw (E) e;

    }

}


这个不仅会编译··|,还会抛出 SQLException ··|,你甚至不需要 Lombok 的 @SneakyThrows 标签··|--。


更多详情请参考这篇文章··|,


https://blog.jooq.org/2012/09/14/throw-checked-exceptions-like-runtime-exceptions-in-java/


或者 Stack Overflow 上的这篇文章··|--。


http://stackoverflow.com/q/12580598/521799


2. 可以使用不同的返回值类型来重载方法


以下代码是编译不过的··|,对吧|-··?


class Test {

    Object x() { return "abc"; }

    String x() { return "123"; }

}


是的··|,Java 不允许在一个类中通过不同的返回值类型和异常语句来重载方法··|--。


不过稍等··|,Java 文档中关于 Class.getMethod(String, Class…) 这样写道:


请注意··|,在一个类中会有多个匹配的方法··|,因为虽然 Java 语法规则禁止一个类中存在多个方法函数签名相同仅仅返回类型不同··|,但 JVM 允许··|--。这样提高了 JVM 的灵活性以实现各种语言特性··|--。例如··|,可以用桥接方法(bridge method)来实现方法的协变返回类型··|,桥接方法和被重载的方法可以有相同的函数签名和不同的返回值类型··|--。


喔··|,这是合理的··|--。事实上··|,以下代码就是这样执行的··|,


abstract class Parent {

    abstract T x();

}

 

class Child extends Parent {

   @Override

    String x() { return "abc";}

}


Child 类编译后的字节码是这样的:


// Method descriptor #15 ()Ljava/lang/String;

// Stack: 1, Locals: 1

java.lang.String x();

  0  ldc

${website.getFooterOriginal(${article.taxonomyName})}

发布者 :w88优德_优德娱乐场w88_w88优德官方网站 - 分类 优德娱乐场w88

(必填)