Java 14 新特性Record、instanceof、switch语法速览
一、instanceof 模式匹配
旧语法:
if (obj instanceof String) {String s = (String) obj;System.out.println(s.length());
}
新语法:
if (obj instanceof String s) {System.out.println(s.length());
}
核心语法格式:
if (object instanceof Type variable) { ... }
作用:
- 自动类型匹配 + 自动类型转换;
- 避免显式强制类型转换;
- 提高代码可读性与安全性。
二、Records
Record 不是构造函数,而是一种特殊的),自动生成构造函数和其他常用方法。
在 Java 中,record是一种语法糖(syntactic sugar),它用极简的方式定义了一个不可变的数据类。
传统类写法:
public final class Writer {private final String name;private final int age;public Writer(String name, int age) {this.name = name;this.age = age;}public String name() { return name; }public int age() { return age; }
}
Record 写法:
public record Writer(String name, int age) { }
核心语法格式:
public record 类名(字段列表) { }
自动生成:
- 构造方法;
equals()/hashCode();toString();- Getter(无前缀)。
不支持:
setter方法;- 可变字段。
public record Writer(String name, int age) { }
这行代码编译后,Java 编译器实际上会自动帮你生成一个完整的 final 类,类似于:
public final class Writer extends java.lang.Record {private final String name;private final int age;public Writer(String name, int age) { // 自动生成的构造方法this.name = name;this.age = age;}public String name() { return name; } // getter(无前缀)public int age() { return age; }public String toString() { ... } // 自动生成public boolean equals(Object o) { ... } // 自动生成public int hashCode() { ... } // 自动生成
}
所以你可以理解为:
Record 是一个完整的类,
它“自带构造方法”,
但它本身不是构造方法。
构造方法的种类
在 Record 中,其实你还可以定义不同的构造函数(手动改造默认行为)。
标准构造方法(编译器自动生成)
public record City(String name, int population) { }
使用时:
City city = new City("北京", 2154);
显式定义标准构造方法
你可以自己写,但必须对所有字段赋值:
public record City(String name, int population) {public City(String name, int population) {System.out.println("创建城市:" + name);this.name = name;this.population = population;}
}
紧凑构造方法
当你只想加逻辑,不想重复字段赋值时,可以用这种写法(Java 自动帮你赋值):
public record City(String name, int population) {public City {if (population < 0) {throw new IllegalArgumentException("人口数不能为负数");}}
}
等价于:
public City(String name, int population) {if (population < 0) throw new IllegalArgumentException("人口数不能为负数");this.name = name;this.population = population;
}
如何理解 Record 与构造函数的关系
| 概念 | Record | 构造函数 |
|---|---|---|
| 定义方式 | record City(String name, int pop) | public City(String name, int pop) |
| 所属层级 | 类定义 | 类内方法 |
| 是否自动生成 | 是 | 需手写 |
| 主要作用 | 定义不可变数据类 | 初始化对象字段 |
| 是否可重载 | 否(字段固定) | 可有多个重载 |
总结一句话:
Record 是一个类;构造函数只是 Record 自动生成的一部分。
示例:完整使用 Record
public record City(String name, int population) {public City {if (population < 0) {throw new IllegalArgumentException("人口不能为负数");}}public String greeting() {return "欢迎来到 " + name + ",人口:" + population + " 万";}
}public class Main {public static void main(String[] args) {City beijing = new City("北京", 2154);System.out.println(beijing.greeting());}
}
输出:
欢迎来到 北京,人口:2154 万
三、Switch 表达式
旧式 switch:
switch (type) {case BASKETBALL:result = "詹姆斯哈登";break;case FOOTBALL:result = "C罗";break;default:result = "未知";
}
新式 switch:
String result = switch (type) {case TENNIS -> "费德勒";case FOOTBALL -> "C罗";case BASKETBALL -> "詹姆斯";case PINGPANG -> "马龙";default -> throw new IllegalArgumentException("未知类型");
};
核心语法格式:
switch (表达式) {case 常量1 -> 结果1;case 常量2 -> 结果2;...default -> 结果N;
}
新特性:
- 支持
->箭头语法; - 可直接返回值(可赋值或 return);
- 不再需要
break; - 更简洁、更安全。
四、Text Blocks
旧写法:
String html = "<html>\n" +" <body>\n" +" <p>Hello</p>\n" +" </body>\n" +"</html>";
新写法:
String html = """<html><body><p>Hello</p></body></html>""";
核心语法格式:
String str = """
多行文本内容
可自由换行、缩进
""";
优势:
- 无需
+拼接; - 无需
\n转义; - 保留自然排版;
- 特别适合拼接 HTML / SQL / JSON 字符串。

| 特性 | 关键语法 | 主要改进点 |
|---|---|---|
| instanceof 模式匹配 | if (obj instanceof Type var) | 自动类型转换 |
| Records | record 类名(字段) | 自动生成构造 & getter |
| Switch 表达式 | switch (x) { case Y -> ... } | 可返回值、免 break |
| Text Blocks | """多行文本""" | 优雅拼接多行字符串 |
