java9 特性_Java9新特性

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.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

java11java8multiversion.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 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.");

}

}

四、JShell

提供互交式的工具。

$ 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>

五、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();

}

}

}

参考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值