【问题标题】:What is the difference between the two following lines of java code? [duplicate]以下两行java代码有什么区别? [复制]
【发布时间】:2014-03-29 21:32:47
【问题描述】:

请原谅我的无知。我无法理解以下看似相似的代码行之间的区别。

  1. final int num1 = 1;
  2. final int num2;num2 = 2;

是什么让 num2 不符合 switch case 常量的条件?

    switch (expression) {
        case num1:
            System.out.println("Case A");
        case num2:
            System.out.println("Case B");
    }

【问题讨论】:

  • 你能告诉我们你是如何使用它的吗?只要在开启之前声明并初始化 num2 应该没有问题。
  • 这里的答案和 cmets 中的讨论可能会有所帮助:stackoverflow.com/questions/16255270/… 也将其标记为重复。
  • 是的,this 就是答案。 num1 是编译时常量,而 num2 不是。
  • @NicolásCarlo 是不是说num2在编译时没有赋值?
  • @Phoenix 是的,num2 未在编译时分配。它是在运行时完成的。你现在清楚了吗?

标签: java switch-statement


【解决方案1】:

我们去 Java 语言规范。 switch 语句的 case 标签定义为

SwitchLabel:
    case ConstantExpression :
    case EnumConstantName :
    default :

您的num 变量不是指enum 常量名称,所以让我们忽略它。什么是ConstantExpressions? JLS 再次定义它

编译时常量表达式是表示值的表达式 原始类型或 String 不会突然完成并且是 仅使用以下内容组成:

  • 原始类型的文字和字符串类型的文字
  • [...]
  • 引用常量变量(§4.12.4)的简单名称(§6.5.6.1)。

所以原始int2 是一个常量表达式。你可以这样做

switch {
    case 2:
}

现在我们想知道final常量变量的使用关系。

空白 final 是一个 final 变量,其声明缺少初始化程序。 [...]

原始类型或String类型的变量,即final和 用编译时常量表达式(§15.28)初始化,是 称为常量变量

所以最后一个引号是指一个非空白 final 变量,即。一个有初始化器的。

所以

final int num1 = 1;

是一个常量变量。

final int num2; 
num2 = 2;

不是,因此不能在case 标签中使用。

【讨论】:

    【解决方案2】:

    所以,回答你的问题:num1 是编译时常量,所以编译器基本上可以用1 替换它:

    switch(whatever) {
        case num1: // will produce same bytecode as
    
        case 1: // num1 was replaced by compiler 
    
    }
    

    编译器不能假设 num2 相同,正如简单示例 here 所解释的那样

    注意,num1 也会有同样的问题,你有没有用非常量初始化它,例如:int num1 = new Random().nextInt();

    【讨论】:

      【解决方案3】:

      在 num1 中您立即初始化它,在 num2 中您不立即对其进行初始化,稍后将其分配给它

      【讨论】:

      • 天亮如白昼。但是 num2 在 switch case 中不能作为常量有什么意义呢?
      • @Phoenix 这是因为编译器和 switch 语句是类型敏感的,通过完成它可以确保它不能改变值或类型。就像你在 jcombobox 上使用它一样,你必须在运行 switch 语句之前将框指定为最终的
      • 我不买那个解释...问题很好,这个解释缺乏参考(可能是对 JLS)
      猜你喜欢
      • 2013-08-29
      • 2013-12-03
      • 1970-01-01
      • 2014-03-21
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多