当前位置: 首页 > 知识库问答 >
问题:

为什么Java中的Switch语句可以包含最后一个变量?

毋举
2023-03-14

为什么Java中的Switch语句可以包含一个FINAL变量作为CASE?##

在我检查过的JDK7中,值不能重新分配给最终变量,如下所示。但是,为什么即使不能重新分配最终变量“x”的值,最终变量“x”也可以包含在Switch语句中?

为什么即使Oracle定义Java编译器将最终变量作为初始化的值而不是变量名,也可以这样做?http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4

请告诉我这是Java编译器的技术错误,还是有异常或特殊用途检查Switch语句中最终变量的大小写?

class Example{
    public static void main(String args[]){
        final int x=100;
        //x=200;    //error: cannot assign a value to final variable x

        //The below piece of code compiles
        switch(x){
            case 200: System.out.println("200");
            case 300: System.out.println("300");
        }

    }
}

共有3个答案

狄兴邦
2023-03-14

那么,您可以在函数中传递一个final参数:

//the function doesn't know what x  value is,
//but it knows that it can't modify its value
public someFunction(final int x) {

    x += 1; //compiler error
    switch(x) {
        case 200: System.out.println("200");
            break;
        case 300: System.out.println("300");
            break;
    }
}

//the function doesn't know what x value is,
//but it knows that it can modify it
//for internal usage
public someOtherFunction(int x) {

    switch(x) {
        case 200:
            x += 200;
            break;
        case 300:
            x += 300;
            break;
    }
    System.out.println(x);
}
茹正初
2023-03-14
switch(x){
    case 200: System.out.println("200"); break;
    case 300: System.out.println("300");
}

本质上是指

if (x == 200)
  System.out.println("200");
else if (x == 300)
  System.out.println("300");

它只是比较,而不是赋值,所以不能修改x这个事实无关紧要。

从技术上讲,您的示例将有点不同(因为您没有中断):

if (x == 200)
  System.out.println("200");
if (x == 200 || x == 300)
  System.out.println("300");

或者类似的。

x永远不能是200300这一事实不会使代码无法编译。然而,它可能允许Java优化开关语句。

宰父阳焱
2023-03-14

这种情况怎么办?

public class Foo
{
    private final int x;

    public Foo(int x){this.x = x;}

    public void boo()
    {
        switch(x)
        {
            case 200: System.out.println("200");
            case 300: System.out.println("300");
        }
    }
}

或者这个:

public static void doSomething(final int x)
{
    switch(x)
    {
        case 200: System.out.println("200");
        case 300: System.out.println("300");
    }
}
 类似资料:
  • 问题内容: 如果一个元组是不可变的,那么为什么它可以包含可变项呢? 似乎矛盾的是,当可变项(例如列表)确实被修改时,它所属的元组保持不变。 问题答案: 这是一个很好的问题。 关键的见解是,元组无法知道其中的对象是否可变。使对象可变的唯一方法是拥有一种更改其数据的方法。通常,无法检测到此情况。 另一个见解是Python的容器实际上不包含任何东西。相反,它们保留对其他对象的引用。同样,Python的变

  • 问题内容: 在 Java 7中 ,对象可以位于语句的表达式中。有人可以从官方文档中解释以下声明吗? 与使用链式if-then-else语句相比,Java编译器通常从使用 String对象的 switch语句生成更有效的字节码。 问题答案: Java代码 具有一个类的两个版本,例如 与: 与: 字节码 让我们看一下字节码。获取版本的字节码: 获取版本的字节码: 结论 在第一个版本中,通过为每个条件调

  • 我正在寻找一种使用单个开关处理两个字符串的方法,我认为这在Java中是不可能的。 这里有一些伪代码,我只想用开关来实现。

  • 问题内容: 为什么会出现这种错误?如果我愿意,一切都会正常。 问题答案: 可能尚未初始化,可以分配多个值。在您的示例中,它显然已初始化,但是编译器可能不知道(而且也不知道)。想像: 编译器需要中的常量,但的值取决于某些外部变量。

  • 本文向大家介绍Java中的Switch语句,包括了Java中的Switch语句的使用技巧和注意事项,需要的朋友参考一下 switch语句允许针对值列表对变量进行相等性测试。每个值称为一个案例,并针对每种情况检查要打开的变量。首先让我们看一下语法- 以下是适用于Java中switch语句的规则- switch语句中使用的变量只能是整数,可转换整数(字节,短整数,字符),字符串和枚举。 开关内可以有任

  • 问题内容: 为什么下面的代码: 给出错误: 在循环外继续 问题答案: 失败是switch语句的标准行为,因此,在switch语句中使用Continue没有意义。Continue语句仅在for / while / do..while循环中使用。 根据我对您意图的理解,您可能想写: 我还建议您将默认条件放在最后。 编辑:continue语句不能在switch语句中使用并不完全正确。(带有理想标记的)