--- title: "04-其他关键字" created: 2025-11-26 tags: - Java --- # 其他关键字 ## 核心概念 Java中还有一些重要的关键字,它们在特定场景下发挥着关键作用。本文将深入探讨这些关键字的使用方法、注意事项和底层原理。 --- ## 一、switch关键字的演进 ### 1.1 传统switch(JDK 7之前) ```java // 只支持整型和枚举 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 ```java // 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表达式 ```java // 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 保留字状态 ```java // goto是Java的保留字,但未实现 public void gotoDemo() { // goto label; // ❌ 编译错误 } ``` ### 2.2 替代方案 ```java 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 值传递 ```java 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 引用传递的本质 ```java 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是值传递? **答:** - 传递的始终是值的副本 - 对于基本类型,是值本身的副本 - 对于引用类型,是引用值的副本 --- ## 五、最佳实践 ### ✅ 推荐做法 ```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 data) { data.forEach(this::processItem); } // 3. 谨慎处理参数 public void updateUser(User user) { if (user == null) return; // 处理用户 } ``` ### ❌ 避免做法 ```java // 1. 避免过度使用break public void complexSwitch(int value) { switch (value) { case 1: // 大量重复代码 break; case 2: // 重复代码 break; } } // 2. 不要依赖goto public void badControlFlow() { // 避免使用类似goto的复杂控制流 } ``` --- ## 相关链接 --- ## 记忆口诀 ``` switch演进有章法,String枚举来加强 goto保留有深意,结构化控制显真颜 值传递一脉相承,引用副本不改变 参数传递要小心,对象状态需谨防 ``` --- ⬅️ [[03-super与this关键字|super与this关键字]] 🏠 [[00-Java|00-Java]] ➡️ [[01-Class对象与反射机制|Class对象与反射机制]]