快速带你了解JDK9~JDK17新特性

jdk9新特性-模块化开发

我们首先来看1.8以前的一个结构。

到了jdk9后,外面又添加了一个结构

通过这层,我们可以对包进行配置,例如我们写了一个工具类,jar包。有些类需要暴露出去,有的是需要内部用的,以前很难做到,现在我们通过模块化就可以来实现这个功能。

下面我们来举个例子,例如我们想要在模块b里面引入模块a的Test1.我们可以发现,idea里面有个增加对模块的依赖。然后进行导入就可以了。这个是idea自带的功能,和我们这里说的没有关系

这个实质就是在pom里面进行操作了可以看下面的图,我们可以看到在pom文件中

我们来看java9中的模块化是怎么样的

我们再Test2中右击创建,可以发现他是自动的创建到了根目录下

之后我们再另外一个模块也创建。

发现之前可以用的东西已经报错了。

之后我们用idae的自动更正

这个时候我们发现被调用方

这个对应的就是包路径

之后我们一一用这个方法进行纠错。

我们发现我们的调用方

有了这样的。

也就是说目前,被调用方:

java 复制代码
module testa {
    exports com.xiaou.testa.test1;
    exports com.xiaou.testa.test2;
}

调用方:

java 复制代码
module testb {
    requires testa;
}

模块话说白了就是这样的。

被调用方可以用exports加包名,把想要被调用的包给exports出去

requires也是一样的。如果你需要不同的模块,就继续进行添加就可以了。下面我们来进行一个总结

  • 使用moudule-info.java来声明一个模块,一个模块只能有一个文件,且在顶层包同目录下
  • 使用exports来声明可以被外部引用的包可以有多个exports语句
  • 使用requires来声明依赖的外部的模块可以有多个requires语句

这个的使用不是很多,我们可以在一些jar包中发现

jdk10新特性-var局部变量推导

  • 必须能推导出实际类型
  • 只能用于局部变量

例如我们之前要去new一个变量

java 复制代码
Test1 test1 = new Test1();

我们都是这样写的

java 复制代码
var test11 = new Test1();

我们使用var就可以这样写,这里注意的是必须要是一个能推导出实际类型的

例如下面的这个初始化就是错误的

需要注意的是null也是错误的

下面我们来看只能用于局部变量。

我们可以发现,这个是无法解析的。

这个就是一个看个人习惯的,我反正不是那么推荐用var

很关键的一点。这个不利于共同的开发性。同时我也认为,强语言性也是java的优秀的特点之一。

jdk11新特性-单文件程序

例如有这样的一个程序

java 复制代码
package com.xiaou.testa;


public class TestB {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

我们平常用命令行要是运行的话,是需要先去javac去编译的。

这个也是一个基本上用不到的内容。就不过多的讲解

jdk11新特性-shebang脚本

  • #!符号叫做shebang(shell脚本的开头)
  • #!/bin/bash(以此开头的文件,在执行的时实际调用/bin/bash程序来执行)

例如这样,我们复制一下刚才的那个

去掉他的.java

把她改成

java 复制代码
#!C:\Program Files\Java\jdk-17.0.5\bin\java --source 11

public class TestB {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

这个样子,之后我们来运行这个脚本

因为这个是linux所支持的东西,所以说windows的cmd和powershell是无法运行的,这里用到的是git bash来进行模拟linux上的操作可以看到就执行出来了

jdk14新特性-文本块

平时我们写的字符串都是单行的,文本块就是一个多行的文本快。例如json/html/sql等,都需要用到多行字符串

json 复制代码
{
    name:"test"
}

例如这样的json。我们再之前。

可以发现idae是自动给进行换行等操作的。

在jdk14之后

就可以用""" """里面来进行书写了

jdk14新特性-instanceof增强

一般情况下我们要对一个不确定的类型进行赋值的时候,一般就是这样进行书写。先判断是否属于某个类型,之后再进行强转赋值

java 复制代码
public static void main(String[] args) {
    Object a="Hello";
    if (a instanceof  String){
        String b= (String) a;
        System.out.println(b);
    }
}

增强之后

java 复制代码
if (a instanceof String b){
    System.out.println(b);
}

这个就直接相当于把a赋给b

jdk16新特性-record类

可以看到下面是我们平常写一个dto层的数据的方法

java 复制代码
package com.xiaou.testa;

public class TestDto {
    private String name;
    private String password;

    public TestDto(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

我们创建一个record类。只要把想要的参数写在括号里面,就可以了。其他的都不用管了、

java 复制代码
    TestRecord testRecord = new TestRecord("1", "22");
    //只能获取值,不能获取
    System.out.println(testRecord.name());
    System.out.println(testRecord.password());
}

需要注意的就是只能获取值,不能获取。

jdk17新特性-sealed类

  • 痛点:类的继承很难管理,使用sealed可以来显示的管理
  • 父类如果是sealed类,则必须至少有一个子类
  • sealed类的子类,必须是fina,sealed,non-sealed之一

我们看到报错。

之后我们创建一个新的类

之后我们对父类进行一个显示管理

java 复制代码
public sealed class Jiawa1 permits jiawa2 {
}

之后我们发现jiawa2有一个报错

java 复制代码
public final class jiawa2 extends Jiawa1{
}

我们发现这样就可以了

之后如果我们想要jiawa3继续继承jiawa2

java 复制代码
public sealed class jiawa2 extends Jiawa1 permits jiawa3 {
}
java 复制代码
public non-sealed class jiawa3 extends jiawa2{
}

这样就可以了

当然也可以写成non-sealed。这样我们的jiawa4去继承jiawa3的时候

java 复制代码
public class jiawa4 extends jiawa3 {
}

就可以直接普通的进行继承了。

jdk17新特性-switch增强

这个是17的预览版有的,正式的17是没有的

以前我们想要判断类型的时候

java 复制代码
 Object a="Hello";
        if (a instanceof String b){
            System.out.println(b);
        }
        if (a instanceof Integer b){
            System.out.println(b);
        }
        if (a instanceof Long b){
            System.out.println(b);
        }

需要很多的if

现在有了switch增强后

java 复制代码
switch (a){
    case String b -> System.out.println(b);
    case Integer b -> System.out.println(b);
    case Long b -> System.out.println(b);
    default -> throw new IllegalStateException("Unexpected value: " + a);
}

这样进行书写就可以了。

相关推荐
阿伟*rui2 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
XiaoLeisj4 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck4 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei4 小时前
java的类加载机制的学习
java·学习
码农小旋风5 小时前
详解K8S--声明式API
后端
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml46 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~6 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616886 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7896 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot