java9新特性

java 9 新增了很多特性,我们针对较为突出的便于理解的特性进行说明。
除了下面罗列出的新特性之外还有一些其他的内容,这些内容对于初学者来说有的不便于理解,有的是不重要,所以没有罗列出来。

jshell

有的时候我们只是想写一段简单的代码,例如HelloWorld,按照以前的方式,还需要自己创建java文件,创建class,编写main方法,但实际上里面的代码其实就是一个打印语句,此时还是比较麻烦的。在jdk9中新增了jshell工具,可以帮助我们快速的运行一些简单的代码。

从命令提示符里面输入jshell,进入到jshell之后输入:

System.out.println("HelloWorld");

此时可以直接看到命令提示符中打印了HelloWorld。

我们还可以输入下面代码然后按回车:

int a = 10;

再输入下面代码按回车:

int b = 20;

再输入下面代码按回车:

System.out.println(a + b);

此时可以看到控制台打印出了a+b的值了。

如果要退出jshell的话,输入/exit即可

接口私有方法

在jdk9中新增了接口私有方法,我们可以在接口中声明private修饰的方法了

public interface MyInterface {
    //定义私有方法
    private void m1() {
        System.out.println("123");
    }

    //default中调用
    default void m2() {
        m1();
    }
}

改进的try with resource

之前我们使用try with resource用来自动关闭资源文件,特别是在IO流部分使用的比较多。使用方式是将需要自动关闭的资源对象的创建放到try后面的小括号中,在jdk9中我们可以将这些资源对象的创建放到外面,然后将需要关闭的对象放到try后面的小括号中即可,示例:

/*
改进了try-with-resources语句,可以在try外进行初始化,在括号内引用,即可实现资源自动关闭
 */
public class TryWithResource {
    public static void main(String[] args) throws FileNotFoundException {
        //jdk8以前
        try (FileInputStream fileInputStream = new FileInputStream("");
             FileOutputStream fileOutputStream = new FileOutputStream("")) {

        } catch (IOException e) {
            e.printStackTrace();
        }

        //jdk9
        FileInputStream fis = new FileInputStream("abc.txt");
        FileOutputStream fos = new FileOutputStream("def.txt");
        //多资源用分号隔开
        try (fis; fos) {


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

不能使用下划线命名变量

下面语句在jdk9之前可以正常编译通过,但是在jdk9(含)之后编译报错,在后面的版本中会将下划线作为关键字来使用

String _ = "monkey1024";

String字符串的变化

写程序的时候会经常用到String字符串,在以前的版本中String内部使用了char数组存储,然而大部分字符串中的字符都是占用一个字节就能搞定,因此在jdk9中将String内部的char数组改成了byte数组,这样就节省了一半的内存占用。String中增加了一个判断,倘若字符超过1个字节的话,会把byte数组的长度改为两倍char数组的长度,用两个字节存放一个char。

模块化

JDK9将JDK分成一组模块,可以在编译时或运行时进行组合。这样可以减少内存开销,只需必要的模块,并非全部模块,可以简化各种类库和大型应用的开发和维护。