其他关键字
核心概念
Java中还有一些重要的关键字,它们在特定场景下发挥着关键作用。本文将深入探讨这些关键字的使用方法、注意事项和底层原理。
一、switch关键字的演进
1.1 传统switch(JDK 7之前)
// 只支持整型和枚举
public void traditionalSwitch(int day) {
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
default:
System.out.println("Other day");
}
}
1.2 JDK 7:支持String
// JDK 7开始支持String
public void stringSwitch(String day) {
switch (day) {
case "Monday":
System.out.println("工作日");
break;
case "Saturday":
case "Sunday":
System.out.println("周末");
break;
default:
System.out.println("其他");
}
}
1.3 JDK 12+:switch表达式
// JDK 12+ switch表达式
public String modernSwitch(int day) {
return switch (day) {
case 1 -> "Monday";
case 2 -> "Tuesday";
default -> "Other day";
};
}
// 多值匹配
public String multiValueSwitch(int day) {
return switch (day) {
case 1, 2, 3 -> "First three days";
case 4, 5 -> "Middle of week";
default -> "Weekend";
};
}
二、goto关键字
2.1 保留字状态
// goto是Java的保留字,但未实现
public void gotoDemo() {
// goto label; // ❌ 编译错误
}
2.2 替代方案
public void breakDemo() {
// 使用break和continue替代goto功能
outer:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (i * j > 30) {
break outer; // 跳出外层循环
}
}
}
}
三、参数传递机制
3.1 值传递
public class ParameterPassDemo {
// 基本类型:值传递
public void primitivePass(int x) {
x = 10; // 不会改变原值
}
// 引用类型:引用的值传递
public void referencePass(StringBuilder sb) {
sb.append(" World"); // 修改对象
sb = new StringBuilder("Hello"); // 不会影响原引用
}
public void test() {
int a = 5;
primitivePass(a);
System.out.println(a); // 5
StringBuilder str = new StringBuilder("Hello");
referencePass(str);
System.out.println(str); // "Hello World"
}
}
3.2 引用传递的本质
public class ReferenceDemo {
public void swap(Integer a, Integer b) {
// Integer是不可变对象
Integer temp = a;
a = b;
b = temp;
// 不会改变原始引用
}
public void test() {
Integer x = 10;
Integer y = 20;
swap(x, y);
System.out.println(x + " " + y); // 10 20
}
}
四、高频面试题
Q1: switch支持哪些类型?
答:
- JDK 7之前:byte, short, char, int
- JDK 7:增加String
- JDK 12+:switch表达式更灵活
Q2: Java中是值传递还是引用传递?
答:
- Java只有值传递
- 对于基本类型,传递值的副本
- 对于引用类型,传递引用的副本
Q3: goto为什么是保留字?
答:
- 为未来可能的语言特性保留
- 鼓励使用更结构化的控制流
- break和continue提供了类似功能
Q4: switch表达式有什么优势?
答:
- 简化代码
- 支持多值匹配
- 可以直接返回值
- 减少break语句
Q5: 为什么说Java是值传递?
答:
- 传递的始终是值的副本
- 对于基本类型,是值本身的副本
- 对于引用类型,是引用值的副本
五、最佳实践
✅ 推荐做法
// 1. 使用现代switch
public String getWeekDay(int day) {
return switch (day) {
case 1, 2, 3, 4, 5 -> "工作日";
case 6, 7 -> "周末";
default -> "无效日期";
};
}
// 2. 避免复杂的控制流
public void processData(List<String> data) {
data.forEach(this::processItem);
}
// 3. 谨慎处理参数
public void updateUser(User user) {
if (user == null) return;
// 处理用户
}
❌ 避免做法
// 1. 避免过度使用break
public void complexSwitch(int value) {
switch (value) {
case 1:
// 大量重复代码
break;
case 2:
// 重复代码
break;
}
}
// 2. 不要依赖goto
public void badControlFlow() {
// 避免使用类似goto的复杂控制流
}
相关链接
记忆口诀
switch演进有章法,String枚举来加强
goto保留有深意,结构化控制显真颜
值传递一脉相承,引用副本不改变
参数传递要小心,对象状态需谨防
⬅️ super与this关键字 🏠 00-Java ➡️ Class对象与反射机制
💬 评论