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

8 java switch-statement

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

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

什么使num2不符合开关案件的条件不变?

    switch (expression) {
        case num1:
            System.out.println("Case A");
        case num2:
            System.out.println("Case B");
    }
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 7

我们去Java语言规范.一个switch语句的case标签定义

SwitchLabel:
    case ConstantExpression :
    case EnumConstantName :
    default :
Run Code Online (Sandbox Code Playgroud)

你的num变量并不是指一个enum常量名,所以让我们忽略它.什么是ConstantExpressions?JLS再次定义它

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

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

所以原始int2是一个常量表达式.你可以做到

switch {
    case 2:
}
Run Code Online (Sandbox Code Playgroud)

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

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

原始类型或类型的变量String,即final,用一个编译时间常量表达式(§15.28)初始化,被称为恒定变量.

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

所以

final int num1 = 1;
Run Code Online (Sandbox Code Playgroud)

是一个常数变量.

final int num2; 
num2 = 2;
Run Code Online (Sandbox Code Playgroud)

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