Java9在语言上并没有添加太多的新特性,但在使用、性能上做了很改进。

一、模块间引用

Java9添加了模块化的概念,使得之前的控制访问权限有了改变。
之前:

  • public
  • protect
  • (default,package)
  • private

Java9

  • public to everyone
  • public but only for specific user
  • public within a module
  • protect
  • (default,package)
  • private

可以看到,对public类又做了进一步的限制,主要是对模块间的依赖做出限制,使得模块能够控制那些public类型能够被其他模块读取,以及该模块需要使用其他模块的类型。

如何定义模块

在src根目录下,创建module-info.java:

// 该模块的名称为 module.one
module module.one {// 该包下的所有public类型对其他模块可见export package.name;// 该public类型对其他模块可见export class.name;
}
// 该模块的名称为 module.two
module module.two {// 该模块将引用模块1// 该模块将能够使用模块1所开放的public类型// 其他的pubic类型将不可见require module.one;
}

以上是最简单的模块使用方式。

二、多版本jar包支持

即在不同java版本下,执行相应版本的代码。比如DateUtil.java,若在java7环境下,将执行java7的代码,在java8的环境下,将执行java8的代码。
在发布新版本的java后,用户可能不会升级到新环境, 但是项目可能会开始逐步升级到新版本,来提前适应即将到来的环境。此时就要对多个版本的支持。

实现

$ javac --release 11 java11/com/xiao/test/Tester.java
$ javac --release 8 java8/com/xiao/test/Tester.java
$ tree
.
├── java11
│   └── com
│       └── xiao
│           └── test
│               ├── Tester.class
│               └── Tester.java
└── java8└── com└── xiao└── test├── Tester.class└── Tester.java8 directories, 4 files
$ jar -v -c -f multiversion.jar -C java8 com/xiao/test/Tester.class --release 11 -C java11 com/xiao/test/Tester.class
已添加清单
正在添加: com/xiao/test/Tester.class(输入 = 428) (输出 = 296)(压缩了 30%)
正在添加: META-INF/versions/11/com/xiao/test/Tester.class(输入 = 429) (输出 = 296)(压缩了 31%)
$  ls
java11            java8            multiversion.jar
$ /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/bin/java -cp multiversion.jar com.xiao.test.Tester
In Java8
$ /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/bin/java -cp multiversion.jar com.xiao.test.Tester
In Java11

三、Interface增强(可添加私有方法)

public interface PrivateMethod {// java7以前// 默认为 public static finalString NAME = "xiao";// 默认为 publicString get();// java8default void giveMyMoney() {System.out.println("No way!!!");}static void makeFriend() {System.out.println("Hello, my friend.");}// java9private void show() {System.out.println("Nobody can find me.");}
}

四、JShell

提供互交式的工具。

$ jshell
|  欢迎使用 JShell -- 版本 11.0.1
|  要大致了解该版本, 请键入: /help introjshell> /help intr
|
|                                   intro
|                                   =====
|
|  使用 jshell 工具可以执行 Java 代码,从而立即获取结果。
|  您可以输入 Java 定义(变量、方法、类等等),例如:int x = 8
|  或 Java 表达式,例如:x + x
|  或 Java 语句或导入。
|  这些小块的 Java 代码称为“片段”。
|
|  这些 jshell 工具命令还可以让您了解和
|  控制您正在执行的操作,例如:/list
|
|  有关命令的列表,请执行:/helpjshell> System.out.println("The first time use jshell");
The first time use jshelljshell> String a = "xiao"
a ==> "xiao"jshell> System.out.println("name" + a)
namexiaojshell> System.out.println("name:" + a)
name:xiaojshell>

五、try/catch增强

Java6以及之前的版本中,在使用一些资源时,通常会使用try/catch语句,并且在finally语句中来关闭资源,Java7做了改进,Java9也做了一点改进。

public class TryCatchImprove {public static void main(String[] args) {// Java 6 or early// 使用的资源,建议都在finally块中关闭InputStreamReader inputStream7 = new InputStreamReader(System.in);try {int i = inputStream7.read();} catch (IOException ie) {ie.printStackTrace();} finally {try {inputStream7.close();} catch (IOException ie) {ie.printStackTrace();}}// Java 7,8// 当有多个资源被使用时,括号中使用 ; 分割,不再需要finally语句块try (InputStreamReader inputStream8 = new InputStreamReader(System.in)) {int i = inputStream8.read();} catch (IOException ie) {ie.printStackTrace();}// Java 9// 能够直接在try的括号中使用变量,多个变量时用 ; 分割InputStreamReader inputStream9 = new InputStreamReader(System.in);try (inputStream9) {int i = inputStream9.read(); } catch (IOException ie) {ie.printStackTrace();}}
}

参考

更多更详细的特性,可以参照以下:

  • Oracle

    • What’s New in Oracle JDK 9:https://docs.oracle.com/javas...
    • Java Language Updates :https://docs.oracle.com/javas...
  • Blog

    • NewImport:http://www.importnew.com/2452...
    • http://www.runoob.com/java/ja...

Java 9 新特性相关推荐

  1. IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍

    文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...

  2. Java 11 新特性

    2019独角兽企业重金招聘Python工程师标准>>> Java 11 新特性 转载于:https://my.oschina.net/u/3764794/blog/2993127

  3. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  4. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  5. 跟我学 Java 8 新特性之 Stream 流(六)收集

    转载自   跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...

  6. 跟我学 Java 8 新特性之 Stream 流基础体验

    转载自   跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...

  7. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点

    转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...

  8. 跟我学 Java 8 新特性之 Stream 流(三)缩减操作

    转载自   跟我学 Java 8 新特性之 Stream 流(三)缩减操作 和前面两篇文章一起服用,效果会更佳.通过对流API的基础体验Demo和关键知识点的讲解,相信大家对流API都有一定的认识了, ...

  9. 跟我学 Java 8 新特性之 Stream 流(四)并行流

    转载自   跟我学 Java 8 新特性之 Stream 流(四)并行流 随着对流API认识的慢慢深入,本章我们要讨论的知识点是流API里面的并行流了. 在开始讨论并行流之前,我先引发一下大家的思考, ...

  10. 跟我学 Java 8 新特性之 Stream 流(五)映射

    转载自   跟我学 Java 8 新特性之 Stream 流(五)映射 经过了前面四篇文章的学习,相信大家对Stream流已经是相当的熟悉了,同时也掌握了一些高级功能了,如果你之前有阅读过集合框架的基 ...

最新文章

  1. Python系统调用——运行其他程序
  2. hutool 读取扩展名文件_JPG,PNG,GIF,TIFF、SVG玩设计必须了解的文件格式你知道几个?...
  3. JVM内存管理------垃圾搜集器参数精解
  4. 黄金寨景区、缥缈间温泉2019北京推介会成功举办
  5. 学习hibernate(五) -- hibernate映射关系
  6. 【C语言】爱心表白代码
  7. Java_管家婆项目(三十一)——管家婆家庭记账软件(项目环境搭建、功能模块、代码)、后附网盘链接
  8. Microsoft Agent技术在Delphi中的应用
  9. 【第158期】游戏策划:给@zhang的简历分析
  10. 视频教程-SAP快速入门-其他
  11. 《指数基金投资指南》读书笔记
  12. 校招经历-java开发面试题
  13. U盘插入之后有声音但是无法显示打开U盘
  14. 【信号与系统学习笔记】—— 拉普拉斯变换的性质分析
  15. 蓝湖怎么切图标注_如何用蓝湖做自动标注 ?
  16. 【机器学习炼丹炉】使用便宜的x99和二手显卡,单显卡的学习机器在3000元,多显卡更贵,可以用支架,架起显卡,用做算法的学习使用,模型训练需要显卡的算力支持,低成本做算法研究,万一从入门到放弃了呢
  17. vue 项目获取QQ音乐歌单数据
  18. 【Linux】之【网络】相关的命令及解析[ethtool、nload、nethogs、iftop、iptraf、ifstat]
  19. AI独立开发者:一周涨粉8万赚2W美元;推特#HustleGPT GPT-4创业挑战;即刻#AIHackathon创业者在行动 | ShowMeAI周刊
  20. js + leetcode刷题:No.914 卡牌分组

热门文章

  1. vmware+android+4.3,Vmware虚拟机安装安卓4.0系统教程
  2. javascript 字符串中间隔固定位置插入字符
  3. 二十四、哈希表的原理分析及代码实现
  4. Chart.js-极区图分析(参数分析+例图)
  5. CVPR2019--Binary Ensemble Neural Network--二值CNN网络集成
  6. 编译phonetisaurus时configure找不到openfst的问题解决
  7. 解决UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte问题
  8. mac java web_mac os安装java web开发环境配置
  9. 圆通招java_圆通java程序员面试经验|面试题 - 职朋职业圈
  10. leetcode每日一题系列——881. 救生艇