请原谅我的无知。我无法理解以下看似相似的代码行之间的区别。
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");
}
答案 0 :(得分:7)
我们去的Java语言规范。 switch
语句的case
标签定义为
SwitchLabel:
case ConstantExpression :
case EnumConstantName :
default :
您的num
变量不是指enum
常量名称,所以让我们忽略它。什么是ConstantExpressions
? JLS再次定义它
编译时常量表达式是表示值的表达式 原始类型或
String
不突然完成的,是 仅使用以下内容撰写:
- 原始类型的文字和String类型的文字
- [...]
- 简单名称(§6.5.6.1)引用常量变量(§4.12.4)。
因此原始int
值2
是一个常量表达式。你可以做到
switch {
case 2:
}
现在我们想知道使用final
和常量变量的关系。
空白
final
是final
变量,其声明缺少初始值设定项。 [...]基本类型或类型
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你不马上,你稍后将它分配给它