Java9在语言上并无添加太多的新特性,但在使用、性能上作了很改进。html
Java9添加了模块化的概念,使得以前的控制访问权限有了改变。
以前:java
Java9shell
能够看到,对public类又作了进一步的限制,主要是对模块间的依赖作出限制,使得模块可以控制那些public类型可以被其余模块读取,以及该模块须要使用其余模块的类型。oracle
在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; }
以上是最简单的模块使用方式。工具
即在不一样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.java 8 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
public interface PrivateMethod { // java7之前 // 默认为 public static final String NAME = "xiao"; // 默认为 public String get(); // java8 default void giveMyMoney() { System.out.println("No way!!!"); } static void makeFriend() { System.out.println("Hello, my friend."); } // java9 private void show() { System.out.println("Nobody can find me."); } }
提供互交式的工具。ui
$ jshell | 欢迎使用 JShell -- 版本 11.0.1 | 要大体了解该版本, 请键入: /help intro jshell> /help intr | | intro | ===== | | 使用 jshell 工具能够执行 Java 代码,从而当即获取结果。 | 您能够输入 Java 定义(变量、方法、类等等),例如:int x = 8 | 或 Java 表达式,例如:x + x | 或 Java 语句或导入。 | 这些小块的 Java 代码称为“片断”。 | | 这些 jshell 工具命令还可让您了解和 | 控制您正在执行的操做,例如:/list | | 有关命令的列表,请执行:/help jshell> System.out.println("The first time use jshell"); The first time use jshell jshell> String a = "xiao" a ==> "xiao" jshell> System.out.println("name" + a) namexiao jshell> System.out.println("name:" + a) name:xiao jshell>
Java6以及以前的版本中,在使用一些资源时,一般会使用try/catch语句,而且在finally语句中来关闭资源,Java7作了改进,Java9也作了一点改进。code
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(); } } }
更多更详细的特性,能够参照如下:htm
Oracle
Blog