欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > JDK17的新增特性-Java

JDK17的新增特性-Java

2025/11/2 8:24:23 来源:https://blog.csdn.net/2301_81949860/article/details/143266385  浏览:    关键词:JDK17的新增特性-Java

yield关键字

用于从case的代码中返回一个值

正常的switch语句:
public static void main(String[] args) {String data ="one";int result =0;//接收数据的返回值switch (data){case "one":result=1;//为result重新赋值break;case "two":result=2;break;default:result=-1;break;}System.out.println(result);}
简化后的switch:
 public static void main(String[] args) {String data="one";int result =switch (data){case "one"->1;case "two"->2;default -> -1;};System.out.println(result);}
 如果不想使用指向符->,可以使用yield来代替:
public static void main(String[] args) {String data="one";int result=switch(data){case "one":yield 1;case "two":yield 2;default:yield -1;};System.out.println(result);

var关键字

会自动根据当前的变量内容来确定数据类型

public static void main(String[] args) {var name ="zhangsan";var age =10;}
好处:
  • 使用var可以使代码更简洁。有时候,类型名称可能会非常长,例如泛型,var就像一个简化器,让你不必反复写出繁琐的类型名
 public static void main(String[] args) {Map<String,List<Map<Integer,String>>> complexMax = new Map<String,List<Map<Integer,String>>>();//也可以写成
var complexMap2 = new Map<String,List<Map<Integer,String>>>();}
注意事项:
  1. 不能使用var来声明字段(不能在main方法以外的地方直接使用var)
  2. 不能使用var来声明方法的参数(传参的时候不能使用var来表示变量的数据类型)
  3. 不能使用var来声明方法返回类型(方法的返回类型不能用var)
  4. var声明变量必须初始化,但是不能初始化为null
class OrgCat{
public var name;//errorpublic var eat (var str){...}//error}public static void main (String[] args){var complexMap2 =10;
System.out.println(complexMap2);var str =null;//error

密封类

密封类一般应用在类和接口中,对接口和类的实现和继承进行约束。主要使用的关键词是final。当这个类被final修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承。

JDK17提供了一个新的关键字:sealed。密封类除了可以被该关键词修饰,并且在声明末尾用 permits表示要开放给哪些类型

sealed的子类有两种情况:
密封情况密封不密封
子类关键字final,sealednon-sealed
可否有子类

sealed修饰的类一定要有子类

final修饰的类一定不能有子类

可有可没有
sealed class  Animal permits Dog{}
non-sealed class Dog extends Animal{}
注意:
  1. sealed的修饰类一定要有子类
  2. 使用non-sealed 关键字修饰,表示不限制,任何类型都可以继承
  3. 未被permits允许的类型,则没办法继承
【实例1】
//sealed修饰Animal 代表当前类是密封类  必须有子类
sealed class  Animal {public String name;public int age;public void eat(){System.out.println("eat()...");}
}class PetDog2 extends Animal{//error}
//此时Dog这个类 没有限制 可以被任何类继承 但不一定需要子类
non-sealed class Dog extends Animal{@Overridepublic void eat() {super.eat();}
}
class PetDog extends Dog{}
代码解析:

小结:

复杂的特殊写法
sealed class  Animal permits Dog,Cat,PetDog2 {public String name;public int age;public void eat(){System.out.println("eat()...");}
}
sealed class Cat extends Animal permits OrgCat{}
non-sealed class OrgCat extends Cat{}
non-sealed  class PetDog2 extends Animal{}

接口中的私有方法

Java9之后,可以在 接口内实现私有方法

代码示例:
interface HelloService{public void sayHello();//默认方法default void saySomething(){sayEngHello();sayHello();}//私有方法private void sayEngHello(){System.out.println("Hello!");}
}

instanceof

示例代码
if(obj instanceof String){String str =(String) obj;...
}

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

  1. 判断是否为String类型
  2. 如果是,转成String类型
  3. 创建一个名为str的临时变量

在JDK16中,使用模式匹配思想改进了instance of用法,可以做到以下优化效果:

示例代码:
if (obj instanceof String str){//obj是否为String类型,如果是,创建临时变量str}

其他

其他还有很多未列举的,比如:

  1. ZGC-新一代垃圾回收器,G1垃圾回收器相关等等
  2. record 类的使用
  3. Stream API的部分改进
  4. HttpClient 重写了,支持HTTP2.0
  5. 支持List.of()、Set.of()、Map.ofEntries()等工厂方法实例化对象
  6. ……

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com