一、Java9中的新特性
1.1 JDK和JRE目录结构的改变
1.2 模块化系统
模块之间包的调用
现有两个模块,结构如下
现在希望在第一个块的MoudleTest中使用第二个模块中的Person类,直接使用是不行的,使用需要引入暴露和导入的概念
如图:
首先在第二个模块中的src
下。新建 moudle-info.java
文件
并指明向外暴露的包
module java9test {
exports guigu.moudletest20210918;
}
然后再需要引用的模块的src
下同样新建 moudle-info.java
文件
指明需要引入的模块
module guigu20210918 {
requires java9test;
}
1.3 Java的REPL工具
1.3.1 jShell命令
产生背景
向Python 和Scala之类的语言早就有交互式编程环境(read - evaluate - print - loop)
了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。而之前Java版本想执行代码,必须创建文件、声明类、提供测试方法方可实现
。
设计理念
即写即得
实现目标
- Java 9中拥有的jShell。可以让Java可以像脚本语言一样运行,从控制台启动jShell,利用jShell可以在没有声明类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行java代码,而无需创建Java文件。
- jShell也可以从文件中加载语句或将语句保存到文件中
- jShell也可以是tab建进行自动补全和自动添加分号
在命令行直接输入 jshell就可以开始写语句了
在shell中编写Java代码也会有相应的提示
/edit
命令可以调出JShell Edit Pad,可以在窗口看见已经成功的输出
也可以在JShell Edit Pad中进行修改,修改完成后点击Accept按钮提交修改后在shell内会有修改成功的提示
直接在shell命令内再次定义同名的变量或方法,后建的变量方法会覆盖之前的变量和方法
其他jshell命令
1.4 语法改进:接口的私有方法
Java 9 中,接口中可以定义访问权限为private的方法。
1.5 语法改进:钻石操作符使用升级
在Java8中
与匿名实现类共同使用钻石操作符
(diamond operator)是会报错的
编译报错信息:Cannot use '<>' with anonymous inner classes
.
Comparator<Object> com = new Comparator<>() {
@Override
public int compare(Object o1, Object o2) {
return 0;
}
};
1.6 try结构的语法升级
Java8中try的资源关闭是自动的
java8自动关闭的前提要求,执行后必须关闭的资源的初始化必须在try子句中初始化
//java8之前的资源关闭都是在finally中完成
//Java8当中资源关闭操作是自动实现的
try(InputStreamReader reader = new InputStreamReader(System.in)) {
char[] cbuf = new char[20];
int len;
while ((len = reader.read(cbuf))!= -1){
String s = new String(cbuf, 0, len);
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
Java9中try
执行后必须关闭的资源的初始化可以在try子句中之外
此时的reader是声明为final的,在try内部不可修改
//java9
InputStreamReader reader = new InputStreamReader(System.in);
try (reader) {
char[] cbuf = new char[20];
int len;
while ((len = reader.read(cbuf)) != -1) {
String s =