前言
经过4次跳票,历经曲折的Java 9 终于终于在2017年9月21日发布。
从Java 9 这个版本开始,Java 的计划发布周期是 6 个月,下一个 Java 的主版本将于 2018 年 3 月发布,命名为 Java 18.3,紧接着再过六个月将发布 Java18.9。
这意味着Java的更新从传统的以特性驱动的发布周期,转变为以时间驱动的 (6 个月为周期)发布模式,并逐步的将 Oracle JDK 原商业特性进行开源。
针对企业客户的需求,Oracle 将以三年为周期发布长期支持版本(longtermsupport)。
Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互 的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。可以说Java 9是一个庞大的系统工程,完全做了一个整体改变。
Java的REPL工具: jShell命令
产生背景
像Python 和 Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print - loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码, 就可以在编译前获得对程序的反馈。而之前的Java版本要想执行代码,必须创建文 件、声明类、提供测试方法方可实现。
设计理念
即写即得、快速运行
实现目标
Java 9 中终于拥有了 REPL工具:jShell。让Java可以像脚本语言一样运行,从 控制台启动jShell,利用jShell在没有创建类的情况下直接声明变量,计算表达式, 执行语句。即开发时可以在命令行里直接运行Java的代码,而无需创建Java文件,无需跟人解释”public static void main(String[] args)”这句废话。
jShell也可以从文件中加载语句或者将语句保存到文件中。
jShell也可以是tab键进行自动补全和自动添加分号。
调出jShell
获取帮助
基本使用
导入指定的包
默认已经导入如下的所有包:(包含java.lang包) :
Tips:在 JShell 环境下,语句末尾的“;” 是可 选的。但推荐还是最好加上。提高代码可读 性。
查看当前 session 下所有创建过的变量
查看当前 session 下所有创建过的方法
Tips:我们还可以重新定义相同方法名和参数列表的方法,即为对现有方法的修改(或覆盖)。
使用外部代码编辑器来编写 Java 代码
只需按下 Tab 键,就能自动补全代码
列出当前 session 里所有有效的代码片段
使用/open命令调用:
没有受检异常(编译时异常)
说明:本来应该强迫我们捕获一个IOException,但却没有出现。因为jShell在 后台为我们隐藏了。
退出jShell
语法改进:接口的私有方法
Java 8中规定接口中的方法除了抽象方法之外,还可以定义静态方法 和默认的方法。一定程度上,扩展了接口的功能,此时的接口更像是 一个抽象类。 在Java 9中,接口更加的灵活和强大,连方法的访问权限修饰符都可 以声明为private的了,此时方法将不会成为你对外暴露的API的一部分。
1. class MyInterfaceImpl implements MyInterface { 2. 3. @Override 4. 5. public void normalInterfaceMethod() { 6. 7. System.out.println("实现接口的方法"); 8. } 9. } 10. 11. public class MyInterfaceTest { 12. 13. public static void main(String[] args) { 14. MyInterfaceImpl impl = new MyInterfaceImpl(); 15. 16. impl.methodDefault1(); 17. 18. // impl.init();//不能调用 19. 20. } 21. }
语法改进:钻石操作符使用升级
我们将能够与匿名实现类共同使用钻石操作符(diamond operator)在Java 8中如下的操作是会报错的:
1. Comparator<Object> com = new Comparator<>(){ 2. 3. @Override 4. 5. public int compare(Object o1, Object o2) { 6. 7. return 0; 8. 9. } 10. 11. };
编译报错信息:Cannot use “<>” with anonymous inner classes.
Java 9中如下操作可以正常执行通过:
1. // anonymous classes can now use type inference 2. 3. Comparator<Object> com = new Comparator<>(){ 4. 5. @Override 6. 7. public int compare(Object o1, Object o2) { 8. 9. return 0; 10. 11. } 12. 13. };