请原谅我的无知.我无法理解以下看似相似的代码行之间的区别.
final int num1 = 1;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)
我们去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).
所以原始int值2是一个常量表达式.你可以做到
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标签.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |