其他关键字

核心概念

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对象与反射机制