以下两行java代码有什么区别?

时间:2014-03-29 21:32:47

标签: java switch-statement

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

  1. final int num1 = 1;
  2. final int num2; num2 = 2;
  3. 是什么让num2没有资格获得切换案例的常量?

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

3 个答案:

答案 0 :(得分:7)

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

SwitchLabel:
    case ConstantExpression :
    case EnumConstantName :
    default :

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

  

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

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

因此原始int2是一个常量表达式。你可以做到

switch {
    case 2:
}

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

  

空白 finalfinal变量,其声明缺少初始值设定项。   [...]

     

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

因此,最后一个引用是指非空白 final变量,即。一个有初始化程序的人。

所以

final int num1 = 1;

是一个常量变量。

final int num2; 
num2 = 2;

不是,因此不能用于case标签。

答案 1 :(得分:0)

所以,回答你的问题: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();

答案 2 :(得分:-2)

在num1中你立即初始化它,在num2你不马上,你稍后将它分配给它