语法糖
语法糖(Syntactic sugar)是由英国计算机科学家彼得·兰丁发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性。
ForEach
for(type element: array){ System.out.println(element);}
for vs for-each
- for-each从JDK5.0开始引入
- for-each语法更简洁
- for-each避免越界错误
- for可以删除元素,for-each不可以删除/替换元素
- for-each遍历的时候,是不知道当前元素的具体位置索引
- for-each只能正向遍历,不能反向遍历
- for-each不能同时遍历2个集合
- for和for-each性能接近
枚举
public enum Size{ SMALL,MEDIUM,LARGE;}
- Enum的子类
- 有多少值,则有多少实例对象
- 无法直接创建
- 可以添加属性、构造函数、方法
- 构造函数只能为私有
接口返回值不允许使用枚举类型的原因是如果类库没有及时升级,在反序列化的时候当根据序列化数据序列相应枚举的话很可能找不到相应枚举。从而抛异常
不定项参数
public void method(String a,String...b){ }
- 固定参数重载优先级比不定项高
为什么要可变参数?
变长参数适应了不定参数个数的情况,避免了手动构造数组,提高语言的简洁性和代码的灵活性
当可变参数与方法重载出现时,就有些令人混乱,但整体方法参数匹配流程是这样的:
阶段1: 不自动装箱拆箱,不匹配变长参数阶段2: 自动装箱拆箱,不匹配可变参数阶段3: 允许匹配变长参数
静态导入
import static org.junit.Assert.*;
- 导入一个类的静态方法与静态变量
自动装拆箱
Integer a = 1;
- 该功能由编译器提供
- 基础类型与封装类型运算时,会触发拆装箱
多异常并列
try{ //...}catch(Exception1 | Exception2 e){ //...}
- 不能有直接或间接的继承关系
数值新特性
int a = 0b11100111; // 可直接使用二进制int b = 9999_99999; // 可使用下划线分割
接口方法
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true;}
- 以default关键字标注,其他的定义和普通函数一样
- 规则1:默认方法不能重写Object中的方法
- 规则2:实现类可以继承/重写父接口的默认方法
- 规则3:接口可以继承/重写父接口的默认方法
- 规则4:当父类和父接口都有(同名同参数)默认方法,子类继承父类的默认方法,这样可以兼容JDK7及以前的代码
- 规则5:子类实现了2个接口(均有同名同参数的默认方法),那么编译失败,必须在子类中重写这个default方法
接口静态方法
public interface Runnable { static void run(){ System.out.println("!111"); }}
- 只能通过接口名来调用
接口私有方法
public interface Runnable { static void run(){ say(); } private static void say(){ System.out.println("say"); } }
try-with-resource
try(FileOutputStream fos = new FileOutputStream("")){ //JDK7 } catch (IOException e) { e.printStackTrace();}
FileOutputStream fos = new FileOutputStream(""); // JDK9 try(fos){ } catch (IOException e) { e.printStackTrace(); }
- 资源类必须实现AutoCloseable接口
var
var a = 1;
- 由编译器进行类型推断
var obj = new Object(){ public void print(){ System.out.println("print"); }};obj.print();
var 的限制
- 可以用在局部变量上,非类成员变量
- 可以用在for/for-each循环中
- 声明时必须初始化
- 不能用在方法(形式)参数和返回类型
- 大面积滥用会使代码整体阅读性变差
- var只在编译时起作用,没有在字节码中引入新的内容,也没有专门的JVM指令处理var
switch表达式
int ret = switch (a){ case 1-> 100; case 2 -> 200; default -> -1;};
文本块
String template = """ welcome, hello "${name}" """;System.out.print(template);
Records
record Person(String firstname, String lastname) { Person { if (firstname == null || lastname == null) { throw new IllegalArgumentException("firstname or lastname cannot be null"); } }}Person person = new Person("c", "xk");person.firstname();person.lastname();
instanceof模式匹配
Object obj = "cxk";if (obj instanceof String s) { System.out.println(s);}if (obj instanceof String s && s.length() > 2) { System.out.println(s);}
密封类
密封类允许你控制类的继承体系结构
abstract sealed class Animal permits Dog, Cat {}final class Dog extends Animal{}final class Cat extends Animal{}