资讯专栏INFORMATION COLUMN

Java 9 新特性

SegmentFault / 2087人阅读

摘要:在语言上并没有添加太多的新特性,但在使用性能上做了很改进。二多版本包支持即在不同版本下,执行相应版本的代码。在发布新版本的后,用户可能不会升级到新环境,但是项目可能会开始逐步升级到新版本,来提前适应即将到来的环境。

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
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 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();
        }
    }
}
参考

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72829.html

相关文章

  • Java 9 的主要特性

    摘要:今晚将正式发布。竞争锁的性能优化能够改善程序运行时的多线程同步效率。模块化这就是令跳票数次的罪魁祸首。优化字符串占用空间在很多应用当中,字符串已经成为一个消耗内存的主要部分。 今晚 Java 9 将正式发布。Java 9 的新特性都列在官方页面当中,本文介绍值得你关注的其中几个点: ▶ 进程操作改进(JEP 102: Process API Updates) 新增的 java.lang...

    junbaor 评论0 收藏0
  • 5分钟学会Java9-Java11的七大特性

    摘要:来来来,花分钟看看的七大新特性,还有代码样例。本地是指方法内的变量声明。从开始,这个正式进入标准库包。同步请求会阻止当前线程。可喜的是,如果尝试改变不可变集合,会通过发出警告是在中引入的,增加了三个新方法。 现在Java有多元化的发展趋势,既有JS又有C++还有C#的影子,不学习那是不行滴。来来来,花5分钟看看Java9-Java11的七大新特性,还有代码样例。Java11 发布了,然...

    xuhong 评论0 收藏0
  • Java核心技术教程整理,长期更

    以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总。 Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具篇 Java 书籍篇 Java基础篇 8张图带你轻松温习 Java 知识 Java父类强制转换子类原则 一张图搞清楚 Java 异常机制 通用唯一标识码UUID的介绍及使用 字符串...

    Anchorer 评论0 收藏0
  • Java9特性

    摘要:新特性概述系列一安装及使用系列二运行系列三模块系统精要系列四更新系列五系列六系列七系列八系列九与的区别迁移注意事项参数迁移相关选项解析使用构建实例使用示例带你提前了解中的新特性 Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性...

    ddongjian0000 评论0 收藏0
  • Java 11正式发布,这几个逆天特性教你写出更牛逼的代码

    摘要:就在前段时间,官方宣布正式发布,可在生产环境中使用这无疑对我们来说是一大好的消息。途中列举了的正式发布时间以及支持计划。长期支持,表示会对其做长期的补丁安全等扩展支持等。 showImg(https://segmentfault.com/img/remote/1460000016796660); 就在前段时间,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在...

    garfileo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<