目录
yield关键字var关键字空指针异常密封类接口中的私有方法instanceof其他
yield关键字
yield关键字用于case的代码块中返回值。
正常switch语句
public static void main(String[] args) { int result = 0; String str = "a"; switch (str) { case "a" : result = 65; break; case "b" : result = 66; break; case "c" : result = 67; break; default: result = -1; } System.out.println(result); }
简化的switch语句
public static void main(String[] args) { String str = "a"; int result = switch (str) { case "a" -> 65; case "b" -> 66; case "c" -> 67; default -> -1; }; System.out.println(result); }
yield关键字版本
public static void main(String[] args) { String str = "a"; int result = switch (str) { case "a" : yield 65; case "b" : yield 66; case "c" : yield 67; default : yield -1; }; System.out.println(result); }
var关键字
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。
空指针异常
JDK8;报空指针异常不会解释原因。
JDK17;报空指针异常会解释原因。
密封类
在之前的学习中,我们了解到一个类不想被继承,需要在类之前加final关键字。
在JDK17中提供了⼀个新的关键字: sealed .密封类除了可以被该关键字修饰,并且在声明末尾用
permits 表⽰要开放给哪些类型。
例如,Class为密封类,然后使用 permits 关键字,把继承权限开放给了Student类。
sealed class Class permits Student{ public String class_id; public Class (String class_id){ this.class_id = class_id; }}//继承的类也要加上密封限制 non-sealed 表⽰不限制non-sealed class Student extends Class{ public String name; public String student_id; public Student(String class_id,String name, String student_id) { super(class_id); this.name = name; this.student_id = student_id; }}
总结
sealed修饰的类必须要有⼦类。使⽤non-sealed关键字修饰。表⽰不限制,任何类都可以继承。未被 permits 允许的类型,则没办法继承。接口中的私有方法
Java8,接口可以有默认方法。Java9之后,可以在接⼝内实现私有方法实现。
interface HelloService { public void sayHello(); // 默认⽅法 default void saySomething(){ syaEngHello(); sayHello(); }; // 私有⽅法 private void syaEngHello(){ System.out.println("Hello!"); }}
instanceof
if (obj instanceof String) { String str = (String) obj;}
instancof语法⼀共做了三件事:
判断是否为String类型;如果是,转成String类型;创建⼀个名为str的临时变量;JDK16 优化后的效果。
if (obj instanceof String str) {// obj是否为String类型,如果是创建临时变量str}
其他
还有很多方法,但对我们初学者不常有,等以后自行探索。