“爆炸性更新!JDK 17携全新语法特性强势来袭,开发者必看的升级亮点“(1)

news2024/9/22 17:27:43

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏:Java进化论

目录

背景 

yield关键字 

var关键字 

空指针异常 

密封类

接口中的私有方法

instanceof关键字


背景 

Java 8 虽然曾经是使用最广泛的版本,但由于它不再是受支持的版本(除非通过付费支持计划),很多公司已经开始或完成了向 Java 11 或 Java 17 的迁移。

需要注意的是,具体使用哪个版本可能因公司而异,一些公司可能因为特定的技术需求、框架兼容性、成本因素或内部政策而选择停留在某个版本。然而,趋势是向着最新的 LTS 版本迁移,以获取最新的安全补丁、性能提升和新功能。

上面是 AI对 有关Java17是否会成为以后常用的开发版本 的看法。也许在不久的将来就会代替Java11成为新的常用开发版本,因此我们程序员也要开始学习Java17的相关语法变动。

下面是官方对Java17的相关改动。

yield关键字 

我们要想在多种不同情况下,返回不同的值,会用 switch 语句来解决。

例如:用一个 ret 来接收不同情况的值。

public class Test {
    public static void main(String[] args) {
        int n = 1;
        int ret = 0;
        switch (n) {
            case 1:
                ret = 1;
                break;
            case -1:
                ret = -1;
                break;
            case 0:
                ret = 0;
                break;
        }
        System.out.println(n);
    }
}

上面是正常的 switch 语句,下面来看简写版的 switch 语句。

public class Test {
    public static void main(String[] args) {
        int n = 1;
        // 不能使->两边的值全部一样
        int ret = switch (n) {
            case 1 -> 1;
            case -1 -> -1;
            case 0 -> 0;
            default -> 100;
        };
        System.out.println(n);
    }
}

注意:switch 语句中 -> 两边的值不能全部一样。如果上面的代码把 default 语句去掉的话,那么就会出现语法错误。下面是代码的结果:

如果不想使用指向符 -> 可以使用yield来代替:

public class Test {
    public static void main(String[] args) {
        int n = 1;
        // 不能使->两边的值全部一样
        int ret = switch (n) {
            case 1 : yield 1;
            case -1: yield  -1;
            case 0: yield 0;
            default: yield 100;
        };
        System.out.println(n);
    }
}

注意:这里也和上面一样,不能出现全部一样的。

简化之后的 -> 其后可以跟着代码块,并且把 yield 关键字当成 return 使用。

Class Test {
    public static void main(String[] args) {
        int number = 4;
        // 不能使->两边的值全部一样
        int result = switch (number) {
            case 1 -> 1;
            case 2 -> 2;
            case 3 -> 3;
            case 4 -> {
                System.out.println("It's a four!");
                yield 4; // 使用yield关键字从代码块返回一个值
            }
            default -> 1;
        };
        System.out.println(result); // 输出: It's a four! 和 40
    }
}

相对来说,我们平时都是写的完整版的switch语句,所以这个更新我们了解即可。 

var关键字 

从Java10开始,var关键字就开始被引入了。其功能就是使我们的代码更加简洁!如下所示:

public class Test {
    public static void main(String[] args) {
        // 顺序表模拟实现二维数组
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
    }
}

但是如果我们要用顺序表模拟实现三维甚至是四维数组呢?难道也是用一个一个的去实现吗?所以Java10 开始就引入了var 关键字,实现对类型的简化。如下所示:

public class Test {
    public static void main(String[] args) {
        // 顺序表模拟实现二维数组
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        // 根据后面的泛型推导前面的 var 是个啥
        var list2 = new ArrayList<ArrayList<Integer>>();
    }
}

其实这个与泛型的有点类似,泛型是根据前面的类型来推导后面的类型是个啥,而 var 是根据我们写后面的类型来推导我们的类型是个啥。 

但凡事都有两面性,既然可以方便我们简写类型,那么也就有要注意的地方: 

1. 不能用来声明字段。

2. 不能用来声明方法参数。

3. 不能用来声明方法的返回类型。

4. var声明的变量必须初始化,并且不能初始化为null。

其实也挺好理解的。首先,得把第四点给理解了:为啥 var声明的变量必须初始化 ?因为我们是通过后面的初始化内容来推导前面的类型的。如果不初始化,就不能推导出前面的类型是个啥?同理:你把 引用数据类型 初始化为null,那么编译器又怎么根据后面的内容推导出前面是个啥呢?Integer?String?还是自定义类型呢?

第四点知道了,其余的也就都理解了。我们学过字段是会被默认初始化的。如果是基本数据类型倒还好,但如果是引用数据类型呢?还是会被初始化为null。但这里可能有小伙伴有疑问:把字段全部初始化不就行了嘛?即使没意义但初始化的时候也不影响啊。举个很简单的例子:我们在实现自定义的链表时,如果链表的头被初始化了,那么我们怎么判断这个链表是否为空呢?因此,var不能用来声明字段。同理:方法的参数和返回类型是我们事先确定的。但是如果使用var的话,就代表我们事先是不确定的,这就互相矛盾了。

空指针异常 

对于空指针异常的抛出,Java 8 只会给出哪里抛出了空指针异常,而没有把为什么会出现空指针异常告诉我们。Java 17就改善了这个方面。下面给出了两者对于空指针的异常的抛出示例:

Java 8 :

Java 17 : 

密封类

当我们使用关键字 final 去修饰一个类时,这个被修饰的类就变成完全封闭的状态了,不存在有类可以继承它,那么这个类就被称为密封类。密封类一般应用在类和接口中,对接口和类的实现和继承进行约束。 JDK17提供了一个新的关键字: sealed 。密封类除了可以被该关键字 sealed 修饰之外,还可以在声明这个关键词的末尾用 permits 表示要开放给哪些类型来继承。如下所示:

根据不同的需求,处理上面的方式也不同:

1、把Dog类也加上 sealed 限制 ,并且同样要开放给其他类。也就说,Dog类也是有继承限制的。

2、如果Dog类想成为最后一级类的话(就是不想还有其他类继承Dog类的话),只能用关键字 non-sealed 和 final 修饰。这两种修饰的意义不同:non-sealed 修饰代表的是这个类没有限制,也就类似于开放这个类的意思;而 final 修饰代表的是这个类不可被继承的类。其实也就是处理两种极限问题:可以让所有类继承它,没有类能够继承它。

注意:sealed 修饰的类一定要有子类。因为我们会在修饰的这个类的末尾声明上可以继承它的类,因此sealed修饰的类一定是会有子类的。

同样这个继承也是可以实现多个的:

sealed abstract class Animal permits Dog{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public abstract void eat();
}

sealed class Dog extends Animal permits PetDog{
    public Dog(String name, int age) {
        super(name, age);
    }
    @Override
    public void eat() {
        System.out.println(name+" 正在吃狗粮~");
    }
}

non-sealed class PetDog extends Dog{
    public PetDog(String name, int age) {
        super(name, age);
    }
}

接口中的私有方法

Java 8以前的Java版本,所有的接口只能是抽象方法。但从Java 8开始接口中可以有默认方法

被实现,以及静态方法被实现。

从Java 9 开始,进一步允许在接口中定义私有方法和私有静态方法的实现。 

总结:Java 17 中可以有私有的静态方法和私有的方法,以及默认的方法它们的实现。 

instanceof关键字

instanceof关键字,我们前面在学习多态时,使用来判断 某个对象是否为该类型(或者其子类)的一个实例。

现在对其改进的效果如下:

if (obj instanceof String) {
    String str = (String)obj;
    .......
}

上面的instanceof语法一共做了三件事:

1. 判断是否为String类型;

2. 如果是,转成String类型;

3. 创建一个名为str 的临时变量来接收转换的结果; 

也就是说,下面的代码和上面的代码的效果是一样的:

// obj是否为String类型,如果是创建临时变量str
if (obj instanceof String str) {

}

还有更多关于Java 17的更新知识,我们会随着学习的深入,继续开始学习。好啦!本期  “爆炸性更新!JDK 17携全新语法特性强势来袭,开发者必看的升级亮点“(1)的学习之旅就到此结束啦!我们下一期再一起学习吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1911060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java技术的网吧管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;B/S结构 工具&#xff1a;MyEclipse&#xff0c;MySQL 系统展示 首页 个人中…

中西部公关新篇章:赛氪网赋能新质生产力赛事,引领行业潮流

2024年7月7日&#xff0c;武汉光谷盛况空前&#xff0c;中西部公共关系协会共同体多边合作平台&#xff08;以下简称“共同体”&#xff09;举办了2024年度中西部公关协会会长、秘书长专题交流会&#xff0c;本次会议主题为“加快新质生产力&#xff0c;推进公关行业新格局&…

Google账号输入用户名和密码后提醒要到手机通知点是,还要点击数字,但是我手机收不到

有一些朋友换了一个新的电脑后手机登录谷歌账号时&#xff0c;用户名和密码都正确输入以后&#xff0c;第三步弹出一个提示&#xff0c;要在手机上的通知栏点击是&#xff0c;并且点击手机上相应的数字才能继续登录。 但是自己的手机上下拉通知栏却没有来自谷歌的通知&#xf…

用例子和代码了解词嵌入和位置编码

1.嵌入&#xff08;Input Embedding&#xff09; 让我用一个更具体的例子来解释输入嵌入&#xff08;Input Embedding&#xff09;。 背景 假设我们有一个非常小的词汇表&#xff0c;其中包含以下 5 个词&#xff1a; "I""love""machine"&qu…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

牛客周赛 Round 50 解题报告 | 珂学家

前言 题解 数学场&#xff0c;对数学头痛, T_T. A. 小红的最小最大 题型: 签到 a, b, x list(map(int, input().split()))if min(a, b) x > max(a, b):print ("YES") else:print ("NO")B. 小红的四则运算&#xff08;easy&#xff09; 思路: 贪心…

职场中的3个误区,你踩坑了吗?

1、个人发展比工资待遇更重要 这句话也不能说是完全错的&#xff0c;但是你要明白能给你提供发展空间的公司&#xff0c;待遇也不会差到哪里去&#xff0c;而且随着你个人能力的提升&#xff0c;发展也会越来越好&#xff0c;你的待遇也自然水涨船高&#xff0c;这个道理其实大…

乐鑫ESP-NOW与Wi-Fi SoC方案家居设备无缝连接,启明云端乐鑫代理商

随着科技的不断进步&#xff0c;智能家居逐渐成为现代生活的一部分。ESP-NOW技术以其独特的无线通信能力&#xff0c;为智能家居领域带来了一场革命。 ESP-NOW是一种由乐鑫定义的无线通信协议&#xff0c;它能够在无需路由器的情况下&#xff0c;实现设备间的直接、快速、低功…

如何高效学习(一)

什么是学习&#xff1f;学习的本质是什么&#xff1f;如何学习&#xff1f;如何更加高效的学习 以下内容均为观看B站UP主(硬核学长2077)所做总结和自我分析 一、自我介绍 ​ 我&#xff0c;一个二三线城市小小程序员&#xff0c;在高中学习就很一般&#xff0c;但当时并没有特…

解锁敦煌网成功秘籍:批量注册买家号测评的高效策略

敦煌网&#xff08;DHgate&#xff09;作为一个跨境电商平台&#xff0c;搭建境外本土网络环境并实现批量注册买家号下单&#xff0c;需要遵循一系列严谨的步骤和考虑多个关键因素。以下是一个概括性的指南&#xff1a; 一、环境要求 国外服务器&#xff1a;首先&#xff0c;…

WPF 初识依赖属性

依赖属性的意义和作用 核心模块内存共享&#xff0c;节省空间数据绑定、样式、模板、动画。。。。如果没有依赖属性&#xff0c;这个框架就是一个控件框架 相当于Winform 依赖属性的基本定义 基本过程&#xff1a;声明、注册、包装 在需要写依赖属性的类中&#xff0c;继承…

Axure第12享:Google加载Axure扩展程序

1、需求描述 在双击打开RP文件进行预览时&#xff0c;提示要为Google浏览器加载Extension&#xff08;扩展程序&#xff09;&#xff0c;如下图所示。 2、解决思路 按照系统指导的操作步骤&#xff0c;但要注意1点&#xff0c;加载“扩展程序”时是选择整个文件夹&#xff0c…

3款ui设计师必备的高效软件,一定要收藏!

UI设计小伙伴们&#xff0c;你们是否在寻找那些能够让设计工作事半功倍的插件呢&#xff1f;今天&#xff0c;我要为大家带来3款UI设计软件中的高效软件&#xff0c;它们不仅能够极大提升我们的工作效率&#xff0c;还能让我们的设计更加专业和精致。让我们一起来看看这些不容错…

动手学深度学习54 循环神经网络

动手学深度学习54 循环神经网络 1. 循环神经网络RNN2. QA 1. 循环神经网络RNN h t h_t ht​ 与 h t − 1 h_{t-1} ht−1​ x t − 1 x_{t-1} xt−1​有关 x t x_t xt​ 与 h t h_t ht​ x t − 1 x_{t-1} xt−1​ 有关 怎么把潜变量变成RNN–假设更简单 潜变量和隐变量的区…

透明加密软件核心技术分享|十款好用的透明加密软件分享

透明加密软件的核心技术在于其能够自动、实时地对文件进行加密和解密&#xff0c;而这个过程对最终用户来说是无感的。这种技术在不改变用户操作习惯的前提下&#xff0c;增强了数据的安全性。下面是透明加密软件的一些核心技术要点。 实时加密与解密&#xff1a;软件在文件被打…

虚拟内存【Linux】

虚拟内存 为什么需要虚拟内存Linux虚拟内存的结构32位系统下的虚拟地址空间64位系统下的虚拟地址空间页表多级页表TLB 流程虚拟内存的作用 为什么需要虚拟内存 为了在进行多进程编码进行内存访问的时候保持内存的隔离性&#xff0c;数据安全性&#xff0c;所以出现了虚拟内存。…

C++--智能指针

普通指针创建动态内存的问题: 1.new和new[]的内存需要使用delete和delete []释放。 2.有时忘记释放内存。 3.不知该在何时释放内存。 智能指针的优点: 在不需要对象时自动释放对象&#xff0c;从而避免内存泄漏和其他与内存管理相关的问题。 智能指针有:unique_ptr,share…

可转债之强赎条款

摘要&#xff1a;每天学习一点金融小知识 做可转债投资&#xff0c;强赎风险是特别需要注意的&#xff0c;若投资者没有及时采取措施&#xff0c;就有可能造成很大的损失。本文从可转债的定义、强赎条款的原因及强赎的情况几个方面来介绍下可转债的强赎条款。 什么是可转换债券…

算法——同步算法

在力扣有这样一道题求交集&#xff0c;与此类似的还有求差集&#xff0c;相关的解法有很多。我这里提供一种思路&#xff1a;利用C的容器set对这两个数组去重&#xff0c;遍历数组插入set即可去重。再同时遍历比较set的每个元素。 代码实现很简单&#xff0c;如下所示&#xff…

【第四届会后4个月检索】第五届计算机网络安全与软件工程国际学术会议(CNSSE 2025)

第五届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2025&#xff09; 2025 5th International Conference on Computer Network Security and Software Engineering 重要信息 大会官网&#xff1a;www.cnsse.org 大会时间&#xff1a;2025年2月21-23日 会议地点&…