1、yield 关键字
yield 关键字从Java13开始引入,用于从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;//为result重新赋值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关键字的switch:
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);}
2、var关键字
var 关键字从Java10开始引入,可以自动识别类型
var name = "zhangsan";
var age = 10;
上述代码中,编译器会自动判断出name时一个String类型,age是一个int类型
使用var可以使代码更简洁,有时候,类型名称可能会非常长,例如泛型中
var就像一个简化器,让我们不必反复写出繁琐的类型名,如下:
public static void main(String[] args) {Map<String, List<Map<Integer, String>>> complexMap = new HashMap<String, List<Map<Integer, String>>>();var complexMap2 = new HashMap<String, List<Map<Integer, String>>>();}
注意事项:
- 不能使用var来声明字段
- 不能使用var来声明方法参数
- 不能使用var来声明方法返回类型
- var声明变量必须初始化,但是不能初始化为null
3、密封类
密封类一般应用在类和接口中,对接口和类的实现和继承进行约束
主要使用的关键字是final,当该类被final修饰,被修饰的类就变成密封类,无法被其他类所继承
JDK17提供了一个新的关键字:sealed,密封类可以被该关键字修饰,并且可以在声明末尾用使用permits表示要开放给哪些类型继承
下面代码Animal为密封类,然后使用permits关键字,把继承权限1开放给Dog类
sealed class Animal permits Dog{}
non-sealed class Dog extends Animal{}
tips:
1、sealed修饰的类必须要有子类
2、使用 non-sealed 关键字修饰,表示不限制,任何类都可以继承
3、若示例中Animal声明中没写permits,则所有类均可继承Animal;若写了,则未被permits允许的类,无法继承Animal
permits可声明多个类,上述错误代码可改为如下:
4、复杂的特殊写法
4、接口中的私有方法
Java8中,接口可以有默认方法。Java9之后,可以在接口内实现私有方法
interface HelloService {public void sayHello();//默认方法default void saySomething() {sayEngHello();sayHello();};//私有方法private void sayEngHello() {System.out.println("Hello!");}
}
5、instanceof
常见代码:
if (obj instanceof String) {String str = (String) obj; ...}
上面instanceof语法一共做了三件事:
- 判断是否为String类型
- 如果是,转成String类型
- 创建一个名为str的临时变量
在JDK16中,使用模式匹配思想改进了instanceof用法。可以做到以下优化效果:
if(obj instanceof String str) { //判断obj是否为String类型,如果是创建临时变量str}