JDK9------JDK13新特性
JDK 9 新特性:接口增强与 Try-With-Resources 改进
1. 接口增强
旧版本:
在 JDK 8 中,接口可以有默认方法和静态方法,但无法在接口中添加私有方法,导致代码复用性差,公共逻辑只能放在默认或静态方法中。
新版本:
JDK 9 引入了接口的私有方法,允许在接口内部定义一些辅助的逻辑或工具方法。私有方法只能在接口内使用,不能被实现类或外部调用。
代码对比:
JDK 8 示例:
java
public interface MyInterface {
default void showMessage() {
System.out.println("Showing message");
log("Message shown");
}
static void showStaticMessage() {
System.out.println("Static message");
}
default void log(String message) {
System.out.println("Logging: " + message);
}
}
public class MyClass implements MyInterface {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.showMessage(); // 输出 "Showing message" 和 "Logging: Message shown"
MyInterface.showStaticMessage(); // 输出 "Static message"
}
}
JDK 9 示例:
java
public interface MyInterface {
default void showMessage() {
System.out.println("Showing message");
log("Message shown");
}
static void showStaticMessage() {
System.out.println("Static message");
}
// 私有方法,封装公共逻辑
private void log(String message) {
System.out.println("Logging: " + message);
}
}
public class MyClass implements MyInterface {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.showMessage(); // 输出 "Showing message" 和 "Logging: Message shown"
MyInterface.showStaticMessage(); // 输出 "Static message"
}
}
总结:
- JDK 8:没有私有方法,只能在默认方法中定义公共逻辑,暴露给实现类。
- JDK 9:新增私有方法,在接口内部复用逻辑,增强封装性。
2. Try-With-Resources 改进
旧版本:
在 JDK 7 中,try-with-resources
语法要求在 try
语句中显式声明资源,否则无法自动关闭资源。
java
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
// 使用资源
} catch (IOException e) {
e.printStackTrace();
}
新版本:
JDK 9 允许你在 try
语句中使用已经声明的资源,只要资源是 AutoCloseable
类型即可。
java
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try (br) {
// 使用资源
} catch (IOException e) {
e.printStackTrace();
}
总结:
- JDK 7 :资源必须在
try
内部声明。 - JDK 9 :可以在外部声明资源并在
try
语句中使用,减少重复声明。
JDK 10 新特性:局部变量类型推断
局部变量类型推断
旧版本:
在 JDK 10 之前,必须显式声明局部变量类型,导致代码冗长。
java
int number = 10;
String text = "Hello, World";
新版本:
JDK 10 引入了 var
关键字,编译器可以根据赋值内容自动推断变量类型。
java
var number = 10; // 自动推断为 int
var text = "Hello, World"; // 自动推断为 String
代码对比:
JDK 8 示例:
java
int number = 10;
String text = "Hello, World";
JDK 10 示例:
java
var number = 10; // 自动推断为 int
var text = "Hello, World"; // 自动推断为 String
总结:
- 旧版:必须显式声明局部变量的类型。
- 新版 :使用
var
进行局部变量类型推断,减少代码冗余。
JDK 12 新特性:Switch 表达式
Switch 表达式
旧版本:
传统的 switch
语句要求在每个 case
语句中添加 break
,并且无法直接返回值,代码显得冗长。
java
int day = 2;
String result;
switch (day) {
case 1:
result = "Monday";
break;
case 2:
result = "Tuesday";
break;
default:
result = "Invalid day";
}
新版本:
JDK 12 引入了 switch
表达式,可以作为表达式直接返回值,并使用箭头语法,简化了代码。
java
int day = 2;
String result = switch (day) {
case 1 -> "Monday";
case 2 -> "Tuesday";
default -> "Invalid day";
};
代码对比:
JDK 8 示例:
java
int day = 2;
String result;
switch (day) {
case 1:
result = "Monday";
break;
case 2:
result = "Tuesday";
break;
default:
result = "Invalid day";
}
JDK 12 示例:
java
int day = 2;
String result = switch (day) {
case 1 -> "Monday";
case 2 -> "Tuesday";
default -> "Invalid day";
};
总结:
- 旧版 :需要
break
语句和不能直接返回值。 - 新版 :
switch
可以作为表达式返回值,使用箭头简化了语法。
JDK 13 新特性:文本块
文本块
旧版本:
处理多行字符串时需要拼接和手动转义换行符,代码不直观。
java
String text = "This is a line.\n" +
"This is another line.";
新版本:
JDK 13 引入了文本块(Text Block),使用 """
定义多行字符串,自动处理换行符和转义字符,使代码更清晰。
java
String text = """
This is a line.
This is another line.
""";
代码对比:
JDK 8 示例:
java
String text = "This is a line.\n" +
"This is another line.";
JDK 13 示例:
java
String text = """
This is a line.
This is another line.
""";
总结:
- 旧版:多行字符串需要手动转义换行符,代码冗长。
- 新版:文本块简化了多行字符串的书写,提升了代码的可读性。
以上就是 JDK 9、10、12 和 13 的新特性详细总结与代码示例