Java 9 包含了丰富的特性集。虽然Java 9没有新的语言概念,但是有开发者感兴趣的新的API和诊断命令。
  我们将快速的,着重的浏览其中的几个新特性;

  模块化系统–Jigsaw 项目
  模块化是一个很通用的概念。在软件中,模块化可以运用到编写和实现一个程序和计算系统,他们都是作为独立的模块,而不是作为一个单一的和完整的设计。
  Java 9中主要的变化是已经实现的模块化系统。模块化的引入使得JDK可以在更小的设备中使用。采用模块化系统的应用程序只需要这些应用程序所需的那部分JDK模块,而非是整个JDK框架了。模块化系统也可以将公共的类封装到一个模块中。因此一个封装在模块中的定义为public的类不能再任何地方使用,除非一个模块显式的定义了这个模块。由于Java 9的这个变化,Java内部的API(例如com.sun.*)默认情况下是不能使用的。
  简而言之,所有的模块将需要在所谓的module-info.java文件中进行描述,这个文件是位于Java代码结构的顶层。
  module me.aboullaite.java9.modules.car {
  requires me.aboullaite.java9.modules
  .engines;//依赖的模块
  exports me.aboullaite.java9.modules.
  car.handling;//在模块中导出包
  }
  我们的模块car(汽车)需要依赖+模块engine(引擎)和需要导出handling(操纵)包。
  需要更多深入的例子可以查看OpenJDK中项目Jigsaw:模块化系统快速入门。
  JShell–Java 9 REPL
  你可能问:“REPL是什么”?REPL是一种快速运行语句的命令行工具。
  在Java中,如果你想执行一个简单的语句,我们要么创建一个带main方法的类,要么创建一个可以执行的Test类。当你正在启动Java程序的时候,如果你想执行某些语句并且想立刻看见执行结果,上面的做法看起来不是那么有用了。
  JShell试图去解决这个问题。Java开发者可以利用JShell在没有创建类的情况下直接声明变量,计算表达式,执行语句。JShell也可以从文件中加载语句或者将语句保存到文件中。并且JShell也可以是tab键进行自动补全的特性。
  集合工厂方法
  在Java 9之前,Java只能利用一些实用方法(例如:Collections.unmodifiableCollection(Collection<? extends T> c))创建一个不可修改视图的集合。例如,我们可以在Java 8中使用一条如下所示的语句,创建一个Collection的不可修改的视图。虽然这是简单的创建方式,但是看起来很糟糕!不是吗?
  Map<String, String> immutableMap =
  Collections.unmodifiableMap(
  new HashMap<String, String>() {{
  put("key1", "Value1");
  put("key2", "Value2");
  put("key3", "Value3");
  }});
  现在,Java 9引入了一些有用的工厂方法来创建不可修改的集合。我们现在在Java 9中创建不可修改的Map集合,如下所示。
  Map<String, String> immutableMap =
  Map.of("key1", "Value1", "key2", "Value2"
  ,"key3", "Value3");
  下面是工厂方法的例子:
// empty immutable collections
不可修改的空集合
List<String> emptyImmutableList = List.of();
Set<String> emptyImmutableSet = Set.of();
Map emptyImmutableMap = Map.of();
// immutable collections 不可修改的集合
List<String> immutableList = List.of("one",
"two");
Set<String> immutableSet = Set.of("value1",
"value2");
Map<String, String> immutableMap = Map.of
("key1", "Value1", "key2", "Value2", "key3", "Value3");
  接口中的私有方法
  Java 8的接口引入了默认方法和静态方法。虽然Java 8首次计划实现接口的私有方法,却是在Java 9中实现。默认方法和静态方法可以共享接口中的私有方法,因此避免了代码冗余,这也使代码更加清晰。如果私有方法是静态的,那这个方法属于这个接口的。并且没有静态的私有方法只能被在接口中的实例调用。
interface InterfaceWithPrivateMethods {
private static String staticPrivate() {
return "static private";
}
private String instancePrivate() {
return "instance private";
}
default void check() {
String result = staticPrivate();
InterfaceWithPrivateMethods pvt = new
InterfaceWithPrivateMethods() {
// anonymous class 匿名类
};
result = pvt.instancePrivate();
}
}
  响应式流
  JDK9中的Flow API对应响应式流规范,响应式流规范是一种事实标准。JEP 266包含了一组小接口集合,这组接口能捕获核心的异步发布与订阅。希望在未来第三方能够实现这些接口,并且能共享其方式。
  java.util.concurrent.Flow包含以下4个接口:
  1.Flow.Processor(处理器)
  2. Flow.Publisher(发布者)
  3.Flow.Subscriber(订阅者)
  4. Flow.Subscription(订阅管理器)
  这些接口都支持响应式流发布-订阅框架。Java 9也提供了实用类SubmissionPublisher。一个发布者产生一个或多个物品,这些物品由一个或多个消费者消耗。并且订阅者由订阅管理器管理。订阅管理器连接发布者和订阅者。